如果目标文件参与动态链接,则其程序头表将包含一个类型为 PT_DYNAMIC 的元素。此段包含 .dynamic 节。特殊符号 _DYNAMIC 用于标记包含以下结构的数组的节。 请参见sys/link.h。
typedef struct { Elf32_Sword d_tag; union { Elf32_Word d_val; Elf32_Addr d_ptr; Elf32_Off d_off; } d_un; } Elf32_Dyn; typedef struct { Elf64_Xword d_tag; union { Elf64_Xword d_val; Elf64_Addr d_ptr; } d_un; } Elf64_Dyn;
对于此类型的每个目标文件,d_tag 将控制 d_un 的解释。
这些目标文件表示具有各种解释的整数值。
这些目标文件表示程序虚拟地址。在执行过程中,文件虚拟地址可能与内存虚拟地址不匹配。对动态结构中包含的地址进行解释时,运行时链接程序会根据原始文件值和内存基本地址来计算实际地址。为确保一致性,文件不应包含用于更正动态结构中的地址的重定位项。
除两个特殊兼容性范围中的那些标记外,每个动态标记的值都可确定 d_un 联合的解释。借助此约定,外部工具可进行更简单的动态标记解释。值为偶数的标记表示使用 d_ptr 的动态节项。值为奇数的标记表示使用 d_val 的动态节项,也即是该标记既不使用 d_ptr,也不使用 d_val。值小于特定值 DT_ENCODING 的标记以及值位于 DT_HIOS 和 DT_LOPROC 之间的标记不遵循这些规则。
下表概述了可执行文件和共享库文件的标记要求。如果某标记带有强制标志,则动态链接数组必须包含此类型的项。同样,可选表示该标记的项可以出现但不是必需的。
表 7–32 ELF 动态数组标记
名称 |
值 |
d_un |
可执行文件 |
共享库文件 |
---|---|---|---|---|
DT_NULL |
0 |
忽略 |
强制 |
强制 |
DT_NEEDED |
1 |
d_val |
可选 |
可选 |
DT_PLTRELSZ |
2 |
d_val |
可选 |
可选 |
DT_PLTGOT |
3 |
d_ptr |
可选 |
可选 |
DT_HASH |
4 |
d_ptr |
强制 |
强制 |
DT_STRTAB |
5 |
d_ptr |
强制 |
强制 |
DT_SYMTAB |
6 |
d_ptr |
强制 |
强制 |
DT_RELA |
7 |
d_ptr |
强制 |
可选 |
DT_RELASZ |
8 |
d_val |
强制 |
可选 |
DT_RELAENT |
9 |
d_val |
强制 |
可选 |
DT_STRSZ |
10 |
d_val |
强制 |
强制 |
DT_SYMENT |
11 |
d_val |
强制 |
强制 |
DT_INIT |
12 |
d_ptr |
可选 |
可选 |
DT_FINI |
13 |
d_ptr |
可选 |
可选 |
DT_SONAME |
14 |
d_val |
忽略 |
可选 |
DT_RPATH |
15 |
d_val |
可选 |
可选 |
DT_SYMBOLIC |
16 |
忽略 |
忽略 |
可选 |
DT_REL |
17 |
d_ptr |
强制 |
可选 |
DT_RELSZ |
18 |
d_val |
强制 |
可选 |
DT_RELENT |
19 |
d_val |
强制 |
可选 |
DT_PLTREL |
20 |
d_val |
可选 |
可选 |
DT_DEBUG |
21 |
d_ptr |
可选 |
忽略 |
DT_TEXTREL |
22 |
忽略 |
可选 |
可选 |
DT_JMPREL |
23 |
d_ptr |
可选 |
可选 |
DT_BIND_NOW |
24 |
忽略 |
可选 |
可选 |
DT_INIT_ARRAY |
25 |
d_ptr |
可选 |
可选 |
DT_FINI_ARRAY |
26 |
d_ptr |
可选 |
可选 |
DT_INIT_ARRAYSZ |
27 |
d_val |
可选 |
可选 |
DT_FINI_ARRAYSZ |
28 |
d_val |
可选 |
可选 |
DT_RUNPATH |
29 |
d_val |
可选 |
可选 |
DT_FLAGS |
30 |
d_val |
可选 |
可选 |
DT_ENCODING |
32 |
未指定 |
未指定 |
未指定 |
DT_PREINIT_ARRAY |
32 |
d_ptr |
可选 |
忽略 |
DT_PREINIT_ARRAYSZ |
33 |
d_val |
可选 |
忽略 |
DT_LOOS |
0x6000000d |
未指定 |
未指定 |
未指定 |
DT_SUNW_RTLDINF |
0x6000000e |
d_ptr |
可选 |
可选 |
DT_HIOS |
0x6ffff000 |
未指定 |
未指定 |
未指定 |
DT_VALRNGLO |
0x6ffffd00 |
未指定 |
未指定 |
未指定 |
DT_CHECKSUM |
0x6ffffdf8 |
d_val |
可选 |
可选 |
DT_PLTPADSZ |
0x6ffffdf9 |
d_val |
可选 |
可选 |
DT_MOVEENT |
0x6ffffdfa |
d_val |
可选 |
可选 |
DT_MOVESZ |
0x6ffffdfb |
d_val |
可选 |
可选 |
DT_FEATURE_1 |
0x6ffffdfc |
d_val |
可选 |
可选 |
DT_POSFLAG_1 |
0x6ffffdfd |
d_val |
可选 |
可选 |
DT_SYMINSZ |
0x6ffffdfe |
d_val |
可选 |
可选 |
DT_SYMINENT |
0x6ffffdff |
d_val |
可选 |
可选 |
DT_VALRNGHI |
0x6ffffdff |
未指定 |
未指定 |
未指定 |
DT_ADDRRNGLO |
0x6ffffe00 |
未指定 |
未指定 |
未指定 |
DT_CONFIG |
0x6ffffefa |
d_ptr |
可选 |
可选 |
DT_DEPAUDIT |
0x6ffffefb |
d_ptr |
可选 |
可选 |
DT_AUDIT |
0x6ffffefc |
d_ptr |
可选 |
可选 |
DT_PLTPAD |
0x6ffffefd |
d_ptr |
可选 |
可选 |
DT_MOVETAB |
0x6ffffefe |
d_ptr |
可选 |
可选 |
DT_SYMINFO |
0x6ffffeff |
d_ptr |
可选 |
可选 |
DT_ADDRRNGHI |
0x6ffffeff |
未指定 |
未指定 |
未指定 |
DT_RELACOUNT |
0x6ffffff9 |
d_val |
可选 |
可选 |
DT_RELCOUNT |
0x6ffffffa |
d_val |
可选 |
可选 |
DT_FLAGS_1 |
0x6ffffffb |
d_val |
可选 |
可选 |
DT_VERDEF |
0x6ffffffc |
d_ptr |
可选 |
可选 |
DT_VERDEFNUM |
0x6ffffffd |
d_val |
可选 |
可选 |
DT_VERNEED |
0x6ffffffe |
d_ptr |
可选 |
可选 |
DT_VERNEEDNUM |
0x6fffffff |
d_val |
可选 |
可选 |
DT_LOPROC |
0x70000000 |
未指定 |
未指定 |
未指定 |
DT_SPARC_REGISTER |
0x70000001 |
d_val |
可选 |
可选 |
DT_AUXILIARY |
0x7ffffffd |
d_val |
未指定 |
可选 |
DT_USED |
0x7ffffffe |
d_val |
可选 |
可选 |
DT_FILTER |
0x7fffffff |
d_val |
未指定 |
可选 |
DT_HIPROC |
0x7fffffff |
未指定 |
未指定 |
未指定 |
标记 _DYNAMIC 数组的结尾。
以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于提供所需依赖项的名称。动态数组可以包含多个此类型的项。尽管这些项与其他类型的项的关系不重要,但其相对顺序却很重要。 请参见共享库依赖项。
与过程链接表关联的重定位项的总大小(以字节为单位)。 请参见过程链接表(特定于处理器)。
与过程链接表或全局偏移表关联的地址。 请参见过程链接表(特定于处理器)和全局偏移表(特定于处理器)。
符号散列表的地址。该表引用 DT_SYMTAB 元素指示的符号表。 请参见散列表节。
字符串表的地址。运行时链接程序所需的符号名称、依赖项名称和其他字符串位于该表中。 请参见字符串表节。
符号表的地址。 请参见符号表节。
重定位表的地址。 请参见重定位节。
目标文件可以有多个重定位节。为可执行文件或共享库文件创建重定位表时,链接编辑器会连接这些节以形成一个表。尽管这些节在目标文件中可以保持独立,但运行时链接程序将看到一个表。运行时链接程序为可执行文件创建进程映像或将共享库添加到进程映像中时,运行时链接程序将会读取该重定位表并执行关联操作。
此元素要求同时存在 DT_RELASZ 和 DT_RELAENT 元素。如果文件必须重定位,则可以存在 DT_RELA 或 DT_REL。
DT_RELA 重定位表的总大小(以字节为单位)。
DT_RELA 重定位项的大小(以字节为单位)。
DT_STRTAB 字符串表的总大小(以字节为单位)。
DT_SYMTAB 符号项的大小(以字节为单位)。
初始化函数的地址。 请参见初始化和终止节。
终止函数的地址。 请参见初始化和终止节。
以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于标识共享库的名称。 请参见记录共享库名称。
以空字符结尾的库搜索路径字符串的 DT_STRTAB 字符串表偏移。此元素的用途已被 DT_RUNPATH 取代。 请参见运行时链接程序搜索的目录。
表示目标文件包含在其链接编辑过程中应用的符号绑定。此元素的用途已被 DF_SYMBOLIC 标志取代。 请参见使用 -B symbolic。
与 DT_RELA 类似,但其表中包含隐式加数。此元素要求同时存在 DT_RELSZ 和 DT_RELENT 元素。
DT_REL 重定位表的总大小(以字节为单位)。
DT_REL 重定位项的大小(以字节为单位)。
表示过程链接表指向的重定位项的类型(DT_REL 或 DT_RELA)。过程链接表中的所有重定位都必须使用相同的重定位项。 请参见过程链接表(特定于处理器)。此元素要求同时存在 DT_JMPREL 元素。
用于调试。
表示一个或多个重定位项可能会要求修改非可写段,并且运行时链接程序可以相应地进行准备。此元素的用途已被 DF_TEXTREL 标志取代。 请参见与位置无关的代码。
与过程链接表单独关联的重定位项的地址。 请参见过程链接表(特定于处理器)。通过分隔这些重定位项,运行时链接程序可在装入启用了延迟绑定的目标文件时忽略这些项。此元素要求同时存在 DT_PLTRELSZ 和 DT_PLTREL 元素。
应用于紧邻的 DT_ 元素的各种状态标志。 请参见表 7–35。
表示在将控制权返回给程序之前,必须处理此目标文件的所有重定位项。通过环境或 dlopen(3C) 指定时,提供的此项优先于使用延迟绑定的指令。此元素的用途已被 DF_BIND_NOW 标志取代。 请参见执行重定位的时间。
初始化函数的指针数组的地址。此元素要求同时存在 DT_INIT_ARRAYSZ 元素。 请参见初始化和终止节。
终止函数的指针数组的地址。此元素要求同时存在 DT_FINI_ARRAYSZ 元素。 请参见初始化和终止节。
DT_INIT_ARRAY 数组的总大小(以字节为单位)。
DT_FINI_ARRAY 数组的总大小(以字节为单位)。
以空字符结尾的库搜索路径字符串的 DT_STRTAB 字符串表偏移。 请参见运行时链接程序搜索的目录。
特定于此目标文件的标志值。 请参见表 7–33。
大于或等于 DT_ENCODING 且小于或等于 DT_HIOS 的动态标记值,遵循 d_un 联合的解释规则。
预初始化函数的指针数组的 地址 。此元素要求同时存在 DT_PREINIT_ARRAYSZ 元素。仅在可执行文件中处理该数组。如果该数组包含在共享库中,则会被忽略。 请参见初始化和终止节。
DT_PREINIT_ARRAY 数组的总大小(以字节为单位)。
此范围内包含的值保留用于特定于操作系统的语义。所有这类值都遵循 d_un 联合的解释规则。
保留供运行时链接程序内部使用。
符号信息表的地址。此元素要求同时存在 DT_SYMINENT 和 DT_SYMINSZ 元素。 请参见Syminfo 表节。
DT_SYMINFO 信息项的大小(以字节为单位)。
DT_SYMINFO 表的总大小(以字节为单位)。
版本定义表的地址。该表中的元素包含字符串表 DT_STRTAB 的索引。此元素要求同时存在 DT_VERDEFNUM 元素。 请参见版本定义节。
DT_VERDEF 表中的项数。
版本依赖性表的地址。该表中的元素包含字符串表 DT_STRTAB 的索引。此元素要求同时存在 DT_VERNEEDNUM 元素。 请参见版本依赖性节。
DT_VERNEEDNUM 表中的项数。
表示 RELATIVE 重定位计数,该计数是通过串联所有 Elf32_Rela 或 Elf64_Rela 重定位项生成的。 请参见组合重定位节。
表示 RELATIVE 重定位计数,该计数是通过串联所有 Elf32_Rel 重定位项生成的。 请参见组合重定位节。
以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于指定一个或多个辅助 filtee。 请参见生成辅助过滤器。
以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于指定一个或多个标准 filtee。 请参见生成标准过滤器。
目标文件中选定的节的简单校验和。 请参见 gelf_checksum(3ELF)。
DT_MOVETAB 移动项的大小(以字节为单位)。
DT_MOVETAB 表的总大小(以字节为单位)。
移动表的地址。此元素要求同时存在 DT_MOVEENT 和 DT_MOVESZ 元素。请参见移动节。
以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于定义配置文件。该配置文件仅在可执行文件中有意义,并且通常是特定于此目标文件的。请参见配置缺省搜索路径。
以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于定义一个或多个审计库。请参见运行时链接程序审计接口。
以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于定义一个或多个审计库。请参见运行时链接程序审计接口。
特定于此目标文件的标志值。请参见表 7–34。
特定于此目标文件的功能值。请参见表 7–36。
此范围内包含的值使用动态结构的 d_un.d_val 字段。
此范围内包含的值使用动态结构的 d_un.d_ptr 字段。如果生成 ELF 目标文件后对其进行了任何调整,则必须相应地更新这些项。
DT_SYMTAB 符号表中 STT_SPARC_REGISTER 符号的索引。该符号表中的每个 STT_SPARC_REGISTER 符号都存在一个动态项。请参见寄存器符号。
此范围内包含的值保留用于特定于处理器的语义。
除动态数组结尾的 DT_NULL 元素以及 DT_NEEDED 和 DT_POSFLAG_1 元素的相对顺序以外,各项可以采用任何顺序显示。未显示在该表中的标记值为保留值。
表 7–33 ELF 动态标志 DT_FLAGS
名称 |
值 |
含义 |
---|---|---|
DF_ORIGIN |
0x1 |
要求 $ORIGIN 处理 |
DF_SYMBOLIC |
0x2 |
要求符号解析 |
DF_TEXTREL |
0x4 |
存在文本重定位项 |
DF_BIND_NOW |
0x8 |
要求非延迟绑定 |
DF_STATIC_TLS |
0x10 |
目标文件使用静态线程局部存储方案 |
表示目标文件要求 $ORIGIN 处理。请参见查找关联的依赖项。
表示目标文件包含在其链接编辑过程中应用的符号绑定。请参见使用 -B symbolic。
表示一个或多个重定位项可能会要求修改非可写段,并且运行时链接程序可以相应地进行准备。请参见与位置无关的代码。
表示在将控制权返回给程序之前,必须处理此目标文件的所有重定位项。通过环境或 dlopen(3C) 指定时,提供的此项优先于使用延迟绑定的指令。请参见执行重定位的时间。
表示目标文件包含使用静态线程局部存储方案的代码。在通过 dlopen(3C) 或延迟装入动态装入的目标文件中,不能使用静态线程局部存储。由于此限制,因此链接编辑器不支持创建要求静态线程局部存储的共享库。
名称 |
值 |
含义 |
---|---|---|
DF_1_NOW |
0x1 |
执行完整的重定位处理。 |
DF_1_GLOBAL |
0x2 |
未使用。 |
DF_1_GROUP |
0x4 |
表示目标文件是组的成员。 |
DF_1_NODELETE |
0x8 |
不能从进程中删除目标文件。 |
DF_1_LOADFLTR |
0x10 |
确保立即装入 filtee。 |
DF_1_INITFIRST |
0x20 |
首先进行目标文件初始化。 |
DF_1_NOOPEN |
0x40 |
目标文件不能用于 dlopen(3C)。 |
DF_1_ORIGIN |
0x80 |
要求 $ORIGIN 处理。 |
DF_1_DIRECT |
0x100 |
已启用直接绑定。 |
DF_1_INTERPOSE |
0x400 |
目标文件是插入项。 |
DF_1_NODEFLIB |
0x800 |
忽略缺省的库搜索路径。 |
DF_1_NODUMP |
0x1000 |
不能使用 dldump(3C) 转储目标文件。 |
DF_1_CONFALT |
0x2000 |
目标文件是配置替代项。 |
DF_1_ENDFILTEE |
0x4000 |
filtee 终止过滤器搜索。 |
DF_1_DISPRELDNE |
0x8000 |
已执行位移重定位。 |
DF_1_DISPRELPND |
0x10000 |
位移重定位暂挂。 |
DF_1_NODIRECT |
0x20000 |
目标文件包含非直接绑定。 |
DF_1_IGNMULDEF |
0x40000 |
内部使用。 |
DF_1_NOKSYMS |
0x80000 |
内部使用。 |
DF_1_NORELOC |
0x400000 |
内部使用。 |
表示在将控制权返回给程序之前,必须处理此目标文件的所有重定位项。通过环境或 dlopen(3C) 指定时,提供的此标志优先于使用延迟绑定的指令。请参见执行重定位的时间。
表示目标文件是组的成员。此标志通过链接编辑器的 -B group 选项记录在目标文件中。请参见目标文件分层结构。
表示不能从进程中删除目标文件。如果使用 dlopen(3C) 通过直接或依赖性方式将目标文件装入进程,则无法使用 dlclose(3C) 卸载该目标文件。此标志通过使用链接编辑器的 -z nodelete 选项记录在目标文件中。
仅对过滤器有意义。表示立即处理所有关联 filtee 。此标志通过使用链接编辑器的 -z loadfltr 选项记录在目标文件中。请参见filtee 处理。
表示在装入其他任何目标文件之前首先运行此目标文件的初始化节。此标志仅适用于专用系统库,并通过使用链接编辑器的 -z initfirst 选项记录在目标文件中。
表示无法使用 dlopen(3C) 将目标文件添加到运行的进程。此标志通过使用链接编辑器的 -z nodlopen 选项记录在目标文件中。
表示目标文件要求 $ORIGIN 处理。请参见查找关联的依赖项。
表示目标文件应使用直接绑定信息。请参见直接绑定。
表示目标文件符号表将在除主装入目标文件(通常为可执行文件)外的所有符号之前插入。此标志通过使用链接编辑器的 -z interpose 选项进行记录。请参见直接绑定。
表示此目标文件的依赖性搜索会忽略所有缺省的库搜索路径。此标志通过使用链接编辑器的 -z nodefaultlib 选项记录在目标文件中。请参见运行时链接程序搜索的目录。
表示此目标文件不通过 dldump(3C) 进行转储。此选项的替代选项包括没有重定位项的目标文件,这些目标文件可能会包括在使用 crle(1) 生成的替代目标文件中。此标志通过使用链接编辑器的 -z nodump 选项记录在目标文件中。
将此目标文件标识为 crle(1) 生成的配置替代目标文件。此标志可触发运行时链接程序来搜索配置文件 $ORIGIN/ld.config.app-name。
仅对 filtee 有意义。终止对其他任何 filtee 的过滤器搜索。此标志通过使用链接编辑器的 -z endfiltee 选项记录在目标文件中。请参见减少 filtee 搜索。
表示此目标文件应用了位移重定位。由于位移重定位记录在应用重定位后已被废弃,因此此目标文件中将不再存在这些记录。请参见位移重定位。
表示此目标文件暂挂了位移重定位。由于此目标文件中存在位移重定位,因此可在运行时完成重定位。请参见位移重定位。
表示此目标文件包含无法直接绑定的符号。请参见定义其他符号。
保留供内核运行时链接程序内部使用。
保留供内核运行时链接程序内部使用。
名称 |
值 |
含义 |
---|---|---|
DF_P1_LAZYLOAD |
0x1 |
标识延迟装入的依赖项。 |
DF_P1_GROUPPERM |
0x2 |
标识组依赖性。 |
将以下 DT_NEEDED 项标识为要延迟装入的目标文件。此标志通过使用链接编辑器的 -z lazyload 选项记录在目标文件中。请参见延迟装入动态依赖项。
将以下 DT_NEEDED 项标识为要作为组装入的目标文件。此标志通过使用链接编辑器的 -z groupperm 选项记录在目标文件中。请参见隔离组。
名称 |
值 |
含义 |
---|---|---|
DTF_1_PARINIT |
0x1 |
需要部分初始化。 |
DTF_1_CONFEXP |
0x2 |
需要配置文件。 |