PT_INTERP 可执行 ELF 中的段顺序

PT_INTERP segment order in executable ELF

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

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

1) 此条目在程序中的顺序 Header Table,

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

或 3) 两者。

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

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

我相信:

  1. 答案是 1) -- PT_INTERP 必须在程序头 PT_LOAD 之前 table.
  2. 此要求很可能已过时(至少在 Linux 上)——内核遍历 fs/binfmt_elf.c 中的 所有 程序头以查找 PT_INTERP,并且似乎并不关心 在 table 中出现的位置。

In my linker I would like to concatenate INTERP path string with .strtab and .shstrtab contents somewhere near the end of file

这应该可以正常工作(但我还没有尝试过)。