linux - 有没有办法在 ELF 二进制文件开始执行时自动设置环境变量?

标签 linux clang elf address-sanitizer lld

我有一个二进制可执行文件 mytest,是用 Clang 和 bfd/lld 创建的,为了让它正常工作,我必须传递环境变量 ASAN_OPTIONS="use_sigaltstack=1" 到它,但我想避免在每次我想从命令行运行可执行文件时手动键入它。

当然,我可以创建一个包装器脚本,但这会增加更多的复杂性。

有没有办法在创建二进制文件时将环境变量及其值附加到二进制文件,以便在执行开始时自动设置它?

在我的代码中设置环境变量为时已晚,因为 Asan 在我的代码开始运行之前读取了环境变量。

最佳答案

首先:对于 Asan,推荐的方法是实现 __asan_default_options(如 Asan wiki 中所述)。

一般来说,您可以在程序启动时通过调用setenv/putenv 来重置环境变量。但是,如果在初始化代码中使用变量(如 Asan 的情况),这将无济于事。

您还可以提供 getenv 的自定义 hacky 实现,它将返回 "ASAN_OPTIONS" 所需的值并转发到正常的 Glibc 实现(通过 dlsym) 否则。但这对 Asan 也无济于事,因为它通过读取 /proc/self/environ 获取环境变量。

另一种 hacky 方法是 setenv 然后通过 exec 系统调用重新启动可执行文件。这可能会改变程序语义,因此不推荐。由于缺乏更好的解决方案,阿三在 OSX 上使用了这种方法。

关于linux - 有没有办法在 ELF 二进制文件开始执行时自动设置环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58177057/

相关文章:

python - 在没有 sudo 权限的 Linux 系统上安装 Python TA-lib 包时出错

c++ - 是否可以使用 Clang 3.1 和 VC11 Beta header 编译 C++ 源代码?

vim - 如何在 Ubuntu 中安装 clang-format?

linux - 如何限制32位应用程序在64位Linux上的地址空间为3GB?

linux - 无法为我的 .bashrc 实现别名/替换功能

php - 如何在 linux 上的 php 中启用 --enable-soap?

linux - 无需登录即可在Linux中运行磁盘空间检查脚本

c - Mavericks : library not found for -lwfdb

linux - ELF header ,偏移量 06h 和 14h 是否重复?

c - 如何将可执行入口点的名称从 main 更改为其他名称?