首页 > 解决方案 > 可执行 ELF 中的 PT_INTERP 段顺序

问题描述

ELF 规范http://www.skyfree.org/linux/references/ELF_Format.pdf 在第 2-3 页说广告 Program Header entry with p_type=PT_INTERP它必须在任何可加载段条目之前

我想知道这条规则是否涉及

1) 该条目在 Program Header Table 中的顺序,

或 2) 文件布局中原始内容的位置(带有实际解释器路径的字符串),

或 3) 两者。

GNU 链接器ld似乎遵循 3)。ld生成的程序头生成 PT_PHDR,然后是 PT_INTERP,然后是 PT_LOAD,实际的解释器字符串是在程序头之后,在任何代码和数据内容之前生成的。它还(不必要地?)在 sh_type=SHT_PROGBITS 的 Section Headers 中生成特殊的 section entry .interp,它复制了程序 header entry PT_INTERP。

在我的链接器中,我想在文件末尾附近的某处将 INTERP 路径字符串与.strtab.shstrtab内容连接起来,因为所有这三个部分都是字节对齐的,这样可以节省对齐内容并减小输出文件的大小。但是,我不确定这是否不违反 ELF 规范,因为我掌握了它。

标签: linuxlinkerldelf

解决方案


我相信:

  1. 答案是 1) --在程序头表中PT_INTERP必须在 s 之前。PT_LOAD
  2. 这个要求很可能已经过时了(至少在 Linux 上)——内核遍历fs/binfmt_elf.c中的所有程序头来寻找,并且似乎并不关心这个条目出现在表中的哪个位置。PT_INTERP

在我的链接器中,我想在文件末尾附近的某处将 INTERP 路径字符串与 .strtab 和 .shstrtab 内容连接起来

这应该工作得很好(但我还没有尝试过)。


推荐阅读