是否可以在运行时在 C 中动态修改符号表(在 Linux 上以 elf 格式)?
我的最终目标如下:
在某些函数中说foo
,我想将malloc
函数覆盖到我的自定义处理程序my_malloc
。但是在外面foo
,任何malloc
人仍然应该像在 glibc 中那样调用 malloc。
注意:这与在整个程序执行期间LD_PRELOAD
将覆盖的不同。malloc
是否可以在运行时在 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 import slot malloc@plt
。该插槽在第一次调用时被解析为 glibc malloc
(从程序中的任何位置,假设您没有使用LD_BIND_NOW=1
或类似的)。解决该槽后,对符号表的任何进一步修改都将无效。
你没有说foo
你有多少控制权。
如果你可以重新编译它,问题就变得微不足道了:
#define malloc my_malloc
int foo() {
// same code as before
}
#undef malloc
如果您收到预编译的foo.o
,则将其与 链接my_malloc.o
,并且您希望将所有调用从内部重定向foo.o
到malloc
,my_malloc
这实际上在对象级别(即在最终链接之前)非常简单。
您所要做的就是检查foo.o
搬迁记录,并将“将外部地址malloc
放在此处”的内容更改为“将外部地址放在my_malloc
此处”。
如果foo.o
除此之外还包含其他功能foo
,则将重定位重写限制为仅内部重定位非常简单foo
。