【问题标题】:PT_INTERP segment order in executable ELF可执行 ELF 中的 PT_INTERP 段顺序
【发布时间】:2020-03-23 14:46:14
【问题描述】:

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

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

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

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

或 3) 两者兼而有之。

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

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

【问题讨论】:

    标签: linux linker ld elf


    【解决方案1】:

    我相信:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 2015-06-30
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 2012-12-09
      • 2017-11-18
      • 2019-09-21
      • 2015-09-10
      相关资源
      最近更新 更多