【问题标题】:Dynamically modify symbol table at runtime (in C)在运行时动态修改符号表(在 C 中)
【发布时间】:2015-07-20 17:43:20
【问题描述】:

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

我的最终目标如下:

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

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

【问题讨论】:

    标签: symbols elf ld-preload


    【解决方案1】:

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

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

    在某个函数内部说foo,我想将malloc 函数覆盖到我的自定义处理程序my_malloc。但在foo 之外,任何malloc 仍应像在glibc 中那样调用malloc

    修改符号表(即使有可能)不会让你达到你想要的目标。

    All 从您的 ELF 二进制文件中的 anywhere 调用(假设 foo 在主可执行文件中),解析为 same 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.o内部的所有调用从malloc重定向到my_malloc,这实际上很简单对象级别(即在最终链接之前)。

    您只需查看foo.o的搬迁记录,将“将外部malloc的地址放在此处”的记录更改为“将外部my_malloc的地址放在此处”。

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

    【讨论】:

    • > 将“将外部 malloc 的地址放在此处”的内容更改为“将外部 my_malloc 的地址放在此处”。任何工具,比如 gcc,可以做到这一点?
    • 我知道这是一个非常古老的答案,但是我们也需要在运行时更改符号表,但在我们的例子中,它是在动态加载的库上替换 malloc,有没有办法做到这一点?
    • @GuyKorland 你应该问一个单独的问题,清楚地说明你的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多