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) --
PT_INTERP
必须在程序头 PT_LOAD
之前 table.
- 此要求很可能已过时(至少在 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
这应该可以正常工作(但我还没有尝试过)。
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) --
PT_INTERP
必须在程序头PT_LOAD
之前 table. - 此要求很可能已过时(至少在 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
这应该可以正常工作(但我还没有尝试过)。