ZHCADC4A September 2011 – March 2014
以下是程序标头和段。
p_align
如 System V ABI 中所述,可加载段在文件中对齐,以使其 p_vaddr(存储器中的地址)和 p_offset(文件中的偏移量)一致,模数为 p_align。对于 Linux ABI,p_align 指定为 0x1000。
PT_INTERP 段
PT_INTERP 段包含具有动态加载器的目标文件的名称。对于本文档中描述的 ELF 可执行文件,解释器通常为 ld.so。
只读段
共享对象和可执行文件必须包含具有读取+执行权限的 PT_LOAD 段,此段包含模块的程序代码和可共享常量。可共享常量是指任何不可写入并且其值不包含地址的对象。此段还包括加载和执行程序所需的 ELF 结构体,包括文件标头、PT_INTERP、PT_PHDR、PT_DYNAMIC、PT_NOTE(如果有)和 PT_PHATTR(如果有)段。
与位置相关的可执行文件可能具有其他包含未指定内容的只读段或读取+执行段。如果有多个此类段,则不允许它们之间存在 PC 相对应用。如果加载器对这些段进行重定位,则不需要保留它们相对于彼此的位置。
数据段
共享对象和可执行文件必须包含一个具有读取+写入权限的 PT_LOAD 段,此段包含模块的 DSBT、GOT 和读写数据。此段使用 DP 相对寻址进行寻址,因此标有 PF_C6000_DPREL 标志。
ELF 要求段中未初始化的数据位于所有初始化数据之后。不过,如果 DP 相对段同时包含未初始化的 near 数据(如 .bss)和已初始化的 far 数据(如 .fardata),则未初始化数据可能需要位于初始化数据之前才能处于 DP 范围内。在此情况下,链接器需要用 0 填充该段的未初始化部分。
共享对象和可执行文件可能具有额外的读取+写入段。为确保位置无关性,必须仅使用基于 GOT 的寻址来对这些段进行寻址。与位置相关的可执行文件可使用绝对寻址。
栈段
C6000 Linux ABI 遵循通用约定,定义一个使工具链能够指定可执行文件最小栈分配的附加段类型。
名称 | 值 | 注释 |
---|---|---|
PT_GNU_STACK | 0x6474E551 | 栈大小和权限 |
p_flags 成员可指定包含栈的段的权限,并用于指示栈是否可执行。
如果没有此标头,栈的大小和权限将保持未指定状态。
绑定段和只读段
Linux 可执行文件和共享对象不应包含节 14.1.3中所述的标记为绑定或只读的段。