我有一个mytest
使用 Clang 和 bfd/lld 创建的二进制可执行文件,为了让它正常工作,我必须将环境变量传递ASAN_OPTIONS="use_sigaltstack=1"
给它,但我想避免每次我想运行时都必须手动输入从命令行执行。
当然,我可以创建一个包装脚本,但这会增加更多的复杂性。
有没有办法在创建二进制文件时将环境变量及其值附加到二进制文件,以便在执行开始时自动设置它?
在我的代码中设置环境变量为时已晚,因为 Asan 在我的代码开始运行之前读取了环境变量。
我有一个mytest
使用 Clang 和 bfd/lld 创建的二进制可执行文件,为了让它正常工作,我必须将环境变量传递ASAN_OPTIONS="use_sigaltstack=1"
给它,但我想避免每次我想运行时都必须手动输入从命令行执行。
当然,我可以创建一个包装脚本,但这会增加更多的复杂性。
有没有办法在创建二进制文件时将环境变量及其值附加到二进制文件,以便在执行开始时自动设置它?
在我的代码中设置环境变量为时已晚,因为 Asan 在我的代码开始运行之前读取了环境变量。
首先要做的事情:对于 Asan,推荐的方法是实施__asan_default_options
(如Asan wiki中所述)。
通常,您可以通过在程序启动时调用setenv
/来重置环境变量。putenv
但是,如果在初始化代码中使用变量(如 Asan 的情况),这将无济于事。
您还可以提供一个自定义的 hacky 实现,否则getenv
它将返回所需的值"ASAN_OPTIONS"
并转发到正常的 Glibc 实现(通过 获得dlsym
)。但这对 Asan 也无济于事,因为它通过读取来获取环境变量/proc/self/environ
。
另一种 hacky 方法是setenv
通过exec
系统调用重新启动可执行文件。这可能会改变程序语义,因此不推荐。由于缺乏更好的解决方案,Asan 在 OSX 上使用了这种方法。
我想避免每次我想从命令行运行可执行文件时都必须手动输入。
实现此目的的一种方法是在execv
发现ASAN_OPTIONS
缺少二进制文件时重新生成二进制文件。即:main
检查是否ASAN_OPTIONS
通过getenv
. 如果没有,请调用setenv(ASAN_OPTIONS, ...)
and execv(argv[0], argv)
。
当心:这会使二进制文件难以调试。