JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris 11.1 链接程序和库指南     Oracle Solaris 11.1 Information Library (简体中文)
为本文档评分
search filter icon
search icon

文档信息

前言

第 1 部分使用链接编辑器和运行时链接程序

1.  Oracle Solaris 链接编辑器介绍

2.  链接编辑器

3.  运行时链接程序

4.  共享目标文件

第 2 部分快速参考

5.  链接编辑器快速参考

第 3 部分高级主题

6.  直接绑定

7.  生成目标文件以优化系统性能

8.  Mapfile

9.  接口和版本控制

10.  使用动态字符串标记建立依赖性

11.  可扩展性机制

第 4 部分ELF 应用程序二进制接口

12.  目标文件格式

文件格式

数据表示形式

ELF 头

ELF 标识

数据编码

节合并

特殊节

辅助节

COMDAT 节

组节

功能节

散列表节

移动节

注释节

重定位节

重定位计算

SPARC: 重定位

SPARC: 重定位类型

64 位 SPARC: 重定位类型

x86: 重定位

32 位 x86: 重定位类型

x64: 重定位类型

字符串表节

符号表节

符号值

符号表布局和约定

符号排序节

寄存器符号

Syminfo 表节

版本控制节

版本定义章节

版本依赖性节

版本符号节

13.  程序装入和动态链接

14.  线程局部存储

第 5 部分附录

A.  链接程序和库的更新及新增功能

B.  System V 发行版 4(版本 1)Mapfile

索引

请告诉我们如何提高我们的文档:
过于简略
不易阅读或难以理解
重要信息缺失
错误的内容
需要翻译的版本
其他
Your rating has been updated
感谢您的反馈!

您的反馈将非常有助于我们提供更好的文档。 您是否愿意参与我们的内容改进并提供进一步的意见?

使用目标文件的节头表,可以定位文件的所有节。节头表是 Elf32_ShdrElf64_Shdr 结构的数组。节头表索引是此数组的下标。ELF 头的 e_shoff 成员表示从文件的起始位置到节头表的字节偏移。e_shnum 成员表示节头表包含的项数。e_shentsize 成员表示每一项的大小(以字节为单位)。

如果节数大于或等于 SHN_LORESERVE (0xff00),则 e_shnum 值为 SHN_UNDEF (0)。节头表的实际项数包含在节头中索引为 0sh_size 字段中。否则,初始项的 sh_size 成员值为零。

如果上下文中限制了索引大小,则会保留部分节头表索引。例如,符号表项的 st_shndx 成员以及 ELF 头的 e_shnume_shstrndx 成员。在这类上下文中,保留的值不表示目标文件中的实际各节。同样在这类上下文中,转义值表示会在其他位置(较大字段中)找到实际节索引。

表 12-4 ELF 特殊节索引

名称
SHN_UNDEF
0
SHN_LORESERVE
0xff00
SHN_LOPROC
0xff00
SHN_BEFORE
0xff00
SHN_AFTER
0xff01
SHN_AMD64_LCOMMON
0xff02
SHN_HIPROC
0xff1f
SHN_LOOS
0xff20
SHN_LOSUNW
0xff3f
SHN_SUNW_IGNORE
0xff3f
SHN_HISUNW
0xff3f
SHN_HIOS
0xff3f
SHN_ABS
0xfff1
SHN_COMMON
0xfff2
SHN_XINDEX
0xffff
SHN_HIRESERVE
0xffff

注 - 虽然索引 0 保留为未定义的值,但节头表包含对应于索引 0 的项。即,如果 ELF 头的 e_shnum 成员表示文件在节头表中具有 6 项,则这些节的索引为 05。初始项的内容会在本节的后面指定。


SHN_UNDEF

未定义、缺少、无关或无意义的节引用。例如,定义的相对于节编号 SHN_UNDEF 的符号即是未定义符号。

SHN_LORESERVE

保留索引的范围的下界。

SHN_LOPROC - SHN_HIPROC

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

SHN_LOOS - SHN_HIOS

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

SHN_LOSUNW - SHN_HISUNW

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

SHN_SUNW_IGNORE

此节索引用于在可重定位目标文件中提供临时符号定义。保留供 dtrace(1M) 内部使用。

SHN_BEFORE、SHN_AFTER

SHF_LINK_ORDERSHF_ORDERED 节标志一起提供初始和最终节排序。请参见表 12-8

SHN_AMD64_LCOMMON

特定于 x64 的通用块标签。此标签与 SHN_COMMON 类似,但用于标识较大的通用块。

SHN_ABS

对应引用的绝对值。例如,相对于节编号 SHN_ABS 而定义的符号具有绝对值,不受重定位影响。

SHN_COMMON

相对于此节而定义的符号为通用符号,如 FORTRAN COMMON 或未分配的 C 外部变量。这些符号有时称为暂定符号。

SHN_XINDEX

转义值,用于表示实际节头索引过大,无法放入包含字段。节头索引可在特定于显示节索引的结构的其他位置中找到。

SHN_HIRESERVE

保留索引的范围的上界。系统保留了 SHN_LORESERVESHN_HIRESERVE 之间的索引(包括这两个值)。这些值不会引用节头表。节头表不包含对应于保留索引的项。

节包含目标文件中的所有信息,但 ELF 头、程序头表和节头表除外。此外,目标文件中的各节还满足多个条件:

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

typedef struct {
        elf32_Word      sh_name;
        Elf32_Word      sh_type;
        Elf32_Word      sh_flags;
        Elf32_Addr      sh_addr;
        Elf32_Off       sh_offset;
        Elf32_Word      sh_size;
        Elf32_Word      sh_link;
        Elf32_Word      sh_info;
        Elf32_Word      sh_addralign;
        Elf32_Word      sh_entsize;
} Elf32_Shdr;

typedef struct {
        Elf64_Word      sh_name;
        Elf64_Word      sh_type;
        Elf64_Xword     sh_flags;
        Elf64_Addr      sh_addr;
        Elf64_Off       sh_offset;
        Elf64_Xword     sh_size;
        Elf64_Word      sh_link;
        Elf64_Word      sh_info;
        Elf64_Xword     sh_addralign;
        Elf64_Xword     sh_entsize;
} Elf64_Shdr;
sh_name

节的名称。此成员值是节头字符串表节的索引,用于指定以空字符结尾的字符串的位置。表 12-10 中列出了节名称及其说明。

sh_type

用于将节的内容和语义分类。表 12-5 中列出了节类型及其说明。

sh_flags

节可支持用于说明杂项属性的 1 位标志。表 12-8 中列出了标志定义。

sh_addr

如果节显示在进程的内存映像中,则此成员会指定节的第一个字节所在的地址。否则,此成员值为零。

sh_offset

从文件的起始位置到节中第一个字节的字节偏移。对于 SHT_NOBITS 节,此成员表示文件中的概念性偏移,因为该节在文件中不占用任何空间。

sh_size

节的大小(以字节为单位)。除非节类型为 SHT_NOBITS,否则该节将在文件中占用 sh_size 个字节。SHT_NOBITS 类型的节大小可以不为零,但该节在文件中不占用任何空间。

sh_link

节头表索引链接,其解释依赖于节类型。表 12-9 说明了相应的值。

sh_info

额外信息,其解释依赖于节类型。表 12-9 说明了相应的值。如果此节头的 sh_flags 字段包含属性 SHF_INFO_LINK,则此成员表示节头表索引。

sh_addralign

一些节具有地址对齐约束。例如,如果某节包含双字,则系统必须确保整个节双字对齐。在此情况下,sh_addr 的值在以 sh_addralign 的值为模数进行取模时,同余数必须等于 0。当前,仅允许使用 0 和 2 的正整数幂。01 表示节没有对齐约束。

sh_entsize

一些节包含固定大小的项的表,如符号表。对于这样的节,此成员会指定每一项的大小(以字节为单位)。如果节不包含固定大小的项的表,则此成员值为零。

节头的 sh_type 成员用于指定节的语义,如下表中所示。

表 12-5 ELF 节类型 sh_type

名称
SHT_NULL
0
SHT_PROGBITS
1
SHT_SYMTAB
2
SHT_STRTAB
3
SHT_RELA
4
SHT_HASH
5
SHT_DYNAMIC
6
SHT_NOTE
7
SHT_NOBITS
8
SHT_REL
9
SHT_SHLIB
10
SHT_DYNSYM
11
SHT_INIT_ARRAY
14
SHT_FINI_ARRAY
15
SHT_PREINIT_ARRAY
16
SHT_GROUP
17
SHT_SYMTAB_SHNDX
18
SHT_LOOS
0x60000000
SHT_LOSUNW
0x6fffffee
SHT_SUNW_ancillary
0x6fffffee
SHT_SUNW_capchain
0x6fffffef
SHT_SUNW_capinfo
0x6ffffff0
SHT_SUNW_symsort
0x6ffffff1
SHT_SUNW_tlssort
0x6ffffff2
SHT_SUNW_LDYNSYM
0x6ffffff3
SHT_SUNW_dof
0x6ffffff4
SHT_SUNW_cap
0x6ffffff5
SHT_SUNW_SIGNATURE
0x6ffffff6
SHT_SUNW_ANNOTATE
0x6ffffff7
SHT_SUNW_DEBUGSTR
0x6ffffff8
SHT_SUNW_DEBUG
0x6ffffff9
SHT_SUNW_move
0x6ffffffa
SHT_SUNW_COMDAT
0x6ffffffb
SHT_SUNW_syminfo
0x6ffffffc
SHT_SUNW_verdef
0x6ffffffd
SHT_SUNW_verneed
0x6ffffffe
SHT_SUNW_versym
0x6fffffff
SHT_HISUNW
0x6fffffff
SHT_HIOS
0x6fffffff
SHT_LOPROC
0x70000000
SHT_SPARC_GOTDATA
0x70000000
SHT_AMD64_UNWIND
0x70000001
SHT_HIPROC
0x7fffffff
SHT_LOUSER
0x80000000
SHT_HIUSER
0xffffffff
SHT_NULL

将节头标识为无效。此节头没有关联的节。节头的其他成员具有未定义的值。

SHT_PROGBITS

标识由程序定义的信息,这些信息的格式和含义完全由程序确定。

SHT_SYMTABSHT_DYNSYMSHT_SUNW_LDYNSYM

标识符号表。通常,SHT_SYMTAB 节会提供用于链接编辑的符号。作为完整的符号表,该表可能包含许多对于动态链接不必要的符号。因此,目标文件还可以包含一个 SHT_DYNSYM 节,其中包含一组尽可能少的动态链接符号,从而节省空间。

SHT_DYNSYM 还可以使用 SHT_SUNW_LDYNSYM 节进行扩充。此附加节为运行时环境提供局部函数符号,但对于动态链接来说不是必需的。当不可分配的 SHT_SYMTAB 不可用或已从文件中剥离时,调试器通过使用此节可在运行时上下文中产生精确的栈跟踪。此节还可以为运行时环境提供其他符号信息,以便与 dladdr(3C) 一起使用。

如果 SHT_SUNW_LDYNSYM 节和 SHT_DYNSYM 节同时存在,链接编辑器会将这两者的数据区域紧邻彼此放置。SHT_SUNW_LDYNSYM 节位于 SHT_DYNSYM 节的前面。这种放置方式可以使两个表看起来像是一个更大的连续符号表,其中包含 SHT_SYMTAB 中的缩减符号集合。

有关详细信息,请参见符号表节

SHT_STRTABSHT_DYNSTR

标识字符串表。目标文件可以有多个字符串表节。有关详细信息,请参见字符串表节

SHT_RELA

标识包含显式加数的重定位项,如 32 位目标文件类的 Elf32_Rela 类型。目标文件可以有多个重定位节。有关详细信息,请参见重定位节

SHT_HASH

标识符号散列表。动态链接的目标文件必须包含符号散列表。当前,目标文件只能有一个散列表,但此限制在将来可能会放宽。有关详细信息,请参见散列表节

SHT_DYNAMIC

标识动态链接的信息。当前,目标文件只能有一个动态节。有关详细信息,请参见动态节

SHT_NOTE

标识以某种方法标记文件的信息。有关详细信息,请参见注释节

SHT_NOBITS

标识在文件中不占用任何空间,但在其他方面与 SHT_PROGBITS类似的节。虽然此节不包含任何字节,但 sh_offset 成员包含概念性文件偏移。

SHT_REL

标识不包含显式加数的重定位项,如 32 位目标文件类的 Elf32_Rel 类型。目标文件可以有多个重定位节。有关详细信息,请参见重定位节

SHT_SHLIB

标识具有未指定的语义的保留节。包含此类型的节的程序不符合 ABI。

SHT_INIT_ARRAY

标识包含指针数组的节,这些指针指向初始化函数。数组中的每个指针都被视为不返回任何值的无参数过程。有关详细信息,请参见初始化节和终止节

SHT_FINI_ARRAY

标识包含指针数组的节,这些指针指向终止函数。数组中的每个指针都被视为不返回任何值的无参数过程。有关详细信息,请参见初始化节和终止节

SHT_PREINIT_ARRAY

标识包含指针数组的节,这些指针指向在其他所有初始化函数之前调用的函数。数组中的每个指针都被视为不返回任何值的无参数过程。有关详细信息,请参见初始化节和终止节

SHT_GROUP

标识节组。节组标识一组相关的节,这些节必须作为一个单元由链接编辑器进行处理。SHT_GROUP 类型的节只能出现在可重定位目标文件中。有关详细信息,请参见组节

SHT_SYMTAB_SHNDX

标识包含扩展节索引的节,扩展节索引与符号表关联。如果符号表引用的任何节头索引包含转义值 SHN_XINDEX,则需要关联的 SHT_SYMTAB_SHNDX

SHT_SYMTAB_SHNDX节是 Elf32_Word 值的数组。对于关联的符号表项中的每一项,此数组都包含对应的一项。这些值表示针对其定义符号表项的节头索引。仅当对应符号表项的 st_shndx 字段包含转义值 SHN_XINDEX 时,匹配的 Elf32_Word 才会包含实际的节头索引。否则,该项必须为 SHN_UNDEF (0)。

SHT_LOOSSHT_HIOS

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

SHT_LOSUNWSHT_HISUNW

此范围内包含的值(包括这两个值)保留用于 Oracle Solaris OS 语义。

SHT_SUNW_ancillary

表示该目标文件是一组辅助目标文件的一部分。包含标识构成该组的所有文件所需要的信息。有关详细信息,请参见辅助节

SHT_SUNW_capchain

收集功能系列成员的索引数组。该数组的第一个元素是链版本号。此元素的后面是以 0 结尾的功能符号索引链。每个以 0 结尾的索引组都表示一个功能系列。每个系列的第一个元素是功能前置符号。后面的元素指向系列成员。有关详细信息,请参见功能节

SHT_SUNW_capinfo

将符号表项与功能要求及其前置功能符号关联起来的索引数组。定义符号功能的目标文件包含 SHT_SUNW_cap 节。SHT_SUNW_cap 节头信息指向关联的 SHT_SUNW_capinfo 节。SHT_SUNW_capinfo 节头信息指向关联的符号表节。有关详细信息,请参见功能节

SHT_SUNW_symsort

由相邻的 SHT_SUNW_LDYNSYM 节和 SHT_DYNSYM 节构成的动态符号表的索引数组。这些索引相对于 SHT_SUNW_LDYNSYM 节的开头。这些索引引用包含内存地址的符号。该索引已进行排序,以使索引按照地址递增的顺序引用符号。

SHT_SUNW_tlssort

由相邻的 SHT_SUNW_LDYNSYM 节和 SHT_DYNSYM 节构成的动态符号表的索引数组。这些索引相对于 SHT_SUNW_LDYNSYM 节的开头。这些索引引用线程局部存储符号。请参见第 14 章。该索引已进行排序,以使索引按照偏移递增的顺序引用符号。

SHT_SUNW_LDYNSYM

非全局符号的动态符号表。请参见前面的 SHT_SYMTABSHT_DYNSYMSHT_SUNW_LDYNSYM 说明。

SHT_SUNW_dof

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

SHT_SUNW_cap

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

SHT_SUNW_SIGNATURE

标识模块验证签名。

SHT_SUNW_ANNOTATE

注释节的处理遵循处理节的所有缺省规则。仅当注释节位于不可分配的内存中时,才会发生异常。如果未设置节头标志 SHF_ALLOC,则链接编辑器将在不给出任何提示的情况下忽略针对此节的所有未满足的重定位。

SHT_SUNW_DEBUGSTRSHT_SUNW_DEBUG

标识调试信息。使用链接编辑器的 -z strip-class 选项,或者在链接编辑之后使用 strip(1),可以将此类型的节从目标文件中剥离。

SHT_SUNW_move

标识用于处理部分初始化的符号的数据。有关详细信息,请参见移动节

SHT_SUNW_COMDAT

标识允许将相同数据的多个副本减少为单个副本的节。有关详细信息,请参见COMDAT 节

SHT_SUNW_syminfo

标识其他符号信息。有关详细信息,请参见Syminfo 表节

SHT_SUNW_verdef

标识此文件定义的细分版本。有关详细信息,请参见版本定义章节

SHT_SUNW_verneed

标识此文件所需的细分依赖性。有关详细信息,请参见版本依赖性节

SHT_SUNW_versym

标识用于说明符号与文件提供的版本定义之间关系的表。有关详细信息,请参见版本符号节

SHT_LOPROC - SHT_HIPROC

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

SHT_SPARC_GOTDATA

标识特定于 SPARC 的数据,使用相对于 GOT 的寻址引用这些数据。即,相对于指定给符号 _GLOBAL_OFFSET_TABLE_ 的地址的偏移。对于 64 位 SPARC,此节中的数据必须在链接编辑时绑定到偏离 GOT 地址不超过 {+-} 2^32 字节的位置。

SHT_AMD64_UNWIND

标识特定于 x64 的数据,其中包含对应于栈展开的展开函数表的各项。

SHT_LOUSER

指定保留用于应用程序的索引范围的下界。

SHT_HIUSER

指定保留用于应用程序的索引范围的上界。应用程序可以使用 SHT_LOUSERSHT_HIUSER 之间的节类型,而不会与当前或将来系统定义的节类型产生冲突。

其他节类型值保留。如前所述,即使索引 0 (SHN_UNDEF) 标记了未定义的节引用,仍会存在对应于该索引的节头。下表显示了这些值。

表 12-6 ELF 节头表项:索引 0

名称
附注
sh_name
0
无名称
sh_type
SHT_NULL
无效
sh_flags
0
无标志
sh_addr
0
无地址
sh_offset
0
无文件偏移
sh_size
0
无大小
sh_link
SHN_UNDEF
无链接信息
sh_info
0
无辅助信息
sh_addralign
0
无对齐
sh_entsize
0
无项

如果节或程序头的数目超过 ELF 头数据大小,则节头 0 的各元素将用于定义扩展的 ELF 头属性。下表显示了这些值。

表 12-7 ELF 扩展的节头表项:索引 0

名称
附注
sh_name
0
无名称
sh_type
SHT_NULL
无效
sh_flags
0
无标志
sh_addr
0
无地址
sh_offset
0
无文件偏移
sh_size
e_shnum
节头表中的项数
sh_link
e_shstrndx
与节名称字符串表关联的项的节头索引
sh_info
e_phnum
程序头表中的项数
sh_addralign
0
无对齐
sh_entsize
0
无项

节头的 sh_flags 成员包含用于说明节属性的 1 位标志。

表 12-8 ELF 节属性标志

名称
SHF_WRITE
0x1
SHF_ALLOC
0x2
SHF_EXECINSTR
0x4
SHF_MERGE
0x10
SHF_STRINGS
0x20
SHF_INFO_LINK
0x40
SHF_LINK_ORDER
0x80
SHF_OS_NONCONFORMING
0x100
SHF_GROUP
0x200
SHF_TLS
0x400
SHF_MASKOS
0x0ff00000
SHF_SUNW_NODISCARD
0x00100000
SHF_SUNW_ABSENT
0x00200000
SHF_SUNW_PRIMARY
0x00400000
SHF_MASKPROC
0xf0000000
SHF_AMD64_LARGE
0x10000000
SHF_ORDERED
0x40000000
SHF_EXCLUDE
0x80000000

如果在 sh_flags 中设置了标志位,则该节的此属性处于启用状态。否则,此属性处于禁用状态,或者不适用。未定义的属性会保留并设置为零。

SHF_WRITE

标识在进程执行过程中应可写的节。

SHF_ALLOC

标识在进程执行过程中占用内存的节。一些控制节不位于目标文件的内存映像中。对于这些节,此属性处于禁用状态。

SHF_EXECINSTR

标识包含可执行计算机指令的节。

SHF_MERGE

标识可以将其中包含的数据合并以消除重复的节。除非还设置了 SHF_STRINGS 标志,否则该节中的数据元素大小一致。每个元素的大小在节头的 sh_entsize 字段中指定。如果还设置了 SHF_STRINGS 标志,则数据元素会包含以空字符结尾的字符串。每个字符的大小在节头的 sh_entsize 字段中指定。

SHF_STRINGS

标识包含以空字符结尾的字符串的节。每个字符的大小在节头的 sh_entsize 字段中指定。

SHF_INFO_LINK

此节头的 sh_info 字段包含节头表索引。

SHF_LINK_ORDER

此节向链接编辑器中添加特殊排序要求。如果此节头的 sh_link 字段引用其他节(链接到的节),则会应用这些要求。如果将此节与输出文件中的其他节合并,则此节将按照相同的相对顺序(相对于这些节)显示。同样,链接到的节也将按照相同的相对顺序(相对于与其合并的节)显示。链接到的节必须是未排序的,因而不能指定 SHF_LINK_ORDERSHF_ORDERED

特殊的 sh_linkSHN_BEFORESHN_AFTER(请参见表 12-4)表示,已排序的节将分别位于要排序的集合中的其他所有各节之前或之后。如果已排序集合中的多个节包含这些特殊值之一,则会保持输入文件链接行的顺序。

此标志的一个典型用法是生成按地址顺序引用文本或数据节的表。

如果缺少 sh_link 排序信息,则合并到输出文件一个节内的单个输入文件中的节是相邻的。这些节会与输入文件中的节一样进行相对排序。构成多个输入文件的节按照链接行顺序显示。

SHF_OS_NONCONFORMING

此节除了要求标准链接规则之外,还要求特定于操作系统的特殊处理,以避免不正确的行为。如果此节具有 sh_type 值,或者对于这些字段包含特定于操作系统范围内的 sh_flags 位,并且链接编辑器无法识别这些值,则包含此节的目标文件会由于出错而被拒绝。

SHF_GROUP

此节是节组的一个成员(可能是唯一的成员)。此节必须由 SHT_GROUP 类型的节引用。只能对可重定位目标文件中包含的节设置 SHF_GROUP 标志。有关详细信息,请参见组节

SHF_TLS

此节包含线程局部存储。进程中的每个线程都包含此数据的一个不同实例。有关详细信息,请参见第 14 章

SHF_MASKOS

此掩码中包括的所有位都保留用于特定于操作系统的语义。

SHF_SUNW_NODISCARD

此节无法通过链接编辑器丢弃,并且始终会被复制到输出目标文件中。链接编辑器提供了通过链接编辑放弃未使用的输入节的功能。SHF_SUNW_NODISCARD 节标志将该节排除在此类优化之外。

SHF_SUNW_ABSENT

表示该节的数据在此文件中不存在。创建辅助目标文件后,主目标文件和任何辅助目标文件都具有相同的节头数组。该组织便利了这些目标文件中包含的信息的合并,并允许使用单个符号表。每个文件都包含节数据的一个子集。可分配节的数据将写入主目标文件,而不可分配节的数据将写入辅助文件。SHF_SUNW_ABSENT 标志表示所检查的目标文件中不存在该节的数据。当设置了 SHF_SUNW_ABSENT 标志时,节头的 sh_size 字段必须是 0。遇到 SHF_SUNW_ABSENT 节的应用程序可以选择忽略该节,或选择在其中一个相关辅助文件中搜索节数据。请参见调试器访问及辅助目标文件使用

SHF_SUNW_PRIMARY

创建辅助目标文件时的缺省行为是:将所有可分配节写入主目标文件并将所有不可分配节写入辅助目标文件。SHF_SUNW_PRIMARY 标志可覆盖此行为。包含另一个设置有 SHF_SUNW_PRIMARY 标志的输入节的任何输出节将写入到主目标文件中。

SHF_MASKPROC

此掩码中包括的所有位都保留用于特定于处理器的语义。

SHF_AMD64_LARGE

x64 的缺省编译模型仅用于 32 位位移。此位移限制了节的大小,并最终限制段的大小不得超过 2 GB。此属性标志用于标识可包含超过 2 GB 数据的节。此标志允许链接使用不同代码模型的目标文件。

不包含 SHF_AMD64_LARGE 属性标志的 x64 目标文件节可以由使用小代码模型的目标文件任意引用。包含此标志的节只能由使用较大代码模型的目标文件引用。例如,x64 中间代码模型目标文件可以引用包含此属性标志的节和不包含此属性标志的节中的数据。但是,x64 小代码模型目标文件只能引用不包含此标志的节中的数据。

SHF_ORDERED

SHF_ORDEREDSHF_LINK_ORDER 所提供的旧版本功能,并且已被 SHF_LINK_ORDER 取代。SHF_ORDERED 提供两种不同的功能。首先,可以指定输出节,其次,链接编辑器具有特殊排序要求。

SHF_ORDERED 节的 sh_link 字段可以构成节的链接列表。此列表以包含指向其自身的 sh_link 的最终节结束。此列表中的所有节都将指定给具有此列表中最终节的名称的输出节。

如果已排序节的 sh_info 项在相同输入文件中是有效节,则将基于由 sh_info 项所指向的节的输出文件内的相对排序,对已排序的节进行排序。sh_info 项指向的节必须尚未排序,因而不能指定 SHF_LINK_ORDERSHF_ORDERED

特殊的 sh_infoSHN_BEFORESHN_AFTER(请参见表 12-4)表示,已排序的节将分别位于要排序的集合中的其他所有各节之前或之后。如果已排序集合中的多个节包含这些特殊值之一,则会保持输入文件链接行的顺序。

如果缺少 sh_info 排序信息,则合并到输出文件一个节内的单个输入文件中的节是相邻的。这些节会与输入文件中的节一样进行相对排序。构成多个输入文件的节按照链接行顺序显示。

SHF_EXCLUDE

此节不包括在可执行文件或共享目标文件的链接编辑的输入中。如果还设置了 SHF_ALLOC 标志,或者存在针对此节的重定位,则会忽略此标志。

根据节类型,节头中的两个成员(sh_linksh_info)包含特殊信息。

表 12-9 ELF sh_linksh_info 解释

sh_type
sh_link
sh_info
SHT_DYNAMIC
关联的字符串表的节头索引。
0
SHT_HASH
关联的符号表的节头索引。
0
SHT_REL

SHT_RELA

关联的符号表的节头索引。
如果 sh_flags 成员包含 SHF_INFO_LINK 标志,则为应用重定位的节的节头索引,否则为 0。另请参见表 12-10重定位节
SHT_SYMTAB

SHT_DYNSYM

关联的字符串表的节头索引。
比上一个局部符号 STB_LOCAL 的符号表索引大一。
SHT_GROUP
关联的符号表的节头索引。
关联的符号表中项的符号表索引。指定的符号表项的名称用于提供节组的签名。
SHT_SYMTAB_SHNDX
关联的符号表的节头索引。
0
SHT_SUNW_ancillary
关联的字符串表的节头索引。
0
SHT_SUNW_cap
如果符号功能存在,则为关联的 SHT_SUNW_capinfo 表的节头索引,否则为 0
如果任何功能引用指定的字符串,则为关联的字符串表的节头索引,否则为 0
SHT_SUNW_capinfo
关联的符号表的节头索引。
对于动态目标文件,为关联的 SHT_SUNW_capchain 表的节头索引,否则为 0
SHT_SUNW_symsort
关联的符号表的节头索引。
0
SHT_SUNW_tlssort
关联的符号表的节头索引。
0
SHT_SUNW_LDYNSYM
关联的字符串表的节头索引。此索引是与 SHT_DYNSYM 节所使用的字符串表相同的字符串表。
比上一个局部符号 STB_LOCAL 的符号表索引大一。由于 SHT_SUNW_LDYNSYM 仅包含局部符号,因此 sh_info 等于表中的符号数。
SHT_SUNW_move
关联的符号表的节头索引。
0
SHT_SUNW_COMDAT
0
0
SHT_SUNW_syminfo
关联的符号表的节头索引。
关联的 .dynamic 节的节头索引。
SHT_SUNW_verdef
关联的字符串表的节头索引。
节中版本定义的数量。
SHT_SUNW_verneed
关联的字符串表的节头索引。
节中版本依赖性的数量。
SHT_SUNW_versym
关联的符号表的节头索引。
0