elf - 如何从 ELF 二进制文件中删除程序头

标签 elf

我想编写一个实用程序来从 ELF 二进制文件中删除程序头。例如,当我运行 readelf -l/my/elf 时,我会得到所有程序头的列表:PHDR INTERP ... GNU_STACK GNU_RELRO。当我运行我的实用程序时,我想以相同的顺序恢复所有相同的程序头,减去我删除的那个。有没有比从头开始重新创建整个 ELF 更简单的方法,跳过不需要的标题?

最佳答案

Is there any easier way to do this than recreated the entire ELF from scratch



当然:程序头在 ehdr.e_phoff 给定的偏移处形成一个固定记录表,包含 .e_phnum .e_phentsize 的条目字节。

要删除一个条目,只需将其余条目复制到它上面,然后递减 .e_phnum .这里的所有都是它的。

注意:删除一些条目可能会导致动态加载器崩溃。 GNU_STACK是唯一可以删除而不会造成太大伤害的标题(我能想到的)。

更新:

是的,设置 .p_typePT_NULL是另一种(更简单的)方法。但是这些条目通常不会出现,您可能会发现某些系统中 PT_NULL将在加载器(或其他程序)中触发断言。

最后,添加一个新的Phdr可能很棘手。通常没有空间来扩展表(因为它后面紧跟着一些其他数据,例如 .text )。您可以将表重定位到文件末尾,并设置 .e_phoff.e_phnum对应于新表,但许多程序期望整个 Phdr要在运行时加载和可用的表,这不容易安排,因为文件末尾的新位置不会被任何 PT_LOAD“覆盖”。部分。

关于elf - 如何从 ELF 二进制文件中删除程序头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5877492/

相关文章:

linux - 在运行时读取加载的共享对象的 ELF header

c - 加载原始二进制文件

x86 - 为什么编译器将数据放在PE和ELF文件的.text(code)部分中,并且CPU如何区分数据和代码?

arm - 如何区分elf文件中的thumb指令和a​​rm指令?

linux - 如何获取ELF文件的A值?

elf - 手动创建的 ELF 可执行文件因 SIGSEGV 而崩溃

c - 使用 DWARF 全局变量的位置(和重定位)

gcc - ld -Ttext 生成具有 64KB 填充的可执行文件

unix - 为什么 ELF 可执行文件可以有 4 个 LOAD 段?

c++ - 符号可见性,异常,运行时错误