链接程序和库指南

动态节

如果目标文件参与动态链接,则其程序头表将包含一个类型为 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_val

这些目标文件表示具有各种解释的整数值。

d_ptr

这些目标文件表示程序虚拟地址。在执行过程中,文件虚拟地址可能与内存虚拟地址不匹配。对动态结构中包含的地址进行解释时,运行时链接程序会根据原始文件值和内存基本地址来计算实际地址。为确保一致性,文件不应包含用于更正动态结构中的地址的重定位项。

除两个特殊兼容性范围中的那些标记外,每个动态标记的值都可确定 d_un 联合的解释。借助此约定,外部工具可进行更简单的动态标记解释。值为偶数的标记表示使用 d_ptr 的动态节项。值为奇数的标记表示使用 d_val 的动态节项,也即是该标记既不使用 d_ptr,也不使用 d_val。值小于特定值 DT_ENCODING 的标记以及值位于 DT_HIOSDT_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

未指定 

未指定 

未指定 

DT_NULL

标记 _DYNAMIC 数组的结尾。

DT_NEEDED

以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于提供所需依赖项的名称。动态数组可以包含多个此类型的项。尽管这些项与其他类型的项的关系不重要,但其相对顺序却很重要。 请参见共享库依赖项

DT_PLTRELSZ

与过程链接表关联的重定位项的总大小(以字节为单位)。 请参见过程链接表(特定于处理器)

DT_PLTGOT

与过程链接表或全局偏移表关联的地址。 请参见过程链接表(特定于处理器)全局偏移表(特定于处理器)

DT_HASH

符号散列表的地址。该表引用 DT_SYMTAB 元素指示的符号表。 请参见散列表节

DT_STRTAB

字符串表的地址。运行时链接程序所需的符号名称、依赖项名称和其他字符串位于该表中。 请参见字符串表节

DT_SYMTAB

符号表的地址。 请参见符号表节

DT_RELA

重定位表的地址。 请参见重定位节

目标文件可以有多个重定位节。为可执行文件或共享库文件创建重定位表时,链接编辑器会连接这些节以形成一个表。尽管这些节在目标文件中可以保持独立,但运行时链接程序将看到一个表。运行时链接程序为可执行文件创建进程映像或将共享库添加到进程映像中时,运行时链接程序将会读取该重定位表并执行关联操作。

此元素要求同时存在 DT_RELASZDT_RELAENT 元素。如果文件必须重定位,则可以存在 DT_RELADT_REL

DT_RELASZ

DT_RELA 重定位表的总大小(以字节为单位)。

DT_RELAENT

DT_RELA 重定位项的大小(以字节为单位)。

DT_STRSZ

DT_STRTAB 字符串表的总大小(以字节为单位)。

DT_SYMENT

DT_SYMTAB 符号项的大小(以字节为单位)。

DT_INIT

初始化函数的地址。 请参见初始化和终止节

DT_FINI

终止函数的地址。 请参见初始化和终止节

DT_SONAME

以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于标识共享库的名称。 请参见记录共享库名称

DT_RPATH

以空字符结尾的库搜索路径字符串的 DT_STRTAB 字符串表偏移。此元素的用途已被 DT_RUNPATH 取代。 请参见运行时链接程序搜索的目录

DT_SYMBOLIC

表示目标文件包含在其链接编辑过程中应用的符号绑定。此元素的用途已被 DF_SYMBOLIC 标志取代。 请参见使用 -B symbolic

DT_REL

DT_RELA 类似,但其表中包含隐式加数。此元素要求同时存在 DT_RELSZDT_RELENT 元素。

DT_RELSZ

DT_REL 重定位表的总大小(以字节为单位)。

DT_RELENT

DT_REL 重定位项的大小(以字节为单位)。

DT_PLTREL

表示过程链接表指向的重定位项的类型(DT_RELDT_RELA)。过程链接表中的所有重定位都必须使用相同的重定位项。 请参见过程链接表(特定于处理器)。此元素要求同时存在 DT_JMPREL 元素。

DT_DEBUG

用于调试。

DT_TEXTREL

表示一个或多个重定位项可能会要求修改非可写段,并且运行时链接程序可以相应地进行准备。此元素的用途已被 DF_TEXTREL 标志取代。 请参见与位置无关的代码

DT_JMPREL

与过程链接表单独关联的重定位项的地址。 请参见过程链接表(特定于处理器)。通过分隔这些重定位项,运行时链接程序可在装入启用了延迟绑定的目标文件时忽略这些项。此元素要求同时存在 DT_PLTRELSZDT_PLTREL 元素。

DT_POSFLAG_1

应用于紧邻的 DT_ 元素的各种状态标志。 请参见表 7–35

DT_BIND_NOW

表示在将控制权返回给程序之前,必须处理此目标文件的所有重定位项。通过环境或 dlopen(3C) 指定时,提供的此项优先于使用延迟绑定的指令。此元素的用途已被 DF_BIND_NOW 标志取代。 请参见执行重定位的时间

DT_INIT_ARRAY

初始化函数的指针数组的地址。此元素要求同时存在 DT_INIT_ARRAYSZ 元素。 请参见初始化和终止节

DT_FINI_ARRAY

终止函数的指针数组的地址。此元素要求同时存在 DT_FINI_ARRAYSZ 元素。 请参见初始化和终止节

DT_INIT_ARRAYSZ

DT_INIT_ARRAY 数组的总大小(以字节为单位)。

DT_FINI_ARRAYSZ

DT_FINI_ARRAY 数组的总大小(以字节为单位)。

DT_RUNPATH

以空字符结尾的库搜索路径字符串的 DT_STRTAB 字符串表偏移。 请参见运行时链接程序搜索的目录

DT_FLAGS

特定于此目标文件的标志值。 请参见表 7–33

DT_ENCODING

大于或等于 DT_ENCODING 且小于或等于 DT_HIOS 的动态标记值,遵循 d_un 联合的解释规则。

DT_PREINIT_ARRAY

预初始化函数的指针数组的 地址 。此元素要求同时存在 DT_PREINIT_ARRAYSZ 元素。仅在可执行文件中处理该数组。如果该数组包含在共享库中,则会被忽略。 请参见初始化和终止节

DT_PREINIT_ARRAYSZ

DT_PREINIT_ARRAY 数组的总大小(以字节为单位)。

DT_LOOS - DT_HIOS

此范围内包含的值保留用于特定于操作系统的语义。所有这类值都遵循 d_un 联合的解释规则。

DT_SUNW_RTLDINF

保留供运行时链接程序内部使用。

DT_SYMINFO

符号信息表的地址。此元素要求同时存在 DT_SYMINENTDT_SYMINSZ 元素。 请参见Syminfo 表节

DT_SYMINENT

DT_SYMINFO 信息项的大小(以字节为单位)。

DT_SYMINSZ

DT_SYMINFO 表的总大小(以字节为单位)。

DT_VERDEF

版本定义表的地址。该表中的元素包含字符串表 DT_STRTAB 的索引。此元素要求同时存在 DT_VERDEFNUM 元素。 请参见版本定义节

DT_VERDEFNUM

DT_VERDEF 表中的项数。

DT_VERNEED

版本依赖性表的地址。该表中的元素包含字符串表 DT_STRTAB 的索引。此元素要求同时存在 DT_VERNEEDNUM 元素。 请参见版本依赖性节

DT_VERNEEDNUM

DT_VERNEEDNUM 表中的项数。

DT_RELACOUNT

表示 RELATIVE 重定位计数,该计数是通过串联所有 Elf32_RelaElf64_Rela 重定位项生成的。 请参见组合重定位节

DT_RELCOUNT

表示 RELATIVE 重定位计数,该计数是通过串联所有 Elf32_Rel 重定位项生成的。 请参见组合重定位节

DT_AUXILIARY

以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于指定一个或多个辅助 filtee。 请参见生成辅助过滤器

DT_FILTER

以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于指定一个或多个标准 filtee。 请参见生成标准过滤器

DT_CHECKSUM

目标文件中选定的节的简单校验和。 请参见 gelf_checksum(3ELF)

DT_MOVEENT

DT_MOVETAB 移动项的大小(以字节为单位)。

DT_MOVESZ

DT_MOVETAB 表的总大小(以字节为单位)。

DT_MOVETAB

移动表的地址。此元素要求同时存在 DT_MOVEENTDT_MOVESZ 元素。请参见移动节

DT_CONFIG

以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于定义配置文件。该配置文件仅在可执行文件中有意义,并且通常是特定于此目标文件的。请参见配置缺省搜索路径

DT_DEPAUDIT

以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于定义一个或多个审计库。请参见运行时链接程序审计接口

DT_AUDIT

以空字符结尾的字符串的 DT_STRTAB 字符串表偏移,用于定义一个或多个审计库。请参见运行时链接程序审计接口

DT_FLAGS_1

特定于此目标文件的标志值。请参见表 7–34

DT_FEATURE_1

特定于此目标文件的功能值。请参见表 7–36

DT_VALRNGLO - DT_VALRNGHI

此范围内包含的值使用动态结构的 d_un.d_val 字段。

DT_ADDRRNGLO - DT_ADDRRNGHI

此范围内包含的值使用动态结构的 d_un.d_ptr 字段。如果生成 ELF 目标文件后对其进行了任何调整,则必须相应地更新这些项。

DT_SPARC_REGISTER

DT_SYMTAB 符号表中 STT_SPARC_REGISTER 符号的索引。该符号表中的每个 STT_SPARC_REGISTER 符号都存在一个动态项。请参见寄存器符号

DT_LOPROC - DT_HIPROC

此范围内包含的值保留用于特定于处理器的语义。

除动态数组结尾的 DT_NULL 元素以及 DT_NEEDEDDT_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

目标文件使用静态线程局部存储方案 

DF_ORIGIN

表示目标文件要求 $ORIGIN 处理。请参见查找关联的依赖项

DF_SYMBOLIC

表示目标文件包含在其链接编辑过程中应用的符号绑定。请参见使用 -B symbolic

DF_TEXTREL

表示一个或多个重定位项可能会要求修改非可写段,并且运行时链接程序可以相应地进行准备。请参见与位置无关的代码

DF_BIND_NOW

表示在将控制权返回给程序之前,必须处理此目标文件的所有重定位项。通过环境或 dlopen(3C) 指定时,提供的此项优先于使用延迟绑定的指令。请参见执行重定位的时间

DF_STATIC_TLS

表示目标文件包含使用静态线程局部存储方案的代码。在通过 dlopen(3C) 或延迟装入动态装入的目标文件中,不能使用静态线程局部存储。由于此限制,因此链接编辑器不支持创建要求静态线程局部存储的共享库。

表 7–34 ELF 动态标志 DT_FLAGS_1

名称 

值 

含义 

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

内部使用。 

DF_1_NOW

表示在将控制权返回给程序之前,必须处理此目标文件的所有重定位项。通过环境或 dlopen(3C) 指定时,提供的此标志优先于使用延迟绑定的指令。请参见执行重定位的时间

DF_1_GROUP

表示目标文件是组的成员。此标志通过链接编辑器的 -B group 选项记录在目标文件中。请参见目标文件分层结构

DF_1_NODELETE

表示不能从进程中删除目标文件。如果使用 dlopen(3C) 通过直接或依赖性方式将目标文件装入进程,则无法使用 dlclose(3C) 卸载该目标文件。此标志通过使用链接编辑器的 -z nodelete 选项记录在目标文件中。

DF_1_LOADFLTR

仅对过滤器有意义。表示立即处理所有关联 filtee 。此标志通过使用链接编辑器的 -z loadfltr 选项记录在目标文件中。请参见filtee 处理

DF_1_INITFIRST

表示在装入其他任何目标文件之前首先运行此目标文件的初始化节。此标志仅适用于专用系统库,并通过使用链接编辑器的 -z initfirst 选项记录在目标文件中。

DF_1_NOOPEN

表示无法使用 dlopen(3C) 将目标文件添加到运行的进程。此标志通过使用链接编辑器的 -z nodlopen 选项记录在目标文件中。

DF_1_ORIGIN

表示目标文件要求 $ORIGIN 处理。请参见查找关联的依赖项

DF_1_DIRECT

表示目标文件应使用直接绑定信息。请参见直接绑定

DF_1_INTERPOSE

表示目标文件符号表将在除主装入目标文件(通常为可执行文件)外的所有符号之前插入。此标志通过使用链接编辑器的 -z interpose 选项进行记录。请参见直接绑定

DF_1_NODEFLIB

表示此目标文件的依赖性搜索会忽略所有缺省的库搜索路径。此标志通过使用链接编辑器的 -z nodefaultlib 选项记录在目标文件中。请参见运行时链接程序搜索的目录

DF_1_NODUMP

表示此目标文件不通过 dldump(3C) 进行转储。此选项的替代选项包括没有重定位项的目标文件,这些目标文件可能会包括在使用 crle(1) 生成的替代目标文件中。此标志通过使用链接编辑器的 -z nodump 选项记录在目标文件中。

DF_1_CONFALT

将此目标文件标识为 crle(1) 生成的配置替代目标文件。此标志可触发运行时链接程序来搜索配置文件 $ORIGIN/ld.config.app-name

DF_1_ENDFILTEE

仅对 filtee 有意义。终止对其他任何 filtee 的过滤器搜索。此标志通过使用链接编辑器的 -z endfiltee 选项记录在目标文件中。请参见减少 filtee 搜索

DF_1_DISPRELDNE

表示此目标文件应用了位移重定位。由于位移重定位记录在应用重定位后已被废弃,因此此目标文件中将不再存在这些记录。请参见位移重定位

DF_1_DISPRELPND

表示此目标文件暂挂了位移重定位。由于此目标文件中存在位移重定位,因此可在运行时完成重定位。请参见位移重定位

DF_1_NODIRECT

表示此目标文件包含无法直接绑定的符号。请参见定义其他符号

DF_1_IGNMULDEF

保留供内核运行时链接程序内部使用。

DF_1_NOKSYMS

保留供内核运行时链接程序内部使用。

表 7–35 ELF 动态位置标志 DT_POSFLAG_1

名称 

值 

含义 

DF_P1_LAZYLOAD

0x1

标识延迟装入的依赖项。 

DF_P1_GROUPPERM

0x2

标识组依赖性。 

DF_P1_LAZYLOAD

将以下 DT_NEEDED 项标识为要延迟装入的目标文件。此标志通过使用链接编辑器的 -z lazyload 选项记录在目标文件中。请参见延迟装入动态依赖项

DF_P1_GROUPPERM

将以下 DT_NEEDED 项标识为要作为组装入的目标文件。此标志通过使用链接编辑器的 -z groupperm 选项记录在目标文件中。请参见隔离组

表 7–36 ELF 动态功能标志 DT_FEATURE_1

名称 

值 

含义 

DTF_1_PARINIT

0x1

需要部分初始化。 

DTF_1_CONFEXP

0x2

需要配置文件。 

DTF_1_PARINIT

表示目标文件需要部分初始化。请参见移动节

DTF_1_CONFEXP

将此目标文件标识为 crle(1) 生成的配置替代目标文件。此标志可触发运行时链接程序来搜索配置文件 $ORIGIN/ld.config.app-name。此标志的效果与 DF_1_CONFALT 相同。