Ric*_*ard 7 symbols elf ld-preload
是否可以在运行时用C动态修改符号表(在Linux上以elf格式)?
我最终的目标是:
在某些函数内部说foo,我想覆盖malloc我的自定义处理程序的函数my_malloc.但在外面foo,任何人malloc都应该像glibc一样调用malloc.
注意:这与在整个程序执行期间LD_PRELOAD覆盖的不同malloc.
是否可以在运行时用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.o从malloc到my_malloc,这其实很简单对象级别做(即前最后一个环节).
你所要做的就是通过foo.o重新安置记录,并将那里说"把外部地址放在malloc这里"改为"把外部地址放在my_malloc这里".
如果还foo.o包含其他函数foo,则将重定位重写限制为仅包含内部重定位非常简单foo.