Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

程序头

可执行文件或共享目标文件的程序头表是一个结构数组。每种结构都描述了系统准备程序执行所需的段或其他信息。目标文件段包含一个或多个节,如段内容中所述。

程序头仅对可执行文件和共享目标文件有意义。文件使用 ELF 头的 e_phentsize 和 e_phnum 成员来指定其自己的程序头大小。

程序头具有以下结构。请参见 sys/elf.h

typedef struct {
        Elf32_Word      p_type;
        Elf32_Off       p_offset;
        Elf32_Addr      p_vaddr;
        Elf32_Addr      p_paddr;
        Elf32_Word      p_filesz;
        Elf32_Word      p_memsz;
        Elf32_Word      p_flags;
        Elf32_Word      p_align;
} Elf32_Phdr;

typedef struct {
        Elf64_Word      p_type;
        Elf64_Word      p_flags;
        Elf64_Off       p_offset;
        Elf64_Addr      p_vaddr;
        Elf64_Addr      p_paddr;
        Elf64_Xword     p_filesz;
        Elf64_Xword     p_memsz;
        Elf64_Xword     p_align;
} Elf64_Phdr;
p_type

此数组元素描述的段类型或解释此数组元素的信息的方式。Table 13–1 中指定了类型值及其含义。

p_offset

相对段的第一个字节所在文件的起始位置的偏移。

p_vaddr

段的第一个字节在内存中的虚拟地址。

p_paddr

段在与物理寻址相关的系统中的物理地址。由于此系统忽略了应用程序的物理地址,因此该成员对于可执行文件和共享目标文件具有未指定的内容。

p_filesz

段的文件映像中的字节数,可以为零。

p_memsz

段的内存映像中的字节数,可以为零。

p_flags

与段相关的标志。Table 13–2 中指定了类型值及其含义。

p_align

可装入的进程段必须具有 p_vaddr 和 p_offset 的同余值(以页面大小为模数)。此成员可提供一个值,用于在内存和文件中根据该值对齐各段。值 01 表示无需对齐。另外,p_align 应为 2 的正整数幂,并且 p_vaddr 应等于 p_offset(以 p_align 为模数)。请参见程序装入(特定于处理器)

某些项用于描述进程段。其他项则提供补充信息,并且不会构成进程映像。除非明确指定了顺序,否则段的各项可以任何顺序显示。下表中列出了定义的类型值。

表 13-1  ELF 段类型
名称
PT_NULL
0
PT_LOAD
1
PT_DYNAMIC
2
PT_INTERP
3
PT_NOTE
4
PT_SHLIB
5
PT_PHDR
6
PT_TLS
7
PT_LOOS
0x60000000
PT_SUNW_UNWIND
0x6464e550
PT_SUNW_EH_FRAME
0x6474e550
PT_LOSUNW
0x6ffffffa
PT_SUNWBSS
0x6ffffffa
PT_SUNWSTACK
0x6ffffffb
PT_SUNWDTRACE
0x6ffffffc
PT_SUNWCAP
0x6ffffffd
PT_HISUNW
0x6fffffff
PT_HIOS
0x6fffffff
PT_LOPROC
0x70000000
PT_HIPROC
0x7fffffff
PT_NULL

未使用。没有定义成员值。使用此类型,程序头表可以包含忽略的项。

PT_LOAD

指定由 p_filesz 和 p_memsz 描述的可装入段。文件中的字节会映射到内存段的起始位置。如果段的内存大小 (p_memsz) 大于文件大小 (p_filesz),则将多余字节的值定义为 0。这些字节跟在段的已初始化区域后面。文件大小不能大于内存大小。程序头表中的可装入段的各项按升序显示,并基于 p_vaddr 成员进行排列。

PT_DYNAMIC

指定动态链接信息。请参见动态节

PT_INTERP

指定要作为解释程序调用的以空字符结尾的路径名的位置和大小。对于动态可执行文件,必须设置此类型。此类型可出现在共享目标文件中。此类型不能在一个文件中多次出现。此类型(如果存在)必须位于任何可装入段的各项的前面。有关详细信息,请参见程序的解释程序

PT_NOTE

指定辅助信息的位置和大小。有关详细信息,请参见注释节

PT_SHLIB

保留类型,但具有未指定的语义。

PT_PHDR

指定程序头表在文件及程序内存映像中的位置和大小。此段类型不能在一个文件中多次出现。此外,仅当程序头表是程序内存映像的一部分时,才可以出现此段。此类型(如果存在)必须位于任何可装入段的各项的前面。有关详细信息,请参见程序的解释程序

PT_TLS

指定线程局部存储模板。有关详细信息,请参见线程局部存储节

PT_LOOS - PT_HIOS

此范围内包含的值保留用于特定于操作系统的语义。

PT_SUNW_UNWIND

此段包含栈扩展表。

PT_SUNW_EH_FRAME

此段包含栈扩展表。PT_SUNW_EH_FRAMEPT_SUNW_EH_UNWIND 等效。

PT_LOSUNW - PT_HISUNW

此范围内包含的值(包括这两个值)保留用于特定于 Sun 的语义。

PT_SUNWBSS

PT_LOAD 元素相同的属性,用于描述 .SUNW_bss 节。

PT_SUNWSTACK

描述进程栈。只能存在一个 PT_SUNWSTACK 元素。仅访问权限(如 p_flags 字段中所定义)有意义。

PT_SUNWDTRACE

保留供 dtrace(1M) 内部使用。

PT_SUNWCAP

指定功能要求。有关详细信息,请参见功能节

PT_LOPROC - PT_HIPROC

此范围内包含的值(包括这两个值)保留用于特定于处理器的语义。


注 - 除非在其他位置具体要求,否则所有程序头的段类型都是可选的。文件的程序头表只能包含与其内容相关的那些元素。