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

时间:2011-05-04 01:22:50

标签: elf

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

2 个答案:

答案 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)可能会有所帮助。