gpt4 book ai didi

symbols - 在运行时动态修改符号表(C语言)

转载 作者:行者123 更新时间:2023-12-02 16:43:37 25 4
gpt4 key购买 nike

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

我的最终目标是:

在某些函数(如 foo)内,我想将 malloc 函数重写为我的自定义处理程序 my_malloc。但在 foo 之外,任何 malloc 仍应像 glibc 中那样调用 malloc。

注意:这与LD_PRELOAD不同,后者会在整个程序执行期间覆盖malloc

最佳答案

Is it possible to dynamically modify symbol table at runtime in C (in elf format on Linux)?

理论上这是可能的,但实际上很难做到。

Inside certain function say foo, I want to override malloc function to my custom handler my_malloc. But outside foo, any malloc should still call to malloc as in glibc.

修改符号表(即使可能)不会让您达到预期的目标。

所有来自 ELF 二进制文件内任何地方的调用(假设 foo 位于主可执行文件中),解析为相同 PLT 导入槽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的地址放在这里”更改为“将外部malloc的地址放在这里”外部 my_malloc 此处”。

如果 foo.o 包含除 foo 之外的其他函数,则将重定位重写限制为仅 foo 内的重定位非常简单。

关于symbols - 在运行时动态修改符号表(C语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30147018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com