c++ - 如何覆盖静态二进制文件的 C++ 启动函数?

标签 c++ gcc glibc

LD_PRELOAD 技巧有助于在运行时动态链接二进制文件,但对于静态链接的二进制文件将失败。

我想覆盖一些 C++ 启动函数(比如更改 __libc_start_main__libc_csu_init 和其他一些函数的代码)。我正在考虑直接从 glibc 更改代码,但我想确保没有其他方法可以解决问题。

除了从 glibc 更改代码并重新构建它之外,还有其他方法可以覆盖 C++ 启动函数吗?

最佳答案

根据您要排除的内容,您需要 -nostartfiles-nodefaultlibs-nostdlib。然后您将添加自己的替代品。如果您的替换不完整(可能),您将添加原始库,例如 glibc 您自己的库之后。链接器按列出的顺序使用它们,因此您的覆盖现在获得优先权。

隐式链接的库就像它们首先出现一样,这就是为什么您需要专门排除它们然后再将它们添加回来。另见 g++, static initialization and -nostdlib

关于c++ - 如何覆盖静态二进制文件的 C++ 启动函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50779516/

相关文章:

c - arm-none-eabi-gcc 4.8 段错误 (ChibiOS-RT)

c - 套接字事件如何传播/转换为 epoll?

c++ - 按值传递共享指针并作为基类参数接受是如何工作的?

python - 在多线程中调用 Py_Initialize()

c++ - 不同 gcc 版本的 bool 到 string 转换的不同行为

gcc - 如何让 GCC 在使用内部函数时使用两个以上的 SIMD 寄存器?

c++ - 类的动态数组

c++ - Clang 上的重载运算符歧义,但 GCC 上没有,哪个是正确的?

c - 为什么 glibc 的 sscanf 在 Linux 上比 fscanf 慢很多?

c - getenv() 的全局变量?