在运行时动态修改符号表(在C中)

Ric*_*ard 7 symbols elf ld-preload

是否可以在运行时用C动态修改符号表(在Linux上以elf格式)?

我最终的目标是:

在某些函数内部说foo,我想覆盖malloc我的自定义处理程序的函数my_malloc.但在外面foo,任何人malloc都应该像glibc一样调用malloc.

注意:这与在整个程序执行期间LD_PRELOAD覆盖的不同malloc.

Emp*_*ian 6

是否可以在运行时用C动态修改符号表(在Linux上以elf格式)?

从理论上讲,这是可能的,但在实践中,这样做太难了.

在某些函数内部说foo,我想覆盖malloc我的自定义处理程序的函数my_malloc.但在外面foo,任何人malloc都应该malloc像glibc一样打电话.

修改符号表(即使可能)也无法达到您想要的目标.

来自ELF二进制文件内任何位置的所有调用(假设foo在主可执行文件中),解析为相同的 PLT导入槽malloc@plt.该插槽malloc在第一次调用时被解析为glibc (从程序中的任何位置开始,假设您没有使用LD_BIND_NOW=1或类似).在解决了该槽之后,对符号表的任何进一步修改都将无效.

你没有说foo你有多少控制权.

如果你可以重新编译它,问题变得微不足道:

#define malloc my_malloc
int foo() {
  // same code as before
}
#undef malloc
Run Code Online (Sandbox Code Playgroud)

如果你递了预编译foo.o,你与它联系起来my_malloc.o,和你想从里面所有呼叫重定向foo.omallocmy_malloc,这其实很简单对象级别做(即前最后一个环节).

你所要做的就是通过foo.o重新安置记录,并将那里说"把外部地址放在malloc这里"改为"把外部地址放在my_malloc这里".

如果还foo.o包含其他函数foo,则将重定位重写限制为仅包含内部重定位非常简单foo.