我想编写一个实用程序来从 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_type
至 PT_NULL
是另一种(更简单的)方法。但是这些条目通常不会出现,您可能会发现某些系统中 PT_NULL
将在加载器(或其他程序)中触发断言。最后,添加一个新的
Phdr
可能很棘手。通常没有空间来扩展表(因为它后面紧跟着一些其他数据,例如 .text
)。您可以将表重定位到文件末尾,并设置 .e_phoff
和 .e_phnum
对应于新表,但许多程序期望整个 Phdr
要在运行时加载和可用的表,这不容易安排,因为文件末尾的新位置不会被任何 PT_LOAD
“覆盖”。部分。
关于elf - 如何从 ELF 二进制文件中删除程序头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5877492/