【问题标题】:Replacing the symbol name in the symbol table to a new longer name in relocatable ELF object file将符号表中的符号名称替换为可重定位 ELF 目标文件中的新更长名称
【发布时间】:2017-05-18 04:46:47
【问题描述】:

这是一个可重定位的 ELF 对象文件,不是完全链接的 ELF 或 ELF 共享库。

目前如果有程序如:

main.c:
    int main() {
        foo();
        return 0;
    }

并使用 gcc -c main.c 进行编译 它将生成一个 main.o

我想要完成的是将 foo 的调用替换为“foolfood”(更长的名称)AFTER 目标文件已经创建。

因为目前如果我们超过 foo

的长度 3,可重定位的 ELF 将被破坏

任何见解都会有所帮助。

提前致谢。

【问题讨论】:

    标签: c unix elf object-files


    【解决方案1】:

    我想要完成的是在对象文件已经创建之后,用“傻瓜或食物”(更长的名称)替换对 foo 的调用。

    这是很有可能的,但远非微不足道。

    首先,您需要将.symtab 部分复制到文件末尾,并将所需的字符串food\0 附加到它。

    其次,需要更新节表,将原来.symtab的偏移量和长度替换为上一步添加的节的偏移量和大小。

    最后,您需要找到符号(在.symtab 部分中)并使用第一步添加的food 字符串的偏移量更新其st_name

    仅此而已。

    【讨论】:

    • “仅此而已”——精妙的轻描淡写!
    • 我会尝试类似的方法,让你们(@JonathanLeffler + Employed Russian)知道进展如何,感谢您的帮助
    • @Seoul:在一些(大多数?)带有 ELF 的系统上,有一个 libelf 具有便于读取 ELF 目标文件的功能。我没用过;我不确定它在多大程度上简化了有效 ELF 目标文件的创建,但我希望支持存在。如果可用,请使用它——它会让您的生活更轻松。 (使用 Google 和“libelf”一词进行快速搜索会发现很多有用的 URL,并提到了“修改”。)
    • (@JonathanLeffler + Employed Russian),感谢您的帮助。我决定通过elf头,节头表,字符串表,然后使用elf.h而不是libelf更新符号表。