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

How to override c++ startup functions for static binaries?

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

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

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

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

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