我想编写一个实用程序来从ELF二进制文件中删除程序头。例如,当我运行readelf -l / my / elf时,我得到了所有程序头的列表:PHDR INTERP ... GNU_STACK GNU_RELRO。当我运行我的实用程序时,我希望以相同的顺序返回所有相同的程序头,减去我删除的那个。有没有比从头开始重新创建整个ELF更简单的方法,跳过不需要的标题?
答案 0 :(得分:2)
有没有比从头开始重建整个ELF更简单的方法
当然:程序头在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
段“覆盖”。
答案 1 :(得分:0)
GNU二进制文件描述符库(libbfd)可能会有所帮助。