手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

ld(1)

名称

ld - 目标文件的链接编辑器

用法概要

ld [-32 | -64] [-B direct | nodirect] [-B dynamic | static]
[-B eliminate[=mode] | local[=mode]] [-B reduce] [-c name]
[-C] [-D [!]token1,[!]token2,...] [-e epsym
]
[-f name | -F name] [-G] [-h name] [
-i] [-l x] [-L path]
[-m] [-M mapfile] [-N string] [-o outfile] [
-p auditlib]
[-P auditlib] [-Q y | n] [-r] [-R path] [-s]
[-S supportlib] [-u symname] [-V]
[-z allextract | defaultextract | weakextract ]
[-z ancillary[=outfile]] [-z aslr[=mode]]
[-z assert-deflib[=libname]] [-z compress-sections[=cmp-type]]
[-z deferred | nodeferred] [-z defs | nodefs]
[-z direct | nodirect] [-z discard-unused=item1,item2,...]
[-z endfiltee] [-z fatal-warnings | nofatal-warnings]
[-z finiarray=function] [-z globalaudit]
[-z guidance[=item1,item2,...]] [-z help ]
[-z ignore | record] [-z initarray=function] [-z initfirst]
[-z interpose] [-z lazyload | nolazyload]
[-z ld32=arg1,arg2,...] [-z ld64=arg1,arg2,...]
[-z loadfltr] [-z mapfile-add=name] [-z muldefs]
[-z nocompstrtab] [-z nodefaultlib] [-z nodelete]
[-z nodlopen] [-z nodump] [-z noldynsym] [-z nopartial]
[-z origin] [-z parent=object] [-z preinitarray=function]
[-z rescan-now] [-z rescan-start ... -z rescan-end]
[-z strip-class=[!]class1,[!]class2,...] [-z stub]
[-z symbolcap] [-z target=sparc | x86]
[-z text | textwarn | textoff] [-z type=object-type]
[-z verbose] [-z wrap=symbol]
filename ...

描述

链接编辑器 ld 通过解析对符号定义的符号引用以及执行重定位来合并可重定位的目标文件。在所有情况下,链接编辑器的缺省输出都留在文件 a.out 中。请参见“附注”部分。

链接编辑器具有大量选项。“用法概要”部分中定义了与现代编程实践有关的选项,手册页后面的几个部分对这些选项进行了介绍。其他选项不太常用,“辅助选项”部分对这些选项进行了介绍。

链接编辑器使用多种输入文件,这些文件是从编译器、汇编程序或对链接编辑器的先前调用生成的。链接编辑器会串联并解释这些输入文件内的数据,以形成输出文件。生成的输出文件是以下基本类型之一。

  • 动态可执行文件-要求运行时链接程序 ld.so.1(1) 进行干预以生成可运行进程的输入可重定位目标文件的串联。动态可执行文件通常具有一个或多个以共享目标文件形式存在的依赖项。

    使用 –z type=exec 选项时将创建动态可执行文件,或者未提供控制输出文件类型的其他选项时动态可执行文件是缺省值。

  • 与位置无关的可执行文件-共享目标文件的特殊情况,指定解释程序。应该基于与位置无关的代码创建与位置无关的可执行文件。与需要固定地址空间以执行的动态可执行文件不同,可以在由 exec(2) 选择的任意地址处装入与位置无关的可执行文件。

    使用 –z type=pie 选项时将创建与位置无关的可执行文件。

  • 可重定位目标文件-可在后续链接编辑阶段中使用的输入可重定位目标文件的串联。

    使用 –z type=reloc 选项或 –r 选项时将创建可重定位目标文件。

  • 共享目标文件-提供各种服务的输入可重定位目标文件的串联,运行时这些服务可能绑定到动态可执行文件。应基于与位置无关的代码创建共享目标文件。共享目标文件可能依赖于其他共享目标文件。

    使用 –z type=shared 选项或 –G 选项时将创建共享目标文件。

链接编辑器在两种模式(动态或静态)中的一种模式下运行。动态链接模式是缺省设置,供用来创建动态可执行文件、共享目标文件和与位置无关的可执行文件。此动态链接环境紧密结合了链接编辑器和运行时链接程序 ld.so.1(1) 的工作。这两个实用程序及其相关的技术和实用程序详细记录在Oracle Solaris 11.2 链接程序和库指南 中。

静态链接模式供用来创建可重定位目标文件。现代版本的 Oracle Solaris 操作系统不支持创建静态可执行文件。请参见Static Executables。本部分中的所有讨论均假定使用 –ztype=reloc–r 选项进行动态链接或静态链接。

如果任何参数是库,当在命令行中遇到该库时,缺省情况下,链接编辑器将仅搜索该库一次。库可以是共享目标文件也可以是可重定位归档文件。请参见ar(1)

共享目标文件由以前通过链接编辑一个或多个输入文件而生成的不可分割的整个单元组成。链接编辑器处理共享目标文件时,共享目标文件的所有内容将成为生成的输出文件映像的逻辑部分。在链接编辑期间,实际上不会复制共享目标文件,因为其实际包含将延迟到进程执行。包含此逻辑部分意味着,链接编辑过程可以使用在共享目标文件中定义的所有符号项。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 4  章 共享目标文件

对于归档库,缺省情况下,链接编辑器仅装入定义未解析的外部引用的归档成员。链接编辑器按顺序搜索归档库的符号表以解析可满足归档成员的外部引用。此搜索操作将重复执行,直到不存在可由归档解析的外部引用。因此,库中成员的顺序对功能没有影响,除非存在定义相同外部符号的多个归档成员。另请参见 –z allextract 选项。具有相互依赖关系的归档库可能需要多个命令行定义或使用 –z rescan 选项之一。请参见Oracle Solaris 11.2 链接程序和库指南 中的归档处理

对于 SPARC 或 x86 目标,链接编辑器是一个跨链接编辑器,可以链接 32 位目标文件或 64 位目标文件。链接编辑器使用命令行中第一个可重定位目标文件的 ELF 类和计算机类型来控制操作的模式。不允许混用 32 位目标文件和 64 位目标文件。同样,只允许单个计算机类型的目标文件。请参见 –32–64–z target 选项以及 LD_NOEXEC_64 环境变量。

静态可执行文件

许多发行版都建议不要创建静态可执行文件。实际上,Solaris 中从未提供过 64 位系统归档库。因为静态可执行文件是基于系统归档库生成的,所以这种可执行文件包含关于系统实现的详细信息。该自包含特性有许多缺点:

  • 静态可执行文件无法利用以共享目标文件形式发布的系统修补程序。因此,必须重新生成静态可执行文件,才能利用众多的系统改进功能。

  • 这种可执行文件是否能够在未来的发行版上运行可能会受到影响。

  • 系统实现详细信息的重复会对系统性能造成负面影响。

从 Oracle Solaris 10 开始,不再提供 32 位系统归档库。如果没有这些库(特别是 libc.a),没有对未记录的和可更改的系统详细信息的访问权限将无法再创建静态可执行文件。但是,链接编辑器处理静态链接选项以及归档库的功能保持不变。

选项处理

通常,使用命令行选项充分指定链接编辑。但是,提供了各种环境变量来扩充命令行处理。这些变量提供可能与编译器选项冲突的选项。这些变量还用于覆盖或取消设置嵌入脚本和构建环境的命令行选项。

命令行选项之间的任何不一致都将导致致命错误状态。与环境变量提供的选项有关的任何不一致都将导致警告,第一个选项优先。

按以下顺序从环境和命令行解释选项。

  • 从 LD_OPTIONS 环境变量。

  • 从命令行。

  • 从 LD_UNSET 环境变量。

从这三个组件确定输出目标文件类型。然后使用此目标文件类型来调查任何 LD_{object-type}_UNSET 和 LD_{object-type}_OPTIONS 环境变量,以删除或添加特定于正在构建的目标文件类型的选项。object-type 以大写形式提供 –z type 选项定义的类型,是 EXECPIERELOCSHARED 之一。例如,输出文件类型是动态可执行文件时,将解释 LD_EXEC_OPTIONS 选项。按以下顺序处理这些环境变量。

  • 从 LD_{object-type}_UNSET 环境变量。

  • 从 LD_{object-type}_OPTIONS 环境变量。

与此输出目标文件类型不一致的任何命令行选项都将导致致命错误状态。环境变量提供的任何不一致选项都将导致警告,并将忽略该选项。

任何 UNSET 操作都会伴随有警告通知。通过设置 –z fatal-warnings 选项,任何其他选项处理警告都可以升级为致命错误状态。

选项

支持以下选项。

–32 | –64
–m32 | –m64

创建 32 位或 64 位目标文件。

缺省情况下,要生成的目标文件的类根据从命令行处理的第一个 ELF 目标文件来确定。如果未指定任何目标文件,类由从命令行处理的第一个归档文件中遇到的第一个目标文件确定。如果没有目标文件或归档文件,链接编辑器将创建 32 位目标文件。

仅从 mapfile 创建 64 位目标文件时才需要 –64 选项。

–32–64 选项还可用在下面的罕见情况中:完全从同时包含 32 和 64 位目标文件的归档文件链接。如果归档文件中的第一个目标文件不是需要创建的目标文件的类,–32–64 选项可用来指向链接编辑器。

–B direct | nodirect

这些选项控制是否直接绑定。–B direct 通过记录符号引用与提供符号定义的依赖项之间的关系来建立直接绑定信息。此外,可以在符号引用与要创建的目标文件中的关联定义之间建立直接绑定信息。运行时链接程序使用此信息直接在关联目标文件中搜索符号而不是执行缺省符号搜索。

只能对使用链接编辑指定的依赖项建立直接绑定信息。因此,还应添加 –z defs 选项。希望在直接绑定环境中插入符号的目标文件应使用 –z interpose 选项将自身标识为插入项。使用 –B direct 还会对所有依赖项启用 –z lazyload

–B nodirect 选项禁止直接绑定到要创建的目标文件所提供的接口。通过指定 –z direct 选项,可以将要创建的目标文件继续直接绑定到外部接口。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 6  章 直接绑定

–B dynamic | static

这些选项用于控制库包含。–B dynamic 允许 –l 选项库搜索扩展至共享目标文件和归档库名称。此选项仅在动态模式下有效,并且是缺省选项。–B static–l 选项库搜索限定为仅扩展至归档库名称。可以在命令行上任意次地指定这些选项以进行切换。如果指定了 –B static 选项,在切换为 –B dynamic 选项之前,不会接受任何共享目标文件。请参见 –l 选项。

–B eliminate[=mode] | local[=mode]

导致缺省设置为全局绑定的任何符号从符号表中被删除,或缩减为局部可见。具有 STV_DEFAULT 可见性的全局符号可以由链接编辑器缩减为更具限制性的可见性。具有任何其他 STV_ 可见性的全局符号被视为具有显式可见性。链接编辑器遵循显式可见性,不能修改。请参见Oracle Solaris 11.2 链接程序和库指南 中的符号可见性。符号可见性可以通过编译器指令或通过定义版本或接口定义的 mapfiles 显式定义。

Mapfile 版本和接口定义可以包含 auto-eliminationauto-reduction 指令。请参见Oracle Solaris 11.2 链接程序和库指南 中的定义其他符号。这些指令将导致未在 mapfile 中显式定义或者没有定义显示可见性的符号分别被删除或缩减为局部。除了任何显式符号定义,符号的删除或缩减还会受所生成目标文件类型影响,如随后的段落所述。–B eliminate 选项与 mapfile auto-elimination 指令请求相同的符号删除。–B local 选项与 mapfile auto-reduction 指令请求相同的符号缩减。

任一选项均可通过模式 externalnoexternal 来控制对删除全局符号或缩减全局符号的选择。此微调通常是不必要的,因为缺省情况下链接编辑器会根据所生成目标文件的类型来采用相应模式:external 适用于可执行文件,noexternal 适用于共享目标文件。

构建动态目标文件时,可能需要确保某些符号保持全局状态,以便可以从外部依赖项引用这些符号。对于动态可执行文件而言尤其如此。构建可执行文件时,可重定位目标文件由支持运行时进程初始化的编译环境提供。这些可重定位目标文件可以包含从系统依赖项引用的全局符号。无论采用任何自动删除或自动缩减符号技术,这些符号均应保持全局状态,以便不会影响运行时执行。

mode 定义为 external 时会分析任何外部依赖项,以确定依赖项中的任何符号引用是否可能绑定到所构建目标文件内的符号定义。任何符合此绑定的全局符号都不会被删除或缩减为局部。此模式是生成动态可执行文件时的缺省模式。

mode 定义为 noexternal 会绕过对任何外部依赖项的分析,这样,所有未在 mapfile 中显式定义或没有定义显式可见性的符号均会缩减。此模式是生成共享目标文件时的缺省模式。

另请参见 –B reduce 选项。

–B reduce

生成可重定位目标文件时,任何符号可见性属性所定义的符号信息或者通过定义版本或接口定义的 mapfiles 定义的符号信息会被缩减。缺省情况下,生成可重定位目标文件时,可见性属性、版本定义或接口定义仅会记录在输出映像中。创建动态可执行文件或共享目标文件时,可见性属性或 mapfile 版本或接口定义始终应用于任何符号信息。

–c name

记录配置文件的 name 以便在运行时使用。可以使用配置文件来改变缺省搜索路径,提供目录高速缓存以及提供备选目标文件依赖项。请参见 crle(1)。仅当创建动态可执行文件或与位置无关的可执行文件时才能使用此选项。

–C

取消改编 C++ 符号名称显示在诊断消息中。

–D [!]token1,[!]token2,...

按每个 token 的指定将调试信息输出为标准错误。特殊标记 help 指示可用标记的完整列表。请参见Oracle Solaris 11.2 链接程序和库指南 中的调试帮助

–e epsym
–-entry epsym

将输出文件的入口点地址设置为符号 epsym

–f name
–-auxiliary name

仅当构建共享目标文件时才使用。指定将共享目标文件的符号表用作 name 所指定的共享目标文件的符号表上的辅助过滤器。允许使用此选项的多个实例。此选项不能与 –F 选项一起使用。请参见Oracle Solaris 11.2 链接程序和库指南 中的生成辅助过滤器

–F name
–-filter name

仅当构建共享目标文件时才使用。指定将共享目标文件的符号表用作 name 所指定的共享目标文件的符号表上的过滤器。允许使用此选项的多个实例。此选项不能与 –f 选项一起使用。请参见Oracle Solaris 11.2 链接程序和库指南 中的生成标准过滤器

–G
–shared

仅在动态模式下,生成共享目标文件。允许使用未定义的符号。另请参见 –ztype=shared 选项。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 4  章 共享目标文件

–h name
–-soname name

仅在动态模式下,当构建共享目标文件时,在目标文件的动态部分中记录 namename 记录在与此目标文件而不是目标文件的文件系统名链接的任何动态目标文件中。因此,name 由运行时链接程序用作共享目标文件的名称以在运行时进行搜索。请参见Oracle Solaris 11.2 链接程序和库指南 中的记录共享目标文件名称

–i

忽略 LD_LIBRARY_PATH。当 LD_LIBRARY_PATH 设置实际影响运行时库搜索(这会干扰正在执行的链接编辑)时,此选项非常有用。

–l x
–-library x

搜索 libx.solibx.a 库,它们分别是共享目标文件和归档库的常规名称。在动态模式下,除非 –B static 选项有效,否则链接编辑器将在库搜索路径中指定的每个目录中搜索 libx.solibx.a 文件。目录搜索在包含任何一个文件的第一个目录处停止。链接编辑器会选择以 .so 结尾的文件,条件是 –lx 扩展为两个文件,这两个文件的名称采用 libx.solibx.a 形式。如果未找到 libx.so,链接编辑器将接受 libx.a。在静态模式下,或 –B static 选项有效时,链接编辑器仅选择以 .a 结尾的文件。遇到库时链接编辑器将搜索库,所以 –l 的位置非常重要。请参见Oracle Solaris 11.2 链接程序和库指南 中的与其他库链接

–L path
–-library-path path

path 添加到库搜索目录。链接编辑器首先在 –L 选项指定的任何目录中搜索库,然后在共享目录中搜索。仅当此选项位于 –L 选项应用到的 –l 选项之前时,此选项才有用。请参见Oracle Solaris 11.2 链接程序和库指南 中的链接编辑器搜索的目录

环境变量 LD_LIBRARY_PATH 可用于补充库搜索路径,但是建议使用 –L 选项,因为环境变量也会由运行时环境解释。请参见“环境变量”部分的 LD_LIBRARY_PATH。

–m

在标准输出中生成内存映射或输入/输出部分列表,以及任何非致命多重定义符号。

–M mapfile

读取 mapfile 作为链接编辑器指令的文本文件。可以多次指定此选项。如果 mapfile 是目录,则将处理该目录中的所有正规文件(如 stat(2) 所定义)。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 8  章 Mapfile/usr/lib/ld 中提供了示例 mapfile。请参见“文件”部分。

–N string

此选项会将 DT_NEEDED 条目添加到所生成的目标文件的 .dynamic 部分中。DT_NEEDED 字符串的值为在命令行上指定的 string。此选项与位置有关,且 DT_NEEDED .dynamic 条目与链接编辑行上搜索到的其他动态依赖项有关。当组合使用 –dy–r 选项时,此选项适用于在设备驱动程序可重定位目标文件中指定依赖项。

–o outfile
–-output outfile

生成名为 outfile 的输出目标文件。缺省目标文件的名称为 a.out

–p auditlib

标识审计库 auditlib。此审计库用于审计在运行时创建的目标文件。共享目标文件被标识为要求使用 –p 选项进行审计,将该共享目标文件指定为依赖项的任何目标文件都将继承此项要求。请参见 –P 选项。请参见Oracle Solaris 11.2 链接程序和库指南 中的运行时链接程序审计接口

–P auditlib

标识审计库 auditlib。此审计库用于审计在运行时创建的目标文件的依赖项。依赖项审计还可以从标识为要求审计的依赖项继承。请参见 –p 选项和 –z globalaudit 选项。请参见Oracle Solaris 11.2 链接程序和库指南 中的运行时链接程序审计接口

–Q y | n

使用 –Q y 时,会将 ident 字符串添加到输出文件的 .comment 部分。此字符串标识用于创建文件的链接编辑器的版本。当有多个链接步骤时,例如当使用链接编辑器 – ztype=reloc–r 选项时,这将导致多个链接编辑器 idents。此标识与 cc 命令的缺省操作相同。–Q n 将隐藏版本标识。.comment 部分可以通过 mcs(1) 实用程序来处理。

–r
–-relocatable

合并可重定位目标文件以生成一个可重定位目标文件。链接编辑器不受未解析引用的影响。此选项不能与 –a 选项一起使用。另请参见 –ztype=reloc 选项。

–R path
–rpath path

冒号分隔的目录列表,用于指定运行时链接程序的库搜索目录。如果路径存在且不为空,将在输出目标文件中记录路径并将其传递给运行时链接程序。此选项的多个实例与各个用冒号分隔的 path 串联在一起。请参见Oracle Solaris 11.2 链接程序和库指南 中的运行时链接程序搜索的目录

在关联目标文件中使用 runpath 比设置全局搜索路径(例如通过 LD_LIBRARY_PATH 环境变量)更可取。仅应记录查找目标文件依赖项所需的 runpaths。ldd(1) 在与 –U 选项一起使用时,还可用于在动态目标文件中搜索未使用的 runpaths。

还可以通过 runpath 来提供各种标记,运行路径提供了标识系统功能或目标文件位置的灵活方式。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 10  章 使用动态字符串标记建立依赖性$ORIGIN 标记特别适用于将动态目标文件重定位到文件系统中的其他位置。

–s
–-strip-all

从输出文件中分离任何符号信息。这些选项等效于组合使用 –z strip-class 选项与 debugsymbol 类标识符。另请参见 –z redlocsym–z noldynsym 选项。

–S supportlib

使用链接编辑器装入共享目标文件 supportlib,并提供有关链接进程的信息。使用 –S 选项定义的共享目标文件还可通过使用 SGS_SUPPORT 环境变量来提供。请参见Oracle Solaris 11.2 链接程序和库指南 中的链接编辑器支持接口

–u symname
–-undefined symname

在符号表中作为未定义的符号输入 symname。此选项适用于完全从归档库装入。在此实例中,需要使用未解析的引用来强制装入第一个例程。此选项在命令行上的位置非常重要。此选项必须置于定义符号的库之前。请参见Oracle Solaris 11.2 链接程序和库指南 中的使用 -u 选项定义其他符号

–V
–-version

输出消息,提供关于正在使用的链接编辑器版本的信息。

–z allextract | defaultextract | weakextract
–-whole-archive | –-no-whole-archive

从跟随的任何归档中更改目标文件的提取条件。缺省情况下,将提取归档成员以满足未定义的引用并通过数据定义提升暂定的定义。弱符号引用不会触发提取。使用 –z allextract–-whole-archive 选项时,从归档中提取所有归档成员。使用 –z weakextract 时,弱引用触发归档提取。–z defaultextract–-no-whole-archive 选项提供一种在使用前面的提取选项之后返回缺省值的方法。请参见Oracle Solaris 11.2 链接程序和库指南 中的归档处理

–z ancillary[=outfile]

指定一个辅助输出文件,用于接收通常将添加到输出目标文件的不可分配部分。运行时不需要不可分配部分,它们主要由调试器和其他监测工具使用。如果 outfile 存在,将使用指定的名称创建辅助文件。如果 outfile 不存在,则辅助文件的名称为主输出文件的名称加 .anc 后缀。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 2  章 链接编辑器

–z stub 选项一起使用时,–z ancillary 选项会被静默忽略。在以下情况下也会忽略 –z ancillary 选项:即在指定该选项时未指定 outfile,以及通过 –o 选项指定的输出文件是设备特殊文件(如 /dev/null)。

–z aslr[=mode]

指定可执行文件的地址空间布局随机化 (Address Space Layout Randomization, ASLR) 行为。可以将模式值设置为 enabledisable。如果省略模式,则启用 ASLR。仅当创建动态可执行文件或与位置无关的可执行文件时才能使用此选项。

–z assert-deflib[=libname]

允许为使用通过检查链接编辑器提供的缺省搜索路径找到的 –l 命令行选项指定的库发出警告消息。如果提供 libname 值,将启用缺省库警告功能,并将指定的库添加到不为其发出警告的库列表中。可以指定多个 –z assert-deflib 选项以指定多个不应为其发出警告的库。

libname 值应为链接编辑器找到的不带任何路径组件的库文件的名称。例如,以下选项允许发出缺省库警告,但标准 C 库除外。

$ ld ... -z assert-deflib=libc.so ...

–z assert-deflib 是专用选项,主要用于这样的版本环境:其中存在多个具有相同名称的目标文件且需要对所使用的库实行严格控制。该选项不用于一般用途。

–z compress-sections[=cmp-type]
–-compress-debug-sections cmp-type

启用注释和调试输出节的压缩。可识别 cmp-type 的以下值。

none

不进行压缩。这等效于不指定 –z compress-sections 选项。

zlib

使用 ZLIB 压缩来压缩候选节。生成的输出节将设置 SHF_COMPRESSED 节标志来标识使用了压缩。

zlib-gnu

使用 ZLIB 压缩、使用 GNU 节压缩格式来压缩所有候选节。此格式要求候选节具有以 .debug 开头的名称。生成的节将重命名为以 .zdebug 开头来标识使用了压缩。

如果省略了 cmp-type,则使用 zlib 样式。对于压缩格式将大于原始未压缩数据的任何节,链接编辑器将静默跳过压缩。

要成为压缩候选项,节必须是不可分配的并且属于以下类之一。

annotate

注释节提供内存访问工具和覆盖相关工具使用的信息。这些部分通过 SHT_SUNW_ANNOTATE 节类型来进行标识。

debug

调试节通过 .compcom.line.stab*.debug*.zdebug* 节名称来进行标识。这些节还通过 SHT_PROGBITSSHT_SUNW_DEBUG* 节类型进行标识。

zlib-gnu 压缩类型仅限于名称以 .debug 开头的节。使用 zlib-gnu 时,将不压缩本将是压缩候选项的节。对于 zlibzlib-gnu 样式,底层 ZLIB 压缩是相同的,这两种格式对于给定输入节提供相同压缩量。这两种样式的不同之处在于候选节选择、压缩头的格式以及如何标识压缩的节。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 2  章 链接编辑器。除非特别要求使用 zlib-gnu 样式,否则推荐使用更通用的缺省 zlib 样式。

–z deferred | nodeferred

允许或禁止将动态依赖项标记为延迟。标记为 deferred 的动态依赖项也将标记为延迟可装入,且不会在初始进程启动时装入。在首次绑定到延迟引用时,延迟依赖项的装入过程会延迟到进程执行。与基本的延迟可装入依赖项不同,不会在处理 LD_BIND_NOW 时处理延迟依赖项,也不会通过带有 RTLD_NOW 标志的 dlopen(3C) 来处理延迟依赖项。请参见Oracle Solaris 11.2 链接程序和库指南 中的测试功能

组合使用延迟依赖项以及 dlsym(3C)RTLD_PROBE 句柄,可提供灵活机制和自然编码样式以供测试功能使用。

–z defs | nodefs
–-no-undefined

–z defs 选项和 –-no-undefined 选项会在链接末尾保留有任何未定义的符号时强制生成致命错误。此模式是构建可执行文件时的缺省模式。由于历史原因,此模式是构建共享目标文件时的缺省模式。建议使用 –z defs 选项,因为此模式可保证所构建的目标文件是自包含的。自包含目标文件在内部解析所有符号引用,或解析到目标文件的直接依赖项。

–z nodefs 选项允许未定义的符号。由于历史原因,此模式是构建共享目标文件时的缺省模式。与可执行文件一起使用时,未指定对此类未定义符号的引用的行为。不建议使用 –z nodefs 选项。

–z direct | nodirect

允许或禁止直接绑定到命令行上跟在其后的任何依赖项。与全局等效 –B direct 相比,这些选项允许对直接绑定进行更精确的控制。–z direct 选项在以下方面也与 –B direct 选项不同。不会在符号引用与要创建的目标文件中的关联定义之间建立直接绑定信息。不支持延迟装入。

–z discard-unused=item1,item2,...

缺省情况下,链接编辑器会放弃未使用的空部分。在链接编辑期间,可能会将其他类别的输入材料确定为未使用。使用 –z discard-unused 选项可自动删除此类项目。可以识别以下 item 标记。

sections

通过链接编辑创建的输出文件中未使用的部分将被放弃。

files

通过链接编辑创建的输出文件中未使用的可重定位目标文件将被放弃。

如果可重定位目标文件提供的所有可分配部分均未使用,则可将该输入可重定位目标文件确定为未使用。另请参见 –z guidance 选项中有关“不需要的可重定位目标文件”的论述。

dependencies

通过链接编辑创建的输出文件中不会记录未使用的显式共享目标文件依赖项。

显式依赖项是指使用路径名或通过使用 –l 选项(更为常用)在命令行上定义的依赖项。显式依赖项可以依赖于其他目标文件,后者被称为隐式依赖项。如果符合以下两个条件,则可将显式依赖项确定为未使用。

  • 未从所构建的目标文件中引用该依赖项提供的任何全局符号。

  • 该依赖项不补偿任何隐式依赖项的要求。

另请参见 –z guidance 选项中有关“不需要的或补偿性的依赖项”的论述。

none

禁用所有未使用的处理,包括删除未使用的空部分的缺省操作。

另请参见Oracle Solaris 11.2 链接程序和库指南 中的删除未使用的材料

–z endfiltee

标记 filtee 以便在过滤器进行处理时,filtee 可终止过滤器进行的任何进一步的 filtee 搜索。请参见Oracle Solaris 11.2 链接程序和库指南 中的减少 filtee 搜索

–z fatal-warnings | nofatal-warnings
–-fatal-warnings | –-no-fatal-warnings

使用 –z fatal-warnings–-fatal-warnings 选项可使链接编辑器将警告视为致命错误。

使用 –z nofatal-warnings–-no-fatal-warnings 选项可使链接编辑器将警告视为非致命错误。这是缺省行为。

–z finiarray=function

在所构建的目标文件的 .fini_array 部分后附加一个条目。如果不存在 .fini_array 部分,将创建该部分。新条目将初始化为指向 function。请参见Oracle Solaris 11.2 链接程序和库指南 中的初始化节和终止节

–z globalaudit

此选项对已使用 –P 选项记录的审计库定义进行补充。仅当创建动态可执行文件或与位置无关的可执行文件时才能使用此选项。使用 –P 选项在目标文件中定义的审计库通常允许审计该目标文件的直接依赖项。–z globalaudit 将审计程序升级为全局审计程序,因此允许审计所有依赖项。请参见Oracle Solaris 11.2 链接程序和库指南 中的调用审计接口

使用 –P 选项和 –z globalaudit 选项建立的审计程序等效于使用 LD_AUDIT 环境变量建立的审计程序。请参见 ld.so.1(1)

–z guidance[=item1,item2,...]

提供指南消息来指示链接编辑器选项,这些选项可以改进所生成目标文件的质量,或者在其他方面被视为有益。提供的特定指南在系统升级时可能会发生更改。链接编辑器早期版本中提供的过时指南在新版本中可能会被删除。类似地,新指南可能会添加到链接编辑器的新版本中。因此,指南始终代表当前最佳做法。

通过提供代表要禁止的指南类的 item 标记列表,可以启用指南但禁止特定指南消息。这样,可以禁止不需要的建议而不会失去其他指南的优点。链接编辑器将静默忽略无法识别的 item 标记,从而可在 Solaris 的各种早期或新版本上执行给定命令行。

下面是当前版本的链接编辑器提供的指南以及用于禁止这些消息的 item 标记。

指定所需依赖项

动态可执行文件和共享目标文件应明确定义它们所需的所有依赖项。如果在构建动态目标文件时有任何符号引用不能满足要求,指南建议使用 –z defs 选项。可以使用 –z guidance=nodefs 禁用此指南。

不指定不需要的或补偿性的依赖项

动态可执行文件和共享目标文件不应定义不满足动态目标文件建立的符号引用的任何显式依赖项。指南建议删除不需要的或未使用的依赖项。未使用的依赖项可以是以下两个类别中的一种。

  • 不满足符号引用要求的显式依赖项。

  • 不满足所构建动态目标文件的符号引用要求,但会补偿隐式依赖项的显式依赖项。请参见 –z discard-unused 选项中有关“依赖项”的论述。

可以通过 –z guidance=nounused-dependencies 或同义词 –z guidance=nounused 来禁用这两个类别的指南。可以通过 –z guidance=nounused-compensators 禁用补偿依赖项的指南。

另请参见Oracle Solaris 11.2 链接程序和库指南 中的删除未使用的材料

不指定不需要的可重定位目标文件

如果某个可重定位目标文件的可分配部分未由链接编辑所涉及的任何其他目标文件所引用,则所创建的输出文件不应包含该可重定位目标文件的任何信息。指南建议删除未使用的可重定位目标文件。可以使用 –z guidance=nounused-files 禁用此指南。

另请参见Oracle Solaris 11.2 链接程序和库指南 中的删除未使用的材料

延迟装入

应标识依赖项以进行延迟装入。如果在遇到 –z lazyload–z nolazyload 选项之前要处理任何依赖项,指南建议使用 –z lazyload 选项。可以使用 –z guidance=nolazyload 禁用此指南。

直接绑定

应使用直接绑定来引用依赖项。如果在遇到 –B direct–z direct 选项之一或者 –z nodirect 选项之前要处理任何依赖项,指南建议使用前两个选项中的一个。可以使用 –z guidance=nodirect 禁用此指南。

纯文本段

动态目标文件不应包含不可写但可分配部分的重定位。如果针对文本段的任何重定位持续,且未遇到 –z textwarn–z textoff 选项,指南建议使用位置无关代码 (Position Independent Code, PIC) 编译目标文件。可以使用 –z guidance=notext 禁用此指南。

Mapfile 语法

所有 mapfile 应使用版本 2 mapfile 语法。如果遇到任何使用版本 1 语法的 mapfile,指南将建议使用版本 2 语法。可以使用 –z guidance=nomapfile 禁用此指南。

库搜索路径

将静默忽略链接编辑器遇到的不正确的依赖项。例如,将忽略在生成 64 位目标文件时遇到的 32 位依赖项。这些依赖项可以由不正确的搜索路径设置产生,例如提供不正确的 –L 选项。尽管此依赖项是有利的,但其处理会造成浪费,而且可能会隐藏应解决的版本问题。指南建议删除任何不合适的依赖项。可以使用 –z guidance=nolibpath 禁用此指南。

此外,–z guidance=noall 可用来完全禁用指南功能。有关指南的更多信息和构建更好的目标文件的建议,请参见Oracle Solaris 11.2 链接程序和库指南 中的第 5  章 链接编辑器快速参考

–z help
–-help

在标准输出中输出命令行选项的摘要并退出。

–z ignore | record
–-as-needed | –-no-as-needed

忽略或记录未作为链接编辑的一部分引用的共享目标文件依赖项。这些选项是位置选项,用于切换链接编辑器如何处理在命令行上遇到的未引用的依赖项。遇到 –z ignore 时,将静默忽略任何后续未引用依赖项。遇到 –z record 时,将记录所有依赖项,而不考虑依赖项是否被引用。

缺省情况下,链接编辑器记录所有依赖项,无论是否引用了依赖项。可以使用非位置 –z discard-unused=dependencies 选项来更改此初始缺省设置。确立初始设置后,可以使用 –z ignore–z record 来更改缺省行为。

–z initarray=function

在所构建的目标文件的 .init_array 部分后附加一个条目。如果不存在 .init_array 部分,将创建该部分。新条目将初始化为指向 function。请参见Oracle Solaris 11.2 链接程序和库指南 中的初始化节和终止节

–z initfirst

标记目标文件以便先对该目标文件进行运行时初始化,然后再对同时进入进程的任何其他目标文件进行运行时初始化。此外,在对该目标文件进行运行时终结化之前,先对同时从进程中删除的任何其他目标文件进行运行时终结化。此选项仅在构建共享目标文件时有意义。

–z interpose

将目标文件标记为插入项。在运行时,如果已使用 –z interpose 选项标记某个目标文件,则会将该目标文件标识为显式插入项。在使用 LD_PRELOAD 环境变量装入目标文件时,也会建立显式插入项。由于目标文件的装入顺序可能会出现隐含插入,但是,此隐含插入对于运行时链接程序是未知的。显式插入可确保不论目标文件的装入顺序如何都会进行插入。显式插入还可确保当直接绑定有效时,运行时链接程序在任何显式插入项中搜索符号。

–z lazyload | nolazyload

允许或禁止将动态依赖项标记为延迟装入。标记为 lazyload 的动态依赖项在初始进程启动时不会装入。这些依赖项将延迟到首次绑定目标文件时装入。注意:延迟装入要求对依赖项以及进程中使用的每个动态目标文件的关联 runpaths 进行正确声明。请参见Oracle Solaris 11.2 链接程序和库指南 中的延迟装入动态依赖项

–z ld32=arg1,arg2,...
–z ld64=arg1 ,arg2,...

链接编辑器的类受所创建的输出文件的类以及底层操作系统的功能影响。–z ld[ 32|64] 选项提供定义任何链接编辑器参数的方法。定义的参数分别仅由链接编辑器的 32 位类或 64 位类解释。

例如,支持库是类特定的,因此可以使用以下选项确保支持库的类正确:

$ ld ... -z ld32=-Saudit32.so.1 -z ld64=-Saudit64.so.1 ...
–z loadfltr

标记过滤器以指示必须在运行时立即处理 filtee。通常,过滤器处理会延迟到某个符号引用绑定到该过滤器。包含此标志的目标文件的运行时处理将模拟 LD_LOADFLTR 环境变量生效时的运行时处理。请参见 ld.so.1(1)

–z mapfile-add=name

name 添加到已知的 mapfile 条件输入表达式谓词列表中。此选项等效于在链接编辑器读取的第一个 mapfile 的顶部放置以下行。

$mapfile_version 2
$add name

通过 –z mapfile-add 输入的名称可以与 mapfile $if$elif 指令一起使用来有条件地处理 mapfile 输入。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 8  章 Mapfile

–z muldefs
–-allow-multiple-definition

允许多个符号定义。缺省情况下,在可重定位目标文件之间出现多个符号定义会导致致命错误。此选项将禁止错误条件出现,并允许采用第一个符号定义。

–z nodelete

将目标文件标记为在运行时不可删除。此模式类似于通过组合使用 dlopen(3C)RTLD_NODELETE 模式将目标文件添加到进程中。

–z nodlopen

将目标文件标记为对 dlopen(3C) 不可用,即标记为 dlopen() 指定的目标文件或标记为 dlopen() 指定的目标文件所需的任何形式的依赖项。此选项仅在构建共享目标文件时有意义。

–z nodump

将目标文件标记为对 dldump(3C) 不可用。

–z parent=object

指定父目标文件,该目标文件可以是可执行文件或共享目标文件,针对该目标文件链接输出目标文件。通常,在创建要在运行时由可执行文件通过 dlopen() 函数装入的插件共享目标文件时,使用此选项。父目标文件的符号表用于满足来自插件目标文件的引用。请参见Oracle Solaris 11.2 链接程序和库指南 中的第 2  章 链接编辑器

–z preinitarray=function

在所构建的目标文件的 .preinit_array 部分后附加一个条目。如果不存在 .preinit_array 部分,将创建该部分。新条目将初始化为指向 function。请参见Oracle Solaris 11.2 链接程序和库指南 中的初始化节和终止节

–z rescan-now

这些选项重新扫描提供给链接编辑的归档文件。缺省情况下,当命令行上出现归档时,将立即处理归档。传统上来说,在命令行末尾指定归档,以便其符号定义可解析任何前述引用。但是,有必要多次指定归档以满足其自身的相互依赖项。

–z rescan-now 是位置选项,在命令行上遇到该选项时链接编辑器会立即处理该选项。将立即重新处理命令行上此时显示的所有归档以尝试定位解析符号引用的其他归档成员。将重复此归档重新扫描操作,直到通过归档传递时未提取新成员。

–z rescan-start ... –z rescan-end
–-start-group ... --end-group
–( ... -)

定义归档重新扫描组。这是位置构造,在遇到封闭分隔符选项时链接编辑器会立即进行处理。将在组分隔符选项中找到的归档重新处理为组以尝试定位解析符号引用的其他归档成员。将重复此归档重新扫描操作,直到通过归档传递时未提取新成员。无法嵌套归档重新扫描组。

–z strip-class=[!]class1,[!]class2 ,...

从任何输入目标文件分离特定的部分类,禁止将这些部分添加到输出文件。通过此选项,可以对可在输出文件中忽略的部分进行细粒度控制。

以下分离类描述仅适用于不可分配的部分。

可以在每个类标记前加上“!”,以指示不应删除该类。此定义在与 nonalloc 类结合时非常有用。例如,使用 "–z strip-class=nonalloc,!note" 将删除所有不可分配部分(附注部分除外)。

分离的部分将从输出目标文件中彻底删除。使用 –z ancillary 选项可更改与非动态符号表 .symtab 有关的此行为以及与其相关的部分。缺省情况下,符号表会同时写入主目标文件和辅助目标文件。分离后,符号表将仅写入辅助目标文件,而在主目标文件中标记为不存在。如果在不使用 –z ancillary 的情况下从目标文件分离 .symtab,将以常规方式彻底删除该部分。

可以定义以下部分类。

nonalloc

分离任何不可分配部分。这些部分标识为不包括 SHF_ALLOC 节标志。此类可封装除 symbol 类以外的所有其他类。nonalloc 类往往本身即足以删除任何不需要的部分。

annotate

分离任何注释部分。这些部分提供内存访问工具和覆盖相关工具使用的信息。这些部分通过 SHT_SUNW_ANNOTATE 节类型来进行标识。

comment

分离任何注释部分。这些部分通过 .comment 节名称来进行标识。此外,mcs(1) 实用程序通常用于处理注释部分。

debug

分离通常用于包含调试数据的部分。这些部分通过 .compcom.line.stab*.debug*.zdebug* 节名称来进行标识。这些部分还可通过 SHT_SUNW_DEBUG* 节类型来进行标识。

exclude

分离任何可排除的部分。这些部分通过 SHF_EXCLUDE 节标志来进行标识。在创建可重定位目标文件时此类非常有用。缺省情况下,当创建动态可执行文件或共享目标文件时会自动排除此类部分,在创建可重定位目标文件时将保留此类部分。

说明

分离任何注释部分。这些部分通过 SHT_NOTE 节类型来进行标识。

符号

如果输出文件不是可重定位目标文件,则分离任何不可分配符号表和字符串表部分。这些部分通过 SHT_SYMTAB 节类型来进行标识。任何关联的字符串表也将删除。

–z stub

生成桩共享目标文件。桩目标文件是可提供与实际目标文件相同的链接接口但不包含代码或数据的共享目标文件,完全由 mapfile 生成。桩目标文件不能在运行时使用。但是,可以根据桩目标文件构建应用程序,桩目标文件提供要在运行时使用的实际目标文件名称,然后在运行时使用实际目标文件。

只能为共享目标文件生成桩目标文件,必须提供定义要导出的全局符号的 mapfile。因此使用 –z stub 时将需要 –ztype=shared– G 选项和 –M 选项。在生成桩目标文件时,链接编辑器将忽略在命令行中指定的任何目标文件或库文件,无需存在这些文件即可生成桩目标文件。由于可以省略编译步骤,并且相对而言链接编辑器只需进行少量操作,因此可以很快生成桩目标文件。

请参见《链接程序和库指南》中的“桩目标文件”。

–z symbolcap

将定义目标文件功能的可重定位目标文件转换为定义符号功能的可重定位目标文件。请参见Oracle Solaris 11.2 链接程序和库指南 中的将目标文件功能转换为符号功能

–z target=sparc | x86

指定输出目标文件的机器类型。支持的目标有 SPARC 和 x86。使用指定目标的 32 位机器类型,除非存在 –64 选项,这种情况下使用相应的 64 位机器类型。缺省情况下,要生成的目标文件的机器类型根据在命令行处理的第一个 ELF 目标文件来决定。如果未指定任何目标文件,机器类型由在命令行处理的第一个归档文件中遇到的第一个目标文件决定。如果没有目标文件或归档文件,链接编辑器将假定使用本地机器。使用输入仅来自 mapfile 的链接编辑器直接创建目标文件时,此选项非常有用。请参见 –M 选项。在极少数情况下,完全从包含不同机器类型目标文件的归档文件进行链接时(此时第一个目标文件不是所需的机器类型),此选项也非常有用。

–z text | textoff | textwarn

这些选项只能在动态模式下使用。如果针对不可写但可分配部分的任何重定位持续进行,–z text 选项将强制发出致命错误。由于历史原因,此模式不是构建可执行文件或共享目标文件时的缺省模式。但是,建议使用此模式以确保可在多个正在运行的进程之间共享所构建的动态目标文件的文本段。共享文本段可使在装入内存时重定位系统开销最少。请参见Oracle Solaris 11.2 链接程序和库指南 中的与位置无关的代码

–z textoff 选项允许针对所有可分配部分(包括不可写部分)进行重定位。此模式是构建共享目标文件时的缺省模式。

如果针对不可写但可分配部分的任何重定位持续进行,–z textwarn 选项将列出警告。此模式是构建可执行文件时的缺省模式。

–z type=object-type

指定要创建的目标文件的类型。可使用以下目标文件类型。

exec

动态可执行文件。

pie

与位置无关的可执行文件。此选项还声明 –ztext 选项。

reloc

可重定位目标文件。这等效于指定 –r 选项。

shared

共享目标文件。这等效于指定 –G 选项。此选项还声明 –ztext 选项。

–z verbose

此选项在链接编辑期间提供附加警告诊断。当前,此选项支持以下警告。

  • 对交换区重新定位的可疑使用。

  • 构建共享目标文件时限制使用静态 TLS 重定位。

  • 符号可见性不一致。

将来可能会增强此选项的功能,以提供被认为太混乱而不能在缺省情况下生成的其他诊断。

–zwrap=symbol
–wrap= symbol
–-wrap= symbol

重命名对 symbol 的未定义引用以允许将包装代码链接到输出目标文件而不必修改源代码。如果指定 –z wrap,将修改对 symbol 的所有未定义引用以引用 __wrap_symbol,并修改对 __real_symbol 的所有引用以引用 symbol。您应提供包含 __wrap_symbol 函数的目标文件。此包装函数可以调用 __real_symbol 以引用要包装的实际函数。

以下是适用于 malloc(3C) 函数的包装示例。

void *
__wrap_malloc(size_t c)
{
        (void) printf("malloc called with %zu\n", c);
        return (__real_malloc(c));
}

如果使用 –z wrap=malloc 将其他代码链接到此文件以编译所有目标文件,则对 malloc 的所有调用将改为调用函数 __wrap_malloc。对 __real_malloc 的调用将调用 malloc 实函数。

应在单独的源文件中维护实函数和包装函数。否则,编译器或汇编程序可能会解析调用而不是将该操作留给链接编辑器执行,并且可能阻止进行包装。

辅助选项

辅助选项

以下选项不太常用。这些选项支持向后兼容性、非常专业化的功能或已被改进的选项变体取代的选项。

–a

仅在静态模式下,生成静态可执行文件。不允许未定义的引用。此选项是静态模式的缺省行为。–a 选项不可与 –ztype=reloc–r 选项一起使用。请参见“描述”部分的“静态可执行文件”。

–b

仅在动态模式下,不对引用共享目标文件中的符号的动态可执行文件重定位进行特殊处理。如果不提供 –b 选项,链接编辑器将在动态可执行文件中应用技术以便文本段可以保持只读状态。一种技术是为共享目标文件中定义的函数的引用创建特殊位置无关重定位。另一种技术安排在运行时将在共享目标文件中定义的数据目标文件复制到可执行文件的内存映像中。

–b 选项旨在用于专用动态目标文件,不建议用于一般用途。使用该选项将禁止执行确保目标文件可共享性时需要的所有专门处理操作,甚至可能会禁止重定位 64 位可执行文件。

–B group

建立作为组的共享目标文件及其依赖项。组中的目标文件在运行时绑定到组的其他成员。此模式类似于通过组合使用 dlopen(3C)RTLD_GROUP 模式将目标文件添加到进程中。对标识为组的目标文件具有显式依赖性的目标文件会成为该组的成员。

由于该组必须为自包含,因此,使用 –B group 选项还将断言 –z defs 选项。

建立一个组可提供控制一组目标文件绑定的基本方式。不过,可以通过直接绑定实现更好的控制。请参见 –B direct 选项。

–B symbolic

仅适用于动态模式。构建共享目标文件时,将该目标文件中全局符号的引用绑定到其定义(如果可用)。通常,在运行时才会绑定共享目标文件中全局符号的引用,即使有定义可用也是如此。此模型允许在可执行文件或其他共享目标文件中定义相同符号来覆盖目标文件自己的定义。链接编辑器针对未定义的符号发出警告,除非 –z defs 覆盖。

–B symbolic 选项旨在用于专用动态目标文件,不建议用于一般用途。要缩减目标文件所需的运行时重定位处理,建议创建版本定义并使用直接绑定。请参见 –B direct 选项。

–d y | n

指定 –d y(缺省值)时,链接编辑器使用动态链接。指定 –d n 时,链接编辑器使用静态链接。请参见“描述”部分的“静态可执行文件”以及 –B dynamic|static

–I name
–-dynamic-linker name

在构建可执行文件时,使用 name 作为要写入程序头的解释程序的路径名。在静态模式下,缺省为没有解释程序。在动态模式下,缺省为运行时链接程序 ld.so.1(1) 的名称。任何一种情况都可以由 –I name 覆盖。exec(2) 在装入 a.out 时会装入此解释程序,并将控件传递给该解释程序而不是直接传递给 a.out

–t

对具有不同大小或不同对齐方式的多重定义的暂定(通用块)数据符号关闭警告。此选项等效于指定 –z relax=common 选项。

–Wl,option

–Wl, 选项提供一种通过编译器驱动程序传递链接编辑器选项的方式。编译器驱动程序通常分离 –Wl, 并将其余选项传递到链接编辑器。实例已经发生,特别是当构建复杂可移植软件时,其中已经使用整个 –Wl, 选项直接调用了链接编辑器。要在这种情况下提供灵活性,链接编辑器分离 –Wl, 并解释其余选项。因为此类选项通常不在用户控制之下,所有无法识别的 –W 选项都会导致警告,而不是致命错误,并将忽略该选项。

–Y P,dirlist

更改用于查找库的缺省目录。dirlist 是冒号分隔的路径列表。应该不需要更改缺省搜索路径。在较新版本的操作系统中可以更改缺省搜索路径。使用此选项显式指示完整搜索路径会有变为与较新版本操作系统不兼容的风险。将维护此选项来支持一些编译器驱动程序的历史使用。虽然受支持,但不建议这样使用。链接编辑需要使用的其他搜索路径应该使用 –L 选项来提供。

–z absexec

仅当构建动态可执行文件时才使用。指定应立即解析外部绝对符号的引用而不是留到运行时进行解析。在非常专业化的情况下,此选项将删除可能导致可执行文件要求的交互空间过大的文本重定位。

–z altexec64

执行 64 位链接编辑器。历史上,已执行的链接编辑器的类由所创建的 ELF 目标文件的类决定。现在,已执行的链接编辑器的类由底层系统的类决定。在当前系统上,这始终是 64 位。此选项维持向后兼容性。

–z combreloc | nocombreloc

缺省情况下,当构建可执行文件或共享目标文件时,链接编辑器会合并多个重定位部分。此部分合并不同于可重定位目标文件合并,在部分合并中,重定位部分与必须应用重定位的部分维持一一对应的关系。–z nocombreloc 选项禁止合并重定位部分,并保持在原始可重定位目标文件中找到的一一对应关系。

链接编辑器按数据重定位部分条目的符号引用对这些条目进行排序。此排序会减少运行时符号查找。在合并多个重定位部分时,此排序在将目标文件装入内存时可能产生最少的重定位系统开销,并加快动态目标文件的运行时装入。

历史上,单个重定位部分已转入任何可执行文件或共享目标文件中,并且需要 –z combreloc 选项才能启用前面所述的重定位部分合并。重定位部分合并现在是缺省设置。由于旧版本环境的好处,–z combreloc 选项仍可接受,但该选项不是必需的,且不起作用。

–z groupperm | nogroupperm

分配或取消分配跟在唯一组后的每个依赖项。将依赖项分配给组的作用就如同使用 –B group 选项构建依赖项。

–z nocompstrtab

禁用 ELF 字符串表和注释部分的压缩。缺省情况下,字符串压缩适用于 SHT_STRTAB 部分、设置了 SHF_MERGESHF_STRINGS 节标志的 SHT_PROGBITS 部分以及注释部分。

mcs(1) 实用程序搭配 –c 选项时,可用于在构建目标文件后压缩注释部分。

–z nodefaultlib

标记目标文件以忽略在任何 LD_LIBRARY_PATH 或 runpaths 后使用的运行时缺省库搜索路径。此选项表明可以通过目标文件的 runpath 来满足目标文件的所有依赖项。

–z noldynsym

禁止在动态可执行文件或共享目标文件中包含 .SUNW_ldynsym 部分。.SUNW_ldynsym 部分通过为本地函数提供符号来增大 .dynsym 部分。本地函数符号允许调试器在精简程序的栈跟踪中显示本地函数名称。同样,dladdr(3C) 能够提供更准确的结果。

–z noldynsym 选项还禁止包含与 .SUNW_ldynsym 部分相关的两个符号排序部分。.SUNW_dynsymsort 部分提供对正则函数和变量符号的有序访问。.SUNW_dyntlssort 部分提供对线程本地存储 (TLS) 变量符号的有序访问。

成为所生成文件的可分配文本段一部分的 .SUNW_ldynsym.SUNW_dynsymsort.SUNW_dyntlssort 部分无法通过 strip(1) 删除。因此,–z noldynsym 选项是禁止其包含的唯一方式。

–z nopartial

在要生成的输出文件中展开在可重定位目标文件中定义的部分初始化的符号。

–z now

将目标文件标记为需要 non-lazy 运行时绑定。此模式类似于通过组合使用 dlopen(3C)RTLD_NOW 模式将目标文件添加到进程中。此模式还类似于使 LD_BIND_NOW 环境变量起作用。请参见 ld.so.1(1)

–z origin

将目标文件标记为需要在运行时立即进行 $ORIGIN 处理。维护此选项只是为了历史兼容性,因为现在缺省提供目标文件的运行时分析以进行 $ORIGIN 处理。

–z redlocsym

删除所有本地符号,但符号表 SHT_SYMTAB 中的 SECT 符号除外。引用本地符号的所有重定位将更新为引用相应的 SECT 符号。通过此选项,专用目标文件可显著减小其符号表大小。另请参见 –z strip-class–z noldynsym 选项。

尽管 –z redlocsym 选项对特殊目标文件(例如在操作系统内核中使用的那些目标文件)很有用,但不建议将该选项用于一般用途。符号表 SHT_SYMTAB 的大小不影响运行时行为,而删除本地符号可能会对过程观察产生负面影响。删除本地符号可以减少使用编译器驱动程序 –g 选项生成的调试信息。删除本地符号还会删除正常写入到 .SUNW_ldynsym 部分中的信息,从而会降低调试器和工具(如 pstack(1)truss(1))的效用。

–z relax=item1,item2,...

链接编辑器执行有效性检查,以便确保生成的输出目标文件有效并可在运行时使用。此外,链接编辑器还可以转换各种重定位来生成更好的说明序列。可以使用 –z relax 选项来解除有效性检查和重定位转换,以便生成原本会被拒绝的输出目标文件。


注 - 禁用有效性检查会导致创建损坏或原本不可用的目标文件。–z relax 是专用选项,主要用于编译器作者,不适用于一般用途。

可以禁用的有效性检查和重定位转换以及用于禁用它们的 item 标记如下所示。

comdat

当使用引用已删除 COMDAT 部分的符号而遇到重定位时,链接编辑器通常会发出致命错误。如果启用 –z relax=comdat,链接编辑器转而将此类重定位重定向到已保持的 COMDAT 部分中的等效符号。

common

–z relax=common 对具有不同大小或不同对齐方式的多重定义的暂定(通用块)数据符号关闭警告。

secadj

ELF 目标文件要求特定部分在输出目标文件中按指定顺序互相相邻。链接编辑器自动维护此类排序,但尝试显式对各部分进行布局的链接编辑器 mapfiles 可能会中断此排序。链接编辑器将此类无效布局视为致命错误。可以使用 –z relax=secadj 禁用此错误。

symbound

符号不能引用其包含节之外的内存,否则生成的目标文件可能会访问无效内存。缺省情况下,链接编辑器将此类符号视为致命错误。可以使用 –z relax=symbound 禁用此错误。

transdisp

在 SPARC 上,一系列 GOTDATA 重定位可以相对于全局偏移表 (Global Offset Table, GOT) 提供对数据的访问。本地绑定的数据项允许链接编辑器转换关联的代码序列,从而提供更优化的访问模型。但是,仅为访问 GOT 地址的 +/- 2 GB 内的数据提供此模型。超出此限制的重定位会导致致命错误。数据引用极少会超出此限制,可以使用 –z relax=transdisp 选项调整 GOTOP 访问模型转换。此解除可以删除地址范围限制,但是会轻微降低代码序列优化。

transtls

线程局部存储 (Thread-Local Storage, TLS) 访问提供大量数据访问模型。请参见Oracle Solaris 11.2 链接程序和库指南 中的线程局部存储的访问模型。链接编辑器可以基于正在创建的输出文件转换关联的代码序列和符号可见性。可以使用 –z relax=transtls 选项禁止 TLS 访问模型转换。

–z relaxreloc

此选项等效于指定 –z relax=comdat 选项。

–z rescan

一个与位置无关的选项,可导致重新扫描提供给链接编辑的归档文件。链接编辑器会将重新扫描操作推迟到在它处理整个命令行之后再进行,然后开始对命令行上显示的所有归档执行最终重新扫描操作。–z rescan 操作可与包含初始化 (.init) 或终结化 (.fini) 部分的目标文件进行不正确地交互,从而禁止这些部分中的代码运行。由于此原因,–z rescan 已过时,建议使用 –z rescan-now

环境变量

LD_ALTEXEC

备用链接编辑器路径名称。链接编辑器执行并将控制传递给此备用链接编辑器。此环境变量提供用于覆盖从各种编译器驱动程序调用的缺省链接编辑器的通用方法。请参见 –z altexec64 选项。

LD_LIBRARY_PATH

要在其中搜索使用 –l 选项指定的库的目录列表。多个目录之间用冒号分隔。在最普遍的情况中,此环境变量包含两个由分号分隔的目录列表。

dirlist1;dirlist2

如果使用出现的任意数量的 –L 来调用链接编辑器,如下所示:

$ ld ... -Lpath1 ... -Lpathn ...

则搜索路径顺序为:

dirlist1 path1 ... pathn dirlist2 LIBPATH

如果目录列表不包含分号,该列表将被解释为 dirlist2

LD_LIBRARY_PATH 环境变量还会影响动态依赖项的运行时链接程序搜索。

可以使用 _32 或 _64 后缀指定此环境变量。这会使环境变量分别特定于 32 位或 64 位进程,并覆盖任何有效的无后缀版的环境变量。

LD_NOEXEC_64

禁止自动执行 64 位链接编辑器。已执行的链接编辑器的类由底层系统的类决定。在当前系统上,这始终是 64 位。32 位链接编辑器可以创建的 64 位映像具有一些限制。但是,某些链接编辑可能会发现使用 32 位链接编辑器的速度更快。

LD_OPTIONS、LD_UNSET、LD_{object-type}_UNSET、LD_{object-type}_OPTIONS

这些环境变量提供了一种在链接编辑器命令行中添加其他选项或删除现有选项的方式。object-type 以大写形式提供 –z type 选项定义的类型,是 EXECPIERELOCSHARED 之一。这些变量用于覆盖或取消设置嵌入脚本和构建环境的命令行选项。请参见“选项处理”。

LD_RUN_PATH

用于指定链接编辑器的 runpath 的备用机制。请参见 –R 选项。如果同时指定 LD_RUN_PATH 和 –R 选项,–R 将取代另一个选项。

SGS_SUPPORT

提供使用链接编辑器装入的共享目标文件的冒号分隔列表以及有关链接进程的给定信息。可以使用 _32 或 _64 后缀指定此环境变量。这会使环境变量分别特定于链接编辑器的 32 位或 64 位类,并覆盖任何有效的无后缀版的环境变量。请参见 –S 选项。

请注意,以字符 "LD_" 开头的环境变量名称是保留名称,供将来可能提升 ldld.so.1(1) 时使用。

文件

libx.so

共享目标文件库。

libx.a

归档库。

a.out

缺省输出文件。

LIBPATH

对于 32 位库,缺省搜索路径为 /lib,后跟 /usr/lib。对于 64 位库,缺省搜索路径为 /lib/64,后跟 /usr/lib/64

/usr/lib/ld

包含多个可在链接编辑期间使用的 mapfile 的目录。这些 mapfile 提供多种功能,例如定义内存布局、对齐 bss 以及定义不可执行栈。

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/linker
接口稳定性
Committed(已确定)

另请参见

as(1)crle(1)elfcompress(1)gprof(1)ld.so.1(1)ldd(1)mcs(1)pvs(1)strip(1)exec(2)stat(2)zlib (3) 、dlopen(3C)dldump(3C)elf(3ELF)ar.h(3HEAD)a.out(4)attributes(5)

Oracle Solaris 11.2 链接程序和库指南

附注

由于历史原因,维护由链接编辑器应用的缺省选项。在今天的编程环境中,动态目标文件占主导地位,备用缺省选项通常会更有意义。但是,必须维护历史缺省选项以确保与现有程序开发环境的兼容性。本手册中在可能的地方提到了历史缺省选项。有关最新推荐的选项的描述,请参见Oracle Solaris 11.2 链接程序和库指南 中的第 5  章 链接编辑器快速参考

如果由链接编辑器创建的文件已经存在,则在处理完所有输入文件后,该文件将解除链接。然后,将创建具有指定名称的新文件。这允许链接编辑器创建新版本的文件,同时允许正在访问旧文件内容的现有进程继续运行。如果旧文件没有其他链接,则当最后一个引用文件的进程终止时,将释放已删除文件的磁盘空间。

在 Oracle Solaris 11 中,对于所创建的文件已存在的情况,链接编辑器的行为已更改。在早期版本中,将现有文件重写到适当的位置,这种方法可能会损坏任何使用该文件的正在运行的进程。此更改对于在文件系统中具有多个硬链接的输出文件有意义。以前,所有链接都保持不变,而且所有链接都可以访问新文件内容。新的链接编辑器行为中断了此类链接,其结果是只有指定的输出文件名才能引用新文件。所有其他链接继续引用旧文件。为了确保行为一致,依赖于指向链接程序输出文件的多个硬链接的应用程序应该明确删除其他文件名,然后再重新链接这些文件名。