Linux 有没有办法在ELF二进制文件开始执行时自动设置环境变量?
我有一个二进制可执行文件Linux 有没有办法在ELF二进制文件开始执行时自动设置环境变量?,linux,clang,elf,address-sanitizer,lld,Linux,Clang,Elf,Address Sanitizer,Lld,我有一个二进制可执行文件mytest,它是用Clang和bfd/lld创建的,为了让它正常工作,我必须将环境变量ASAN_OPTIONS=“use_sigaltstack=1”传递给它,但我希望避免每次我想从命令行运行可执行文件时都必须手动键入它 当然,我可以创建一个包装器脚本,但这会增加更多的复杂性 在创建二进制文件时,是否有方法将环境变量及其值附加到二进制文件,以便在执行开始时自动设置 在我的代码中设置环境变量为时已晚,因为Asan会在我的代码开始运行之前读取环境变量。第一件事:对于Asan
mytest
,它是用Clang和bfd/lld创建的,为了让它正常工作,我必须将环境变量ASAN_OPTIONS=“use_sigaltstack=1”
传递给它,但我希望避免每次我想从命令行运行可执行文件时都必须手动键入它
当然,我可以创建一个包装器脚本,但这会增加更多的复杂性
在创建二进制文件时,是否有方法将环境变量及其值附加到二进制文件,以便在执行开始时自动设置
在我的代码中设置环境变量为时已晚,因为Asan会在我的代码开始运行之前读取环境变量。第一件事:对于Asan,建议的方法是实现
\u Asan\u默认\u选项(如中所述)
通常,您可以通过在程序启动时调用setenv
/putenv
来重置环境变量。但如果在初始化代码中使用变量(Asan就是这样),这将不会有帮助
您还可以提供一个自定义的hacky实现getenv
,该实现将返回“ASAN_OPTIONS”
的所需值,并转发到正常的Glibc实现(通过dlsym
获得)。但这对Asan也没有帮助,因为它通过读取/proc/self/environ
来获取环境变量首先:对于Asan,建议的方法是实现\u Asan\u默认\u选项
(如中所述)
通常,您可以通过在程序启动时调用setenv
/putenv
来重置环境变量。但如果在初始化代码中使用变量(Asan就是这样),这将不会有帮助
您还可以提供一个自定义的hacky实现getenv
,该实现将返回“ASAN_OPTIONS”
的所需值,并转发到正常的Glibc实现(通过dlsym
获得)。但这对Asan也没有帮助,因为它通过读取/proc/self/environ
来获取环境变量
我希望避免每次从命令行运行可执行文件时都必须手动键入
实现这一点的一种方法是,如果发现缺少ASAN_选项,则重新执行二进制文件。也就是说:在main
中,检查是否通过getenv
设置了ASAN\u选项。如果没有,请调用setenv(ASAN_OPTIONS,…)
和execv(argv[0],argv)
注意:这使得二进制代码很难调试
我希望避免每次从命令行运行可执行文件时都必须手动键入
实现这一点的一种方法是,如果发现缺少ASAN_选项,则重新执行二进制文件。也就是说:在main
中,检查是否通过getenv
设置了ASAN\u选项。如果没有,请调用setenv(ASAN_OPTIONS,…)
和execv(argv[0],argv)
注意:这使得二进制代码很难调试。不,没有这样的东西。为什么不直接在.profile
中设置环境变量?另一个更改代码的选项,否?(使用putenv
:)@tmrlvi运行main()
之前可能需要设置变量,因为它控制着一个运行库。这个问题的答案在很大程度上取决于您是专门询问ASAN\u选项还是任意环境变量。不,没有这样的问题。为什么不直接在.profile
中设置环境变量?另一个更改代码的选项,否?(使用putenv
:)@tmrlvi在运行main()
之前可能需要设置变量,因为它控制着运行时库。这个问题的答案在很大程度上取决于您是专门询问ASAN_OPTIONS
还是任意环境变量。