【问题标题】:How to override c++ startup functions for static binaries?如何覆盖静态二进制文件的 C++ 启动函数?
【发布时间】:2018-06-10 00:01:00
【问题描述】:

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

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

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

【问题讨论】:

  • 这可能是特定于工具链的。是 GCC/GNU binutils 吗?
  • @MSalters 是的,我将使用 gcc。

标签: c++ gcc glibc


【解决方案1】:

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

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

【讨论】:

  • 所以如果我只覆盖几个函数,那么我可以覆盖它们并生成一个共享对象(在编译时链接)。那么其余的函数将在运行时由链接器直接解析?
  • 好吧,你仍然需要在构建时链接glibc。运行时链接器需要告知要加载哪些库,以及要在每个库中找到哪些函数,正是因为静态链接没有复制这些函数。
  • 在这种情况下,我将添加那些编译器标志,然后添加所有链接文件,确保我的文件是第一个覆盖这些函数的文件。这是你想说的吗?
  • @Rohit:是的,你明白了。
猜你喜欢
  • 2015-02-27
  • 2021-09-25
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多