是否可以在C运行时动态修改符号表(Linux上的elf格式)?
我的最终目标如下:
在某些函数里面说foo
,我想覆盖malloc
函数到我的自定义处理程序my_malloc
。但在外面foo
, any malloc
仍应像 glibc 中那样调用 malloc。
注意:这与LD_PRELOAD
这将覆盖malloc
在整个程序执行过程中。
是否可以在C运行时动态修改符号表(Linux上的elf格式)?
理论上这是可能的,但实际上却很难做到。
在某些函数里面说foo
,我想覆盖malloc
函数到我的自定义处理程序my_malloc
。但在外面foo
, any malloc
仍应致电malloc
就像在 glibc 中一样。
修改符号表(即使可能)not让您达到您想要的目标。
All来电来自anywhere在你的 ELF 二进制文件中(假设foo
在主可执行文件中),解析为samePLT导入槽malloc@plt
。该插槽已解析为 glibcmalloc
在第一次调用时(从程序中的任何位置,假设您没有使用LD_BIND_NOW=1
或类似)。解决该插槽后,对符号表的任何进一步修改都将具有没有效果.
你没说控制多少foo
你有。
如果你可以重新编译它,问题就变得微不足道了:
#define malloc my_malloc
int foo() {
// same code as before
}
#undef malloc
如果您收到预编译的foo.o
,您将其链接到my_malloc.o
,并且您希望从内部重定向所有呼叫foo.o
from malloc
to my_malloc
,这实际上在对象级别(即最终链接之前)非常简单。
你所要做的就是通过foo.o
重定位记录,并更改“放置外部地址”的记录malloc
这里“到”放置外部地址my_malloc
here".
If foo.o
除此之外还包含附加功能foo
,将重定位重写限制为仅内部的重定位非常简单foo
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)