跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 11.1 链接程序和库指南 Oracle Solaris 11.1 Information Library (简体中文) |
目标文件中的一些控制结构可以增大,因为 ELF 头包含这些控制结构的实际大小。如果目标文件格式发生变化,则程序可能会遇到大于或小于预期大小的控制结构。因此,程序可能会忽略额外的信息。这些忽略的信息的处理方式取决于上下文,如果定义了扩展内容,则会指定处理方式。
ELF 头具有以下结构。请参见 sys/elf.h。
#define EI_NIDENT 16 typedef struct { unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32_Ehdr; typedef struct { unsigned char e_ident[EI_NIDENT]; Elf64_Half e_type; Elf64_Half e_machine; Elf64_Word e_version; Elf64_Addr e_entry; Elf64_Off e_phoff; Elf64_Off e_shoff; Elf64_Word e_flags; Elf64_Half e_ehsize; Elf64_Half e_phentsize; Elf64_Half e_phnum; Elf64_Half e_shentsize; Elf64_Half e_shnum; Elf64_Half e_shstrndx; } Elf64_Ehdr;
将文件标记为目标文件的初始字节。这些字节提供与计算机无关的数据,用于解码和解释文件的内容。ELF 标识中提供了完整说明。
标识目标文件类型,如下表中所列。
|
虽然未指定核心文件内容,但保留了类型 ET_CORE 来标记文件。从 ET_LOPROC 到 ET_HIPROC 之间的值(包括这两个值)保留用于特定于处理器的语义。其他值保留供将来使用。
指定独立文件所需的体系结构。下表中列出了相关体系结构。
|
其他值保留供将来使用。特定于处理器的 ELF 名称是使用计算机名进行区分的。例如,为 e_flags 定义的标志使用前缀 EF_。EM_XYZ 计算机的名为 WIDGET 的标志称为 EF_XYZ_WIDGET。
标识目标文件版本,如下表中所列。
|
值 1 表示原始文件格式。EV_CURRENT 的值可根据需要进行更改,以反映当前版本号。
虚拟地址,系统首先将控制权转移到该地址,进而启动进程。如果文件没有关联的入口点,则此成员值为零。
程序头表的文件偏移(以字节为单位)。如果文件没有程序头表,则此成员值为零。
节头表的文件偏移(以字节为单位)。如果文件没有节头表,则此成员值为零。
与文件关联的特定于处理器的标志。标志名称采用 EF_machine_flag 形式。对于 x86,此成员目前为零。下表中列出了 SPARC 标志。
|
ELF 头的大小(以字节为单位)。
文件的程序头表中某一项的大小(以字节为单位)。所有项的大小都相同。
程序头表中的项数。e_phentsize 和 e_phnum 的积指定了表的大小(以字节为单位)。如果文件没有程序头表,则 e_phnum 值为零。
如果程序头的数量大于或等于 PN_XNUM (0xffff),则此成员的值为 PN_XNUM (0xffff)。程序头表的实际项数包含在节头中索引为 0 的 sh_info 字段中。否则,初始节头项的 sh_info 成员包含的值为零。请参见表 12-6 和表 12-7。
节头的大小(以字节为单位)。节头是节头表中的一项。所有项的大小都相同。
节头表中的项数。e_shentsize 和 e_shnum 的积指定了节头表的大小(以字节为单位)。如果文件没有节头表,则 e_shnum 值为零。
如果节数大于或等于 SHN_LORESERVE (0xff00),则 e_shnum 值为零。节头表的实际项数包含在节头中索引为 0 的 sh_size 字段中。否则,初始节头项的 sh_size 成员值为零。请参见表 12-6 和表 12-7。
与节名称字符串表关联的项的节头表索引。如果文件没有节名称字符串表,则此成员值为 SHN_UNDEF。
如果节名称字符串表的节索引大于或等于 SHN_LORESERVE (0xff00),则此成员值为 SHN_XINDEX (0xffff),并且节名称字符串表的实际节索引包含在节头中索引为 0 的 sh_link 字段中。否则,初始节头项的 sh_link 成员值为零。请参见表 12-6 和表 12-7。