linux - 可执行 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 规范,因为我掌握了它。
解决方案
我相信:
- 答案是 1) --在程序头表中
PT_INTERP
必须在 s 之前。PT_LOAD
- 这个要求很可能已经过时了(至少在 Linux 上)——内核遍历fs/binfmt_elf.c中的所有程序头来寻找,并且似乎并不关心这个条目出现在表中的哪个位置。
PT_INTERP
在我的链接器中,我想在文件末尾附近的某处将 INTERP 路径字符串与 .strtab 和 .shstrtab 内容连接起来
这应该工作得很好(但我还没有尝试过)。
推荐阅读
- matlab - 记不清。为您的选项键入“帮助记忆”
- django - 打开 EDX - LMS:无法发送验证电子邮件
- jquery - 如何在 Spring Boot 应用程序中使用 jQuery 进行 AJAX 调用后刷新 div 标签?
- php - Laravel 5.8 PDF 上传
- node.js - 快速请求第二次触发
- reactjs - React + Mobx:不触发渲染
- c++ - C++ 中的未定义行为
- c# - 如何使用 Xamarin.Forms.iOS 在渲染器视图中更改 UIPickerView 文本颜色?
- elasticsearch - 合并两个聚合的结果
- c# - 创建结构化数据库并将其绑定到 ListView C#