7

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

我的最终目标如下:

在某些函数中说foo,我想将malloc函数覆盖到我的自定义处理程序my_malloc。但是在外面foo,任何malloc人仍然应该像在 glibc 中那样调用 malloc。

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

4

1 回答 1

6

是否可以在运行时在 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.omallocmy_malloc这实际上在对象级别(即在最终链接之前)非常简单。

您所要做的就是检查foo.o搬迁记录,并将“将外部地址malloc放在此处”的内容更改为“将外部地址放在my_malloc此处”。

如果foo.o除此之外还包含其他功能foo,则将重定位重写限制为仅内部重定位非常简单foo

于 2015-05-10T17:38:39.417 回答