Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 有没有办法在ELF二进制文件开始执行时自动设置环境变量?_Linux_Clang_Elf_Address Sanitizer_Lld - Fatal编程技术网

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
还是任意环境变量。