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] [-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 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 nodelete] [-z nodlopen] [-z parent=object] [-z preinitarray=function] [-z rescan-now] [-z rescan-start ... -z rescan-end] [-z strip-class=[!]class1,[!]class2,...] [-z stub] [-z sx=extension[=mode]] [-z symbolcap] [-z sysroot=dir] [-z target=sparc | x86] [-z text | textwarn | textoff] [-z type=object-type] [-z verbose] [-z wrap=symbol] file ...
链接编辑器 ld 通过解析对符号定义的符号引用以及执行重定位来合并可重定位的目标文件。在所有情况下,链接编辑器的缺省输出都留在文件 a.out 中。请参见“附注”部分。
链接编辑器具有大量选项。“用法概要”部分中定义了与现代编程实践有关的选项,手册页后面的几个部分对这些选项进行了介绍。其他选项不太常用,“辅助选项”部分对这些选项进行了介绍。
链接编辑器使用多种输入文件,这些文件是从编译器、汇编程序或对链接编辑器的先前调用生成的。链接编辑器会串联并解释这些输入文件内的数据,以形成输出文件。生成的输出文件是以下基本类型之一。
动态可执行文件 - exec(2) 可执行的可重定位目标文件的串联。动态可执行文件是在固定的虚拟地址空间装入,并在运行时链接程序 ld.so.1(1) 的控制下执行,以生成运行时进程。动态可执行文件通常具有一个或多个以共享目标文件形式存在的依赖项。
使用 –z type=exec 选项时将创建动态可执行文件,或者未提供控制输出文件类型的其他选项时动态可执行文件是缺省值。
内核模块 - 一种特殊的可重定位目标文件,包含动态链接信息,可由操作系统内核装入。内核模块可能依赖于其他内核模块。
使用 –z type=kmod 选项时将创建内核模块。
位置无关的可执行文件 (Position-independent Executable, PIE) - 位置无关的动态可执行文件,可由 exec(2) 执行。位置无关的可执行文件是在任意虚拟地址空间装入,并在运行时链接程序 ld.so.1(1) 的控制下执行,以生成运行时进程。位置无关的可执行文件通常具有一个或多个以共享目标文件形式存在的依赖项。
使用 –z type=pie 选项时将创建与位置无关的可执行文件。
可重定位目标文件 - 可在后续链接编辑阶段中使用的可重定位目标文件的串联。
使用 –z type=reloc 选项或 –r 选项时将创建可重定位目标文件。
共享目标文件 - 为其他动态目标文件提供服务的可重定位目标文件的串联。共享目标文件是在任意虚拟地址空间装入并受运行时链接程序 ld.so.1(1) 控制,在运行时绑定到可执行文件或其他共享目标文件共享目标文件可能依赖于其他共享目标文件。
使用 –z type=shared 选项或 –G 选项时将创建共享目标文件。
静态可执行文件 - 可直接由 exec(2) 执行的可重定位目标文件的串联,无需运行时链接程序 ld.so.1(1) 提供协助。
使用 –z type=static 选项或 –a 选项时将创建静态可执行文件。但是,现代版本的 Oracle Solaris 操作系统不支持创建静态可执行文件。请参见“静态可执行文件”部分。
本节所有讨论内容是假定构造动态目标文件、可重定位目标文件或内核模块。
动态链接环境紧密结合了链接编辑器和运行时链接程序 ld.so.1 (1) 的工作。这些实用程序详细记录在《Oracle Solaris 11.4 链接程序和库指南》中。
动态可执行文件和位置无关的可执行文件统称为可执行文件。这些可执行文件和共享目标文件一起统称为动态目标文件。
共享目标文件和可重定位归档文件(使用 ar(1) 创建的)统称为库。如果任何参数是库,当在命令行中遇到该库时,缺省情况下,链接编辑器将仅搜索该库一次。
共享目标文件由以前通过链接编辑一个或多个输入文件而生成的不可分割的整个单元组成。链接编辑器处理共享目标文件时,共享目标文件的所有内容将成为生成的输出文件映像的逻辑部分。在链接编辑期间,实际上不会复制共享目标文件,因为其实际包含将延迟到进程执行。包含此逻辑部分意味着,链接编辑过程可以使用在共享目标文件中定义的所有符号项。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的第 4 章 "Shared Objects"。
对于归档库,缺省情况下,链接编辑器仅装入定义未解析的外部引用的归档成员。链接编辑器按顺序搜索归档库的符号表以解析可满足归档成员的外部引用。此搜索操作将重复执行,直到不存在可由归档解析的外部引用。因此,库中成员的顺序对功能没有影响,除非存在定义相同外部符号的多个归档成员。另请参见 –z allextract 选项。具有相互依赖关系的归档库可能需要多个命令行定义或使用 –z rescan 选项之一。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Archive Processing"。
对于 SPARC 或 x86 目标,链接编辑器是一个跨链接编辑器,可以链接 32 位目标文件或 64 位目标文件。链接编辑器使用命令行中第一个可重定位目标文件的 ELF 类和计算机类型来控制操作的模式。不允许混用 32 位目标文件和 64 位目标文件。同样,只允许单个计算机类型的目标文件。请参见 –32、–64 和 –z target 选项。
为了提供高效的任意虚拟地址空间映射,应通过位置无关的代码 (position-independent code, PIC) 创建位置无关的可执行文件和共享目标文件。请参见 –z text 选项。
许多发行版都建议不要创建静态可执行文件。实际上,Solaris 中从未提供过 64 位系统归档库。因为静态可执行文件是基于系统归档库生成的,所以这种可执行文件包含关于系统实现的详细信息。该自包含特性有许多缺点:
静态可执行文件无法利用以共享目标文件形式发布的系统修补程序。因此,必须重新生成静态可执行文件,才能利用众多的系统改进功能。
这种可执行文件是否能够在未来的发行版上运行可能会受到影响。
系统实现详细信息的重复会对系统性能造成负面影响。
从 Oracle Solaris 10 开始,不再提供 32 位系统归档库。如果没有这些库(特别是 libc.a),没有对未记录的和可更改的系统详细信息的访问权限将无法再创建静态可执行文件。但是,链接编辑器处理静态链接选项以及归档库的功能保持不变。
通常,使用命令行选项充分指定链接编辑。此外,提供了各种环境变量来扩充命令行处理。这些变量提供可能与编译器选项冲突的选项。这些变量还用于覆盖或取消设置嵌入脚本和构建环境的命令行选项。
命令行选项之间的任何不一致都将导致致命错误状态。与环境变量提供的选项有关的任何不一致都将导致警告,第一个选项优先。
从 LD_OPTIONS 环境变量处理初始选项,后跟命令行,然后是 LD_UNSET 环境变量。
可从这三个部分确定要创建的输出文件的初始目标文件类型。然后使用此目标文件类型来调查任何 LD_{object-type}_UNSET 和 LD_{object-type}_OPTIONS 环境变量。这些变量可删除或添加特定于正在构建的目标文件类型的选项。
object-type 与 –z type 选项接受的大写形式的值对应,并且是 EXEC、KMOD、PIE、RELOC 或 SHARED 之一。例如,当目标文件类型是动态可执行文件时,将解释 LD_EXEC_OPTIONS 环境变量。
如果 LD_{object-type}_OPTIONS 存在,则首先搜索该变量以查明是否指定了 –z type 选项。此搜索提供了影响被创建的输出文件的目标文件类型的最后机会。
目标文件类型现在最终确定,将处理此最终目标文件类型的关联环境变量。请注意,这些变量不能更改目标文件类型或类。
选项处理可按以下顺序总结如下。
从 LD_OPTIONS 环境变量。
从命令行。
从 LD_UNSET 环境变量。
从 LD_{object-type}_OPTIONS 环境变量-仅搜索 –z type 选项。
从 LD_{object-type}_UNSET 环境变量。
从 LD_{object-type}_OPTIONS 环境变量。
以下示例将执行构建过程,其中由链接编辑器创建的所有目标文件都启用了指南。任何动态可执行文件都变为与位置无关的可执行文件,并启用了一些安全扩展。任何共享目标文件确保包含与位置无关的代码,并定义其所有依赖项。
$ LD_OPTIONS=-zguidance \ LD_EXEC_OPTIONS=-ztype=pie \ LD_PIE_OPTIONS=-zsx=aslr,nxheap,nxstack \ LD_SHARED_OPTIONS="-ztext -zdefs" <build process>
与此输出目标文件类型不一致的任何命令行选项都将导致致命错误状态。环境变量提供的任何不一致选项都将导致警告,并将忽略该选项。
任何 UNSET 操作都会伴随有警告通知。通过设置 –z fatal-warnings 选项,任何其他选项处理警告都可以升级为致命错误状态。
支持以下选项。
创建 32 位或 64 位目标文件。
缺省情况下,要生成的目标文件的类根据从命令行处理的第一个 ELF 目标文件来确定。如果未指定任何目标文件,类由从命令行处理的第一个归档文件中遇到的第一个目标文件确定。如果没有目标文件或归档文件,链接编辑器将创建 32 位目标文件。
仅从 mapfile 创建 64 位目标文件时才需要 –64 选项。
–32 或 –64 选项还可用在下面的罕见情况中:完全从同时包含 32 和 64 位目标文件的归档文件链接。如果归档文件中的第一个目标文件不是需要创建的目标文件的类,–32 或 –64 选项可用来指向链接编辑器。
这些选项控制是否直接绑定。–B direct 选项通过记录符号引用与提供符号定义的依赖项之间的关系来建立直接绑定信息。此外,可以在符号引用与要创建的目标文件中的关联定义之间建立直接绑定信息。运行时链接程序使用此信息直接在关联目标文件中搜索符号而不是执行缺省符号搜索。
只能对使用链接编辑指定的依赖项建立直接绑定信息。因此,还应添加 –z defs 选项。希望在直接绑定环境中插入符号的目标文件应使用 –z interpose 选项将自身标识为插入项。使用 –B direct 还会对所有依赖项启用 –z lazyload。
–B nodirect 选项禁止直接绑定到要创建的目标文件所提供的接口。通过指定 –z direct 选项,可以将要创建的目标文件继续直接绑定到外部接口。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的第 7 章 "Direct Bindings"。
这些选项用于控制库包含。–B dynamic 选项允许 –l 选项库搜索扩展至共享目标文件和归档库名称。此选项仅在动态模式下有效,并且是缺省选项。–B static 将 –l 选项库搜索限定为仅扩展至归档库名称。可以在命令行上任意次地指定这些选项以进行切换。如果指定了 –B static 选项,在切换为 –B dynamic 选项之前,不会接受任何共享目标文件。请参见 –l 选项。
导致缺省设置为全局绑定的任何符号从符号表中被删除,或缩减为局部可见。具有 STV_DEFAULT 可见性的全局符号可以由链接编辑器缩减为更具限制性的可见性。具有任何其他 STV_ 可见性的全局符号被视为具有显式可见性。链接编辑器遵循显式可见性,不能修改。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Symbol Visibility"。符号可见性可以通过编译器指令或通过定义版本或接口定义的 mapfiles 显式定义。
Mapfile 版本和接口定义可以包含 auto-elimination 或 auto-reduction 指令。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "SYMBOL_SCOPE and SYMBOL_VERSION Directives"。这些指令将导致未在 mapfile 中显式定义或者没有定义显示可见性的符号分别被删除或缩减为局部。除了任何显式符号定义,符号的删除或缩减还会受所生成目标文件类型影响,如随后的段落所述。–B eliminate 选项与 mapfile auto-elimination 指令请求相同的符号删除。–B local 选项与 mapfile auto-reduction 指令请求相同的符号缩减。
任一选项均可通过模式 external 或 noexternal 来控制对删除全局符号或缩减全局符号的选择。此微调通常是不必要的,因为缺省情况下链接编辑器会根据所生成目标文件的类型来采用相应模式:external 适用于可执行文件,noexternal 适用于共享目标文件。
构建动态目标文件时,可能需要确保某些符号保持全局状态,以便可以从外部依赖项引用这些符号。对于可执行文件而言尤其如此。构建可执行文件时,可重定位目标文件由支持运行时进程初始化的编译环境提供。这些可重定位目标文件可以包含从系统依赖项引用的全局符号。无论采用任何自动删除或自动缩减符号技术,这些符号均应保持全局状态,以便不会影响运行时执行。
将 mode 定义为 external 时会分析任何外部依赖项,以确定依赖项中的任何符号引用是否可能绑定到所构建目标文件内的符号定义。任何符合此绑定的全局符号都不会被删除或缩减为局部。此模式是生成可执行文件时的缺省模式。
将 mode 定义为 noexternal 会绕过对任何外部依赖项的分析,这样,所有未在 mapfile 中显式定义或没有定义显式可见性的符号均会缩减。此模式是生成共享目标文件时的缺省模式。
另请参见 –B reduce 选项。
生成可重定位目标文件时,任何符号可见性属性所定义的符号信息或者通过定义版本或接口定义的 mapfiles 定义的符号信息会被缩减。缺省情况下,生成可重定位目标文件时,可见性属性、版本定义或接口定义仅会记录在输出映像中。创建动态目标文件或内核模块时,可见性属性或 mapfile 版本或接口定义始终应用于任何符号信息。
记录配置文件的 name 以便在运行时使用。可以使用配置文件来改变缺省搜索路径,提供目录高速缓存以及提供备选目标文件依赖项。请参见 crle(1)。仅当创建动态可执行文件或与位置无关的可执行文件时才能使用此选项。
取消改编 C++ 符号名称显示在诊断消息中。
按每个 token 的指定输出调试信息。特殊标记 help 指示可用标记的完整列表。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Debugging Aids"。如果只指定了特殊标记 help,则输出的是标准输出。如果指定了任何其他标记,则输出的是标准错误。
将输出文件的入口点地址设置为符号 epsym。
仅当构建共享目标文件时才使用。指定将共享目标文件的符号表用作 name 所指定的共享目标文件的符号表上的辅助过滤器。允许使用此选项的多个实例。此选项不能与 –F 选项一起使用。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Generating Auxiliary Filters"。
仅当构建共享目标文件时才使用。指定将共享目标文件的符号表用作 name 所指定的共享目标文件的符号表上的过滤器。允许使用此选项的多个实例。此选项不能与 –f 选项一起使用。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Generating Standard Filters"。
仅在动态模式下,生成共享目标文件。允许使用未定义的符号。另请参见 –z type=shared 选项。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的第 4 章 "Shared Objects"。
仅在动态模式下,当构建共享目标文件或内核模块时,在目标文件的动态部分中记录 name。name 记录在与此目标文件而不是目标文件的文件系统名链接的任何动态目标文件中。因此,name 分别由运行时链接程序或内核运行时链接程序用作共享目标文件的名称以在运行时进行搜索。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Recording a Shared Object Name"。
忽略 LD_LIBRARY_PATH。当 LD_LIBRARY_PATH 设置实际影响运行时库搜索(这会干扰正在执行的链接编辑)时,此选项非常有用。
当构建动态目标文件时,搜索 libx.so 或 libx.a 库,它们分别是共享目标文件和可重定位归档文件的常规名称。在动态模式下,除非 –B static 选项有效,否则链接编辑器将在库搜索路径中指定的每个目录中搜索 libx.so 或 libx.a 文件。目录搜索在包含任何一个文件的第一个目录处停止。链接编辑器会选择以 .so 结尾的文件,条件是 –lx 扩展为两个文件,这两个文件的名称采用 libx.so 和 libx.a 形式。如果未找到 libx.so,链接编辑器将接受 libx.a。在静态模式下,或 –B static 选项有效时,链接编辑器仅选择以 .a 结尾的文件。
当构建内核模块时,搜索从属内核模块 x。依赖项可以指定为单一名称 x,也可以指定为斜杠分隔的 interface/module 对。
遇到库时链接编辑器将搜索库,所以 –l 的位置非常重要。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Linking With Additional Libraries"。
将 path 添加到库搜索目录。链接编辑器首先在 –L 选项指定的任何目录中搜索库,然后在标准目录中搜索。仅当此选项位于 –L 选项应用到的 –l 选项之前时,此选项才有用。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Directories Searched by the Link-Editor"。
环境变量 LD_LIBRARY_PATH 可用于补充库搜索路径,但是建议使用 –L 选项,因为环境变量也会由运行时环境解释。请参见“环境变量”部分的 LD_LIBRARY_PATH。
如果 path 以前缀 $SYSROOT/ 开头,则该前缀将替换为通过 –z sysroot 选项指定的 sysroot 目录,或替换为 /(如果未使用 –z sysroot)。为了与 GNU 链接编辑器兼容,也接受前缀 =/,该前缀与 $SYSROOT/ 前缀具有相同含义。使用 sysroot 前缀时,本机和交叉链接应用程序可使用一个 –L 定义。
在标准输出中生成内存映射或输入/输出部分列表,以及任何非致命多重定义符号。
读取 mapfile 作为链接编辑器指令的文本文件。可以多次指定此选项。如果 mapfile 是目录,将处理该目录中的所有正规文件(如 stat(2) 所定义)。请参见《Oracle Solaris 11.4 链接程序和库指南》中的第 10 章“链接编辑器中的 Mapfile”。/usr/lib/ld 中提供了示例 mapfile。另请参见“文件”部分。
生成名为 outfile 的输出目标文件。缺省目标文件的名称为 a.out。
标识审计库 auditlib。此审计库用于审计在运行时创建的目标文件。共享目标文件被标识为要求使用 –p 选项进行审计,将该共享目标文件指定为依赖项的任何目标文件都将继承此项要求。请参见 –P 选项。另请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Runtime Linker Auditing Interface"。
标识审计库 auditlib。此审计库用于审计在运行时创建的目标文件的依赖项。依赖项审计还可以从标识为要求审计的依赖项继承。请参见 –p 选项和 –z globalaudit 选项。另请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Runtime Linker Auditing Interface"。
使用 –Q y 时,会将 ident 字符串添加到输出文件的 .comment 部分。此字符串标识用于创建文件的链接编辑器的版本。当有多个链接步骤时,例如当使用链接编辑器 –z type=reloc 或 –r 选项时,这将导致多个链接编辑器 idents。此标识与 cc 命令的缺省操作相同。–Q n 选项将隐藏版本标识。.comment 部分可以通过 mcs(1) 实用程序来处理。
合并可重定位目标文件以生成一个可重定位目标文件。链接编辑器不受未解析引用的影响。此选项不能与 –a 选项一起使用。另请参见 –z type=reloc 选项。
冒号分隔的目录列表,用于指定运行时链接程序的库搜索目录。如果路径存在且不为空,将在输出目标文件中记录该路径,且运行时链接程序可使用该路径。此选项的多个实例与各个用冒号分隔的 path 串联在一起。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Directories Searched by the Runtime Linker"。
在关联目标文件中使用 runpath 比设置全局搜索路径(例如通过 LD_LIBRARY_PATH 环境变量)更可取。仅应记录查找目标文件依赖项所需的 runpaths。ldd (1) 在与 –U 选项一起使用时,还可用于在动态目标文件中搜索未使用的 runpaths。
还可以通过 runpath 来提供各种标记,运行路径提供了标识系统功能或目标文件位置的灵活方式。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的第 12 章 "Establishing Dependencies with Dynamic String Tokens"。$ORIGIN 标记特别适用于将动态目标文件重定位到文件系统中的其他位置。
从输出文件中分离任何符号信息。这些选项等效于组合使用 –z strip-class 选项与 debug 和 symbol 类标识符。另请参见 –z redlocsym 和 –z noldynsym 选项。
使用链接编辑器装入共享目标文件 supportlib,并提供有关链接进程的信息。使用 –S 选项定义的共享目标文件还可通过使用 SGS_SUPPORT 环境变量来提供。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Link-Editor Support Interface"。
在符号表中作为未定义的符号输入 symname。此选项适用于完全从归档库装入。在此实例中,需要使用未解析的引用来强制装入第一个例程。此选项在命令行上的位置非常重要。此选项必须置于定义符号的库之前。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Defining Additional Symbols with the -u option"。
输出消息,提供关于正在使用的链接编辑器版本的信息。
从跟随的任何归档中更改目标文件的提取条件。缺省情况下,将提取归档成员以满足未定义的引用并通过数据定义提升暂定的定义。弱符号引用不会触发提取。使用 –z allextract 或 –-whole-archive 选项时,从归档中提取所有归档成员。使用 –z weakextract 时,弱引用触发归档提取。–z defaultextract 或 –-no-whole-archive 选项提供一种在使用前面的提取选项之后返回缺省值的方法。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Archive Processing"。
指定一个辅助输出文件,用于接收通常将添加到输出目标文件的不可分配部分。运行时不需要不可分配部分,它们主要由调试器和其他监测工具使用。如果 outfile 存在,将使用指定的名称创建辅助文件。如果 outfile 不存在,则辅助文件的名称为主输出文件的名称加 .anc 后缀。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Ancillary Objects"。
与 –z stub 选项一起使用时,–z ancillary 选项会被静默忽略。在以下情况下也会忽略 –z ancillary 选项:即在指定该选项时未指定 outfile,以及通过 –o 选项指定的输出文件是设备特殊文件(如 /dev/null)。
允许为使用通过检查链接编辑器提供的缺省搜索路径找到的 –l 命令行选项指定的库发出警告消息。如果提供 libname 值,将启用缺省库警告功能,并将指定的库添加到不为其发出警告的库列表中。可以指定多个 –z assert-deflib 选项以指定多个不应为其发出警告的库。
libname 值应为链接编辑器找到的不带任何路径组件的库文件的名称。例如,以下选项允许发出缺省库警告,但标准 C 库除外。
$ ld ... -z assert-deflib=libc.so ...
–z assert-deflib 是专用选项,主要用于这样的版本环境:其中存在多个具有相同名称的目标文件且需要对所使用的库实行严格控制。该选项不用于一般用途。
启用注释和调试输出节的压缩。可识别 cmp-type 的以下值。
不进行压缩。这等效于不指定 –z compress-sections 选项。
使用 ZLIB 压缩来压缩候选节。生成的输出节将设置 SHF_COMPRESSED 节标志来标识使用了压缩。
使用 ZLIB 压缩、使用 GNU 节压缩格式来压缩所有候选节。此格式要求候选节具有以 .debug 开头的名称。生成的节将重命名为以 .zdebug 开头来标识使用了压缩。
如果省略了 cmp-type,则使用 zlib 样式。对于压缩格式将大于原始未压缩数据的任何节,链接编辑器将静默跳过压缩。
要成为压缩候选项,节必须是不可分配的并且属于以下类之一。
注释节提供内存访问工具和覆盖相关工具使用的信息。这些部分通过 SHT_SUNW_ANNOTATE 节类型来进行标识。
调试节通过 .compcom、.debug*、.line、.stab*、.SUNW_ctf 或 .zdebug* 节名称来进行标识。这些节还通过 SHT_PROGBITS 或 SHT_SUNW_DEBUG* 节类型进行标识。
zlib-gnu 压缩类型仅限于名称以 .debug 开头的节。使用 zlib-gnu 时,将不压缩本将是压缩候选项的节。对于 zlib 和 zlib-gnu 样式,底层 ZLIB 压缩是相同的,这两种格式对于给定输入节提供相同压缩量。这两种样式的不同之处在于候选节选择、压缩头的格式以及如何标识压缩的节。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Compressed Debug Sections"。除非特别要求使用 zlib-gnu 样式,否则推荐使用更通用的缺省 zlib 样式。
允许或禁止将动态依赖项标识为延迟。绑定到延迟依赖项的符号引用称为延迟引用。延迟依赖项与标识为可延迟装入的依赖项具有相似的行为方式,并且不会在初始进程启动时装入。在首次绑定到延迟引用时,延迟依赖项的装入过程会延迟到进程执行。
与标准符号引用不同,延迟符号引用不会在处理标准重定位或 LD_BIND_NOW 的过程中进行处理,也无法通过带有 RTLD_NOW 标志的 dlopen(3C) 进行处理。建立的延迟引用只能用于函数调用,并且直接绑定到关联的依赖项。
组合使用延迟依赖项以及 dlsym(3C) 和 RTLD_PROBE 句柄,可提供灵活机制和自然编码样式以供测试功能使用。请参见《Oracle Solaris 11.4 链接程序和库指南》中的“测试功能”和《Oracle Solaris 11.4 链接程序和库指南》中的“提供 dlopen 备选项”。
–z defs 选项和 –-no-undefined 选项会在链接末尾保留有任何未定义的符号时强制生成致命错误。此模式是构建可执行文件时的缺省模式。由于历史原因,此模式不是构建共享目标文件时的缺省模式。建议使用 –z defs 选项,因为此模式可保证所构建的目标文件是自包含的。自包含目标文件在内部解析所有符号引用,或解析到目标文件的直接依赖项。
–z nodefs 选项允许未定义的符号。由于历史原因,此模式是构建共享目标文件时的缺省模式。与可执行文件一起使用时,未指定对此类未定义符号的引用的行为。不建议使用 –z nodefs 选项。
允许或禁止直接绑定到命令行上跟在其后的任何依赖项。与全局等效 –B direct 相比,这些选项允许对直接绑定进行更精确的控制。–z direct 选项在以下方面也与 –B direct 选项不同。不会在符号引用与要创建的目标文件中的关联定义之间建立直接绑定信息。不支持延迟装入。
缺省情况下,链接编辑器会放弃未使用的空部分。在链接编辑期间,可能会将其他类别的输入材料确定为未使用。使用 –z discard-unused 选项可自动删除此类项目。可以识别以下 item 标记。
通过链接编辑创建的输出文件中未使用的部分将被放弃。
通过链接编辑创建的输出文件中未使用的可重定位目标文件将被放弃。
如果可重定位目标文件提供的所有可分配部分均未使用,则可将该输入可重定位目标文件确定为未使用。另请参见 –z guidance 选项中有关“不需要的可重定位目标文件”的论述。
通过链接编辑创建的输出文件中不会记录未使用的显式共享目标文件依赖项。
显式依赖项是指使用路径名或通过使用 –l 选项(更为常用)在命令行上定义的依赖项。显式依赖项可以依赖于其他目标文件,后者被称为隐式依赖项。如果符合以下两个条件,则可将显式依赖项确定为未使用。
未从所构建的目标文件中引用该依赖项提供的任何全局符号。
该依赖项不补偿任何隐式依赖项的要求。
另请参见 –z guidance 选项中有关“不需要的或补偿性的依赖项”的论述。
禁用所有未使用的处理,包括删除未使用的空部分的缺省操作。
为了与 GNU 链接编辑器兼容,接受 –-gc-sections 作为 –z discard-unused=sections 的同义词。–-no-gc-sections 选项会取消先前使用的 –z discard-unused=sections 或 –-gc-sections,对于其他情况没有影响。
另请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Removing Unused Material"。
标识 filtee 以便在由过滤器进行处理时,filtee 可终止过滤器进行的任何进一步的 filtee 搜索。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Reducing Capability Filtee Searches"。
使用 –z fatal-warnings 和 –-fatal-warnings 选项可使链接编辑器将警告视为致命错误。
使用 –z nofatal-warnings 和 –-no-fatal-warnings 选项可使链接编辑器将警告视为非致命错误。这是缺省行为。
在所构建的目标文件的 .fini_array 部分后附加一个条目。如果不存在 .fini_array 部分,将创建该部分。新条目将初始化为指向 function。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Initialization and Termination Sections"。
此选项对已使用 –P 选项记录的审计库定义进行补充。此选项仅在创建可执行文件时可用。使用 –P 选项在目标文件中定义的审计库通常允许审计该目标文件的直接依赖项。–z globalaudit 将审计程序升级为全局审计程序,因此允许审计所有依赖项。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Invoking the Auditing Interface"。
使用 –P 选项和 –z globalaudit 选项建立的审计程序等效于使用 LD_AUDIT 环境变量建立的审计程序。请参见 ld.so.1(1)。
提供指南消息来指示链接编辑器选项,这些选项可以改进所生成目标文件的质量,或者在其他方面被视为有益。提供的特定指南在系统升级时可能会发生更改。链接编辑器早期版本中提供的过时指南在新版本中可能会被删除。类似地,新指南可能会添加到链接编辑器的新版本中。因此,指南始终代表当前最佳做法。
通过提供代表要禁止的指南类的 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.4 Linkers and Libraries Guide》中的 "Removing Unused Material"。
如果某个可重定位目标文件的可分配部分未由链接编辑所涉及的任何其他目标文件所引用,则所创建的输出文件不应包含该可重定位目标文件的任何信息。指南建议删除未使用的可重定位目标文件。可以使用 –z guidance=nounused-files 禁用此指南。
另请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Removing Unused Material"。
应标识共享目标文件依赖项以进行延迟装入。如果在遇到 –z lazyload 或 –z nolazyload 选项之前要处理任何依赖项,指南建议使用 –z lazyload 选项。可以使用 –z guidance=nolazyload 禁用此指南。
动态目标文件的依赖项应通过直接绑定进行引用。如果在遇到 –B direct 或 –z direct 选项之一或者 –z nodirect 选项之前要处理任何依赖项,指南建议使用前两个选项中的一个。可以使用 –z guidance=nodirect 禁用此指南。
动态目标文件不应包含不可写但可分配部分的重定位。如果存在此类重定位,且未使用 –z textoff 选项,则会提供指南。
创建共享目标文件和位置无关的可执行文件时,如果使用了包含非位置无关的代码的输入文件,通常会出现此情况。创建动态可执行文件时,如果存在无法解析的弱引用,通常会出现此情况。可以使用 –z guidance=notext 禁用此指南。
所有 mapfile 应使用版本 2 mapfile 语法。如果遇到任何使用版本 1 语法的 mapfile,指南将建议使用版本 2 语法。可以使用 –z guidance=nomapfile 禁用此指南。
Mapfile 应禁止在命名版本中使用 MATCH 表达式(如果这些版本用于建立长期且稳定的 ABI)。指南建议显式列出命名版本中的所有符号名称。可以使用 –z guidance=nomapfile-symbol-match 禁用此指南。
将静默忽略链接编辑器遇到的不正确的依赖项。例如,将忽略在生成 64 位目标文件时遇到的 32 位依赖项。这些依赖项可以由不正确的搜索路径设置产生,例如提供不正确的 –L 选项。尽管此依赖项是有利的,但其处理会造成浪费,而且可能会隐藏应解决的版本问题。指南建议删除任何不合适的依赖项。可以使用 –z guidance=nolibpath 禁用此指南。
内核模块应使用 –z type=kmod 选项构建。以前,内核模块使用链接编辑器 –r 和 –dy 选项构建。此旧形式语义不明确并且功能不全。可以使用 –z guidance=nokmod 禁用此指南。
动态目标文件构建有符号排序节,调试器和其他监测工具使用这些节有效地将地址映射到符号名称。存在具有相同值的多个符号时,此类工具可能显示不一致的结果。可以通过修改代码来避免别名符号,或者可以使用 NOSORTSYM mapfile 指令手动防止不需要的别名被放入排序节中。可以使用 –z guidance=nosymalias 禁用此指南。
此外,–z guidance=noall 可用来完全禁用指南功能。有关指南的更多信息和构建更好的目标文件的建议,请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的第 5 章 "Link-Editor Quick Reference"。
在标准输出中列显命令行选项的摘要并退出。
忽略或记录未作为链接编辑的一部分引用的共享目标文件依赖项。这些选项是位置选项,用于切换链接编辑器如何处理在命令行上遇到的未引用的依赖项。遇到 –z ignore 时,将静默忽略任何后续未引用依赖项。遇到 –z record 时,将记录所有依赖项,而不考虑依赖项是否被引用。
缺省情况下,链接编辑器记录所有依赖项,无论是否引用了依赖项。可以使用非位置 –z discard-unused=dependencies 选项来更改此初始缺省设置。确立初始设置后,可以使用 –z ignore 和 –z record 来更改缺省行为。
在所构建的目标文件的 .init_array 部分后附加一个条目。如果不存在 .init_array 部分,将创建该部分。新条目将初始化为指向 function。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Initialization and Termination Sections"。
标识目标文件以便先对该目标文件进行运行时初始化,然后再对同时进入进程的任何其他目标文件进行运行时初始化。此外,在对该目标文件进行运行时终结化之前,先对同时从进程中删除的任何其他目标文件进行运行时终结化。此选项仅在构建共享目标文件时有意义。
将目标文件标识为插入项。在运行时,如果已使用 –z interpose 选项标记某个目标文件,则会将该目标文件标识为显式插入项。在使用 LD_PRELOAD 环境变量装入目标文件时,也会建立显式插入项。请参见 ld.so.1(1)。由于目标文件的装入顺序可能会出现隐含插入,但是,此隐含插入对于运行时链接程序是未知的。显式插入可确保不论目标文件的装入顺序如何都会进行插入。显式插入还可确保当直接绑定有效时,运行时链接程序在任何显式插入项中搜索符号。
允许或禁止将动态依赖项标识为延迟装入。标识为 lazyload 的动态依赖项不会在初始进程启动时装入。这些依赖项将延迟到首次绑定目标文件时装入。
–z 32 和 –z 64 选项用于指定仅在运行 32 位或 64 位链接编辑器类时才解释的选项。
例如,支持库是类特定的,因此可以使用以下选项确保支持库的类正确:
$ ld ... -z ld32=-Saudit32.so.1 -z ld64=-Saudit64.so.1 ...
在 Oracle Solaris 11.4 之前,已执行的链接编辑器的类由所创建的 ELF 目标文件的类决定。现在,执行的链接编辑器类始终是 64 位。保留这些选项是为了向后兼容早期版本的 Solaris。
标识过滤器以指示必须在运行时立即处理 filtee。通常,过滤器处理会延迟到某个符号引用绑定到该过滤器。包含此标志的目标文件的运行时处理将模拟 LD_LOADFLTR 环境变量生效时的运行时处理。请参见 ld.so.1(1)。
将 name 添加到已知的 mapfile 条件输入表达式谓词列表中。此选项等效于在链接编辑器读取的第一个 mapfile 的顶部放置以下行。
$mapfile_version 2 $add name
通过 –z mapfile-add 输入的名称可以与 mapfile $if 和 $elif 指令一起使用来有条件地处理 mapfile 输入。请参见《Oracle Solaris 11.4 链接程序和库指南》中的第 10 章“链接编辑器中的 Mapfile”。
将目标文件标识为在运行时不可删除。此模式类似于通过组合使用 dlopen(3C) 与 RTLD_NODELETE 模式将目标文件添加到进程中。
将目标文件标识为对 dlopen(3C) 不可用,而不论目标文件是 dlopen() 所指定的目标文件,还是 dlopen() 所指定的目标文件所需的依赖项的任何形式。此选项仅在构建共享目标文件时有意义。
指定父目标文件,该目标文件可以是针对其链接输出目标文件的动态目标文件。通常,在创建要在运行时由可执行文件通过 dlopen() 函数装入的插件共享目标文件时,使用此选项。父目标文件的符号表用于满足来自插件目标文件的引用。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Parent Objects"。
在所构建的目标文件的 .preinit_array 部分后附加一个条目。如果不存在 .preinit_array 部分,将创建该部分。新条目将初始化为指向 function。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Initialization and Termination Sections"。
这些选项重新扫描提供给链接编辑的归档文件。缺省情况下,当命令行上出现归档时,将立即处理归档。传统上来说,在命令行末尾指定归档,以便其符号定义可解析任何前述引用。但是,有必要多次指定归档以满足其自身的相互依赖项。
–z rescan-now 是位置选项,在命令行上遇到该选项时链接编辑器会立即处理该选项。将立即重新处理命令行上此时显示的所有归档以尝试定位解析符号引用的其他归档成员。将重复此归档重新扫描操作,直到通过归档传递时未提取新成员。
定义归档重新扫描组。这是位置构造,在遇到封闭分隔符选项时链接编辑器会立即进行处理。将在组分隔符选项中找到的归档重新处理为组以尝试定位解析符号引用的其他归档成员。将重复此归档重新扫描操作,直到通过归档传递时未提取新成员。无法嵌套归档重新扫描组。
从任何输入目标文件分离特定的部分类,禁止将这些部分添加到输出文件。通过此选项,可以对可在输出文件中忽略的部分进行细粒度控制。
以下分离类说明仅适用于不可分配的部分。
可以在每个类标记前加上“!”,以指示不应删除该类。此定义在与 nonalloc 类结合时非常有用。例如,使用 –z strip-class=nonalloc,!note 将删除所有不可分配部分(附注部分除外)。
分离的部分将从输出目标文件中彻底删除。使用 –z ancillary 选项可更改与非动态符号表 .symtab 有关的此行为以及与其相关的部分。缺省情况下,符号表会同时写入主目标文件和辅助目标文件。分离后,符号表只会写入到辅助目标文件,而在主目标文件中标识为不存在。如果在不使用 –z ancillary 的情况下从目标文件分离 .symtab,将以常规方式彻底删除该部分。
可以定义以下部分类。
分离任何不可分配部分。这些部分标识为不包括 SHF_ALLOC 节标志。此类可封装除 symbol 类以外的所有其他类。nonalloc 类往往本身即足以删除任何不需要的部分。
分离任何注释部分。这些部分提供内存访问工具和覆盖相关工具使用的信息。这些部分通过 SHT_SUNW_ANNOTATE 节类型来进行标识。
分离任何注释部分。这些部分通过 .comment 节名称来进行标识。此外,mcs(1) 实用程序通常用于处理注释部分。
分离通常用于包含调试数据的部分。这些部分通过 .compcom、.line、.stab*、.debug* 或 .zdebug* 节名称来进行标识。这些部分还可通过 SHT_SUNW_DEBUG* 节类型来进行标识。
分离任何可排除的部分。这些部分通过 SHF_EXCLUDE 节标志来进行标识。在创建可重定位目标文件时此类非常有用。缺省情况下,在创建动态目标文件或内核模块时会自动排除此类节,在创建可重定位目标文件时会保留此类节。
分离任何注释部分。这些部分通过 SHT_NOTE 节类型来进行标识。
如果输出文件不是可重定位目标文件,则分离任何不可分配符号表和字符串表部分。这些部分通过 SHT_SYMTAB 节类型来进行标识。任何关联的字符串表也将删除。
生成桩共享目标文件。桩目标文件是可提供与实际目标文件相同的链接接口但不包含代码或数据的共享目标文件,完全由 mapfile 生成。桩目标文件不能在运行时使用。但是,可以根据桩目标文件构建应用程序,桩目标文件提供要在运行时使用的实际目标文件名称,然后在运行时使用实际目标文件。
只能为共享目标文件生成桩目标文件,必须提供定义要导出的全局符号的 mapfile。因此使用 –z stub 时将需要 –z type=shared 或 –G 选项和 –M 选项。在生成桩目标文件时,链接编辑器将忽略在命令行中指定的任何目标文件或库文件,无需存在这些文件即可生成桩目标文件。由于可以省略编译步骤,并且相对而言链接编辑器只需进行少量操作,因此可以很快生成桩目标文件。
请参见《链接程序和库指南》中的“桩目标文件”。
指定每个目标文件的安全扩展。可以将模式值设置为 enable 或 disable。如果省略模式,则启用扩展。允许使用此选项的多个实例。此选项仅在创建可执行文件时可用。请参见 sxadm(8)。
可以指定以下安全扩展。
指定进程的地址空间布局随机化 (Address Space Layout Randomization, ASLR) 要求。
指定进程的非可执行堆 (NXHEAP) 要求。
指定进程的非可执行堆栈 (NXSTACK) 要求。
指定进程中内存分配器的应用程序数据完整性 (Application Data Integrity, ADI) 要求。
指定进程的应用程序数据完整性 (Application Data Integrity, ADI) 堆栈保护要求。
将定义目标文件功能的可重定位目标文件转换为定义符号功能的可重定位目标文件。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Converting Object Capabilities to Symbol Capabilities"。
指定系统根目录。缺省情况下,缺省搜索路径和通过 –L 或 –YP 选项指定的目录相对于系统根目录 / 进行解释。指定了 –z sysroot 时,这些路径解释为指定目录的相对路径。请参见 –L 和 –YP 选项以及“文件”中的 LIBPATH。–z sysroot 可以与 –z target 结合使用来为目标而非当前运行的系统创建目标文件。
指定输出目标文件的机器类型。支持的目标有 SPARC 和 x86。使用指定目标的 32 位机器类型,除非存在 –64 选项,这种情况下使用相应的 64 位机器类型。缺省情况下,要生成的目标文件的机器类型根据在命令行处理的第一个 ELF 目标文件来决定。如果未指定任何目标文件,机器类型由在命令行处理的第一个归档文件中遇到的第一个目标文件决定。如果没有目标文件或归档文件,链接编辑器将假定使用本地机器。使用输入仅来自 mapfile 的链接编辑器直接创建目标文件时,此选项非常有用。请参见 –M 选项。在极少数情况下,完全从包含不同机器类型目标文件的归档文件进行链接时(此时第一个目标文件不是所需的机器类型),此选项也非常有用。
这些选项只能在动态模式下使用。如果针对不可写但可分配部分的任何重定位持续进行,–z text 选项将强制发出致命错误。出于历史原因,构建动态目标文件时,此模式不是确认模式。但是,建议使用此模式以确保可在多个正在运行的进程之间共享所构建的动态目标文件的文本段。共享文本段可使在装入内存时重定位系统开销最少。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Position-Independent Code"。
–z textoff 选项允许针对所有可分配部分(包括不可写部分)进行重定位。此模式是构建共享目标文件时的缺省模式。
如果针对不可写但可分配部分的任何重定位持续进行,–z textwarn 选项将列出警告。此模式是构建可执行文件时的缺省模式。
指定要创建的目标文件的类型。可使用以下目标文件类型。
动态可执行文件。
内核模块。
与位置无关的可执行文件。此选项还声明 –z text 选项。
可重定位目标文件。这等效于指定 –r 选项。
共享目标文件。这等效于指定 –G 选项。此选项还声明 –z text 选项。
此选项在链接编辑期间提供附加警告诊断。当前,此选项支持以下警告。
对交换区重新定位的可疑使用。
构建共享目标文件时限制使用静态 TLS 重定位。
符号可见性不一致。
将来可能会增强此选项的功能,以提供被认为太混乱而不能在缺省情况下生成的其他诊断。
重命名对 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 选项不可与 –z type=reloc 或 –r 选项一起使用。请参见“说明”部分的“静态可执行文件”。
仅在动态模式下,不对引用共享目标文件中的符号的动态可执行文件重定位进行特殊处理。如果不提供 –b 选项,链接编辑器将在动态可执行文件中应用技术以便文本段可以保持只读状态。一种技术是为共享目标文件中定义的函数的引用创建特殊位置无关重定位。另一种技术安排在运行时将在共享目标文件中定义的数据目标文件复制到可执行文件的内存映像中。
–b 选项旨在用于专用动态目标文件,不建议用于一般用途。使用该选项将禁止执行确保目标文件可共享性时需要的所有专门处理操作,甚至可能会禁止重定位 64 位可执行文件。
建立作为组的共享目标文件及其依赖项。组中的目标文件在运行时绑定到组的其他成员。此模式类似于通过组合使用 dlopen(3C) 和 RTLD_GROUP 模式将目标文件添加到进程中。对标识为组的目标文件具有显式依赖性的目标文件会成为该组的成员。
由于该组必须为自包含,因此,使用 –B group 选项还将断言 –z defs 选项。
建立一个组可提供控制一组目标文件绑定的基本方式。不过,可以通过直接绑定实现更好的控制。请参见 –B direct 选项。
仅在创建共享目标文件时这些选项才可用。–B symbolic 选项会导致全局符号引用绑定至所构建目标文件中的定义(如果存在定义)。–B symbolic-functions 将此绑定限定于函数符号。
通常,在运行时才会绑定对共享目标文件中的全局符号的引用,无论共享目标文件中是否存在符号的定义都是如此。此模型允许在可执行文件或另一共享目标文件中定义相同符号来覆盖目标文件自己的定义。
–B symbolic 选项适合用于专用动态目标文件,不建议用于一般用途。尽管这些选项可以减少运行时重定位开销,但它们可能会影响需要进行插入的绑定。要减少运行时重定位处理,建议优先选择创建版本定义或使用直接绑定,而不是使用这些选项。
指定 –d y(缺省值)时,链接编辑器使用动态链接。指定 –d n 时,链接编辑器使用静态链接。这些选项和链接编辑器操作模式通常通过较高级别选项(例如 –z type、–r 和 –G)控制。另请参见“描述”下的“静态可执行文件”以及 –B dynamic | static。
在构建可执行文件时,使用 name 作为要写入程序头的解释程序的路径名。在静态模式下,缺省为没有解释程序。在动态模式下,缺省为运行时链接程序 ld.so.1(1) 的名称。任何一种情况都可以由 –I name 覆盖。exec(2) 在装入 a.out 时会装入此解释程序,并将控件传递给该解释程序而不是直接传递给 a.out。
此选项会将 DT_NEEDED 条目添加到所生成的目标文件的 .dynamic 部分中。DT_NEEDED 字符串的值为在命令行上指定的 string。此选项与位置有关,且 DT_NEEDED .dynamic 条目与链接编辑行上搜索到的其他动态依赖项有关。当组合使用 –dy 和 –r 选项时,此选项适用于在设备驱动程序可重定位目标文件中指定依赖项。
对具有不同大小或不同对齐方式的多重定义的暂定(通用块)数据符号关闭警告。此选项等效于指定 –z relax=common 选项。
–Wl, 选项提供一种通过编译器驱动程序传递链接编辑器选项的方式。编译器驱动程序通常分离 –Wl, 并将其余选项传递到链接编辑器。实例已经发生,特别是当构建复杂可移植软件时,其中已经使用整个 –Wl, 选项直接调用了链接编辑器。要在这种情况下提供灵活性,链接编辑器分离 –Wl, 并解释其余选项。因为此类选项通常不在用户控制之下,所有无法识别的 –W 选项都会导致警告,而不是致命错误,并将忽略该选项。
更改用于查找库的缺省目录。dirlist 是冒号分隔的路径列表。应该不需要更改缺省搜索路径。在较新版本的操作系统中可以更改缺省搜索路径。使用此选项显式指示完整搜索路径会有变为与较新版本操作系统不兼容的风险。将维护此选项来支持一些编译器驱动程序的历史使用。虽然受支持,但不建议这样使用。链接编辑需要使用的其他搜索路径应该使用 –L 选项来提供。
仅当构建动态可执行文件时才使用。指定应立即解析外部绝对符号的引用而不是留到运行时进行解析。在非常专业化的情况下,此选项将删除可能导致可执行文件要求的交互空间过大的文本重定位。
执行 64 位链接编辑器。在 Solaris 11 之前,已执行的链接编辑器的类由所创建的 ELF 目标文件的类决定。现在,执行的链接编辑器类始终是 64 位。保留此选项是为了向后兼容早期版本的 Solaris。
此选项等效于指定 –z sx=aslr 选项。
缺省情况下,在构建动态目标文件时,链接编辑器会组合多个重定位节。此部分合并不同于可重定位目标文件合并,在部分合并中,重定位部分与必须应用重定位的部分维持一一对应的关系。–z nocombreloc 选项禁止合并重定位部分,并保持在原始可重定位目标文件中找到的一一对应关系。
链接编辑器按数据重定位部分条目的符号引用对这些条目进行排序。此排序会减少运行时符号查找。在合并多个重定位部分时,此排序在将目标文件装入内存时可能产生最少的重定位系统开销,并加快动态目标文件的运行时装入。
历史上,单个重定位节已转入任何动态目标文件中,并且需要 –z combreloc 选项才能启用前面所述的重定位节合并。重定位部分合并现在是缺省设置。由于旧版本环境的好处,–z combreloc 选项仍可接受,但该选项不是必需的,且不起作用。
对 GNU 版本脚本样式的 mapfile 提供不完全支持。版本脚本基于原始 Solaris 版本 1 符号定义语法,但具有一些扩展。ld 支持最常见的此类扩展,还支持在指定的符号名称中使用通配符。可能不支持其他特定于 GNU 的扩展。如果遇到不支持的扩展,则 ld 将发出相应错误。
为了便于构建使用 GNU 版本脚本开发的软件,接受将本机 GNU –-version-script 选项作为 –z gnu-version-script 的别名。由于仅对 GNU 版本脚本提供不完全支持,因此必须通过指定 –z gnu-version-script-compat 来显式允许才能使用 –-version-script。
分配或取消分配跟在唯一组后的每个依赖项。将依赖项分配给组的作用就如同使用 –B group 选项构建依赖项。
允许多个全局符号定义。缺省情况下,在可重定位目标文件之间出现多个符号定义会导致致命错误。此选项将禁止错误条件出现,并允许采用第一个符号定义。专用编译器选项或高级别的编译器优化可以规避此选项的使用。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Fatal Resolutions"。
禁用 ELF 字符串表和注释部分的压缩。缺省情况下,字符串压缩适用于 SHT_STRTAB 部分、设置了 SHF_MERGE 和 SHF_STRINGS 节标志的 SHT_PROGBITS 部分以及注释部分。
mcs(1) 实用程序搭配 –c 选项时,可用于在构建目标文件后压缩注释部分。
标识目标文件以忽略在任何 LD_LIBRARY_PATH 或 runpaths 后使用的运行时缺省库搜索路径。此选项表明可以通过目标文件的 runpath 来满足目标文件的所有依赖项。
以前,此选项用于将目标文件标识为对 dldump(3C) 不可用。仍接受 –z nodump 选项,但该选项不是必需的,且不起作用。
防止在动态目标文件中包含 .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 选项是禁止其包含的唯一方式。
在要生成的输出文件中扩展在可重定位目标文件中定义的部分初始化的符号。
消除版本控制信息。输出映像中未生成版本节或关联的 .dynamic 节条目。
将目标文件标识为需要非延迟运行时绑定。此模式类似于通过组合使用 dlopen(3C) 与 RTLD_NOW 模式将目标文件添加到进程中。此模式还类似于使 LD_BIND_NOW 环境变量起作用。请参见 ld.so.1(1)。
此选项等效于指定 –z sx=nxheap 选项。
此选项等效于指定 –z sx=nxstack 选项。
将目标文件标识为需要在运行时立即进行 $ORIGIN 处理。维护此选项只是为了历史兼容性,因为现在缺省提供目标文件的运行时分析以进行 $ORIGIN 处理。
删除所有本地符号,但符号表 SHT_SYMTAB 中的 SECT 符号除外。引用本地符号的所有重定位将更新为引用相应的 SECT 符号。通过此选项,专用目标文件可显著减小其符号表大小。另请参见 –z strip-class 和 –z noldynsym 选项。
尽管 –z redlocsym 选项对特殊目标文件(例如在操作系统内核中使用的那些目标文件)很有用,但不建议将该选项用于一般用途。符号表 SHT_SYMTAB 的大小不影响运行时行为,而删除本地符号可能会对过程观察产生负面影响。删除本地符号可以减少使用编译器驱动程序 –g 选项生成的调试信息。删除本地符号还会删除正常写入到 。SUNW_ldynsym 部分中的信息,从而会降低调试器和工具(如 pstack(1) 和 truss(1))的效用。
链接编辑器执行有效性检查,以便确保生成的输出目标文件有效并可在运行时使用。此外,链接编辑器还可以转换各种重定位来生成更好的说明序列。
可以使用 –z relax 选项来解除这些操作,以便生成原本会被拒绝的输出目标文件。
可以识别以下 item 标记。
针对 COMDAT 节中消除的符号保留的重定位会导致致命错误。–z relax=comdat 选项将此类重定位重定向到保留的 COMDAT 节中的等效符号。
多重定义的暂定数据符号(具有不同的大小或不同的对齐方式)将生成警告。这些条件通常源于 Fortran 通用块。–z relax=common 选项禁用此警告。
ELF 目标文件要求特定部分在输出目标文件中按指定顺序互相相邻。显式对各部分进行布局的链接编辑器 mapfiles 可能会中断此自动布局。无效的布局会导致致命错误。–z relax=secadj 选项禁止布局验证。
引用超出其关联部分边界的数据的符号会导致内存访问无效。此类符号会导致致命错误。–z relax=symbound 选项禁止此错误条件出现。
在 SPARC 上,一系列 GOTDATA 重定位可以相对于全局偏移表 (Global Offset Table, GOT) 提供对数据的访问。本地绑定的数据项允许链接编辑器转换关联的代码序列,从而提供更优化的访问模型。但是,仅为访问 GOT 地址的 +/- 2 GB 内的数据提供此模型。超出此限制的重定位会导致致命错误。数据引用极少会超出此限制,可以使用 –z relax=transdisp 选项调整 GOTOP 访问模型转换。此解除可以删除地址范围限制,但是会轻微降低代码序列优化。
线程局部存储 (Thread-Local Storage, TLS) 访问提供大量数据访问模型。请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》中的 "Thread-Local Storage Access Models"。链接编辑器可以基于正在创建的输出文件转换关联的代码序列和符号可见性。–z relax=transtls 选项禁止 TLS 访问模型转换。
此选项等效于指定 –z relax=comdat 选项。
一个与位置无关的选项,可导致重新扫描提供给链接编辑的归档文件。链接编辑器会将重新扫描操作推迟到在它处理整个命令行之后再进行,然后开始对命令行上显示的所有归档执行最终重新扫描操作。–z rescan 操作可与包含初始化 (.init) 或终结化 (.fini) 部分的目标文件进行不正确地交互,从而禁止这些部分中的代码运行。由于此原因,–z rescan 已过时,建议使用 –z rescan-now。
链接编辑器识别以下环境变量。前缀为 LD_ 的其他环境变量可与运行时链接程序一起使用。请参见 ld.so.1(1)。
备用链接编辑器路径名称。链接编辑器执行并将控制传递给此备用链接编辑器。此环境变量提供用于覆盖从各种编译器驱动程序调用的缺省链接编辑器的通用方法。
要在其中搜索使用 –l 选项指定的库的目录列表。多个目录之间用冒号分隔。在最普遍的情况中,此环境变量包含两个由分号分隔的目录列表。
dirlist1;dirlist2
如果使用出现的任意数量的 –L 来调用链接编辑器,如下所示:
$ ld ... -Lpath1 ... -Lpathn ...
则搜索路径顺序为:
dirlist1 path1 ... pathn dirlist2 LIBPATH
如果目录列表不包含分号,该列表将被解释为 dirlist2。
LD_LIBRARY_PATH 环境变量还会影响动态依赖项的运行时链接程序搜索。
可以使用 _32 或 _64 后缀指定此环境变量。这会使环境变量分别特定于 32 位或 64 位进程,并覆盖任何有效的无后缀版的环境变量。
在 Oracle Solaris 11.4 之前,已执行的链接编辑器的类由底层系统的类决定,可能为 32 位或 64 位。LD_NOEXEC_64 环境变量用于禁止自动执行 64 位链接编辑器。在当前系统中,链接编辑器始终是 64 位,LD_NOEXEC_64 将被忽略且没有任何作用。保留此变量是为了向后兼容早期版本的 Solaris。
这些环境变量提供了一种在链接编辑器命令行中添加其他选项或删除现有选项的方式。目标文件类型以大写形式提供 –z type 选项定义的类型。因此,以下目标文件类型选项可用。
LD_EXEC_UNSET 和 LD_EXEC_OPTIONS
LD_KMOD_UNSET 和 LD_KMOD_OPTIONS
LD_PIE_UNSET 和 LD_PIE_OPTIONS
LD_RELOC_UNSET 和 LD_RELOC_OPTIONS
LD_SHARED_UNSET 和 LD_SHARED_OPTIONS
请参见“选项处理”。
用于指定链接编辑器的 runpath 的备用机制。请参见 –R 选项。如果同时指定 LD_RUN_PATH 和 –R 选项,–R 将取代另一个选项。
提供使用链接编辑器装入的共享目标文件的冒号分隔列表以及有关链接进程的给定信息。可以使用 _32 或 _64 后缀指定此环境变量。这会使环境变量分别特定于链接编辑器的 32 位或 64 位类,并覆盖任何有效的无后缀版的环境变量。请参见 –S 选项。
请注意,以字符 "LD_" 开头的环境变量名称是保留名称,供将来可能提升 ld 和 ld.so.1(1) 时使用。
共享目标文件库。
归档库。
缺省输出文件。
对于 32 位库,缺省搜索路径为 /lib,后跟 /usr/lib。对于 64 位库,缺省搜索路径为 /lib/64,后跟 /usr/lib/64。
包含多个可在链接编辑期间使用的 mapfile 的目录。这些 mapfile 提供多种功能,例如定义内存布局、对齐 bss 以及定义不可执行栈。
有关下列属性的说明,请参见 attributes(7):
|
as(1)、crle(1)、elfcompress(1)、gprof(1)、ld.so.1(1)、ldd(1)、mcs(1)、pvs(1)、strip(1)、exec(2)、stat(2)、dldump(3C), zlib(3), dlopen(3C)、elf(3ELF)、ar.h(3HEAD)、a.out(5)、attributes(7)、sxadm(8)
《Oracle Solaris 11.4 Linkers and Libraries Guide》
由于历史原因,维护由链接编辑器应用的缺省选项。在今天的编程环境中,动态目标文件占主导地位,备用缺省选项通常会更有意义。但是,必须维护历史缺省选项以确保与现有程序开发环境的兼容性。本手册中在可能的地方提到了历史缺省选项。有关最新推荐的选项的说明,请参见《Oracle Solaris 11.4 Linkers and Libraries Guide》的第 5 章 "Link-Editor Quick Reference"。
如果由链接编辑器创建的文件已经存在,则在处理完所有输入文件后,该文件将解除链接。然后,将创建具有指定名称的新文件。这允许链接编辑器创建新版本的文件,同时允许正在访问旧文件内容的现有进程继续运行。如果旧文件没有其他链接,则当最后一个引用文件的进程终止时,将释放已删除文件的磁盘空间。
在 Oracle Solaris 11 中,对于所创建的文件已存在的情况,链接编辑器的行为已更改。在早期版本中,将现有文件重写到适当的位置,这种方法可能会损坏任何使用该文件的正在运行的进程。此更改对于在文件系统中具有多个硬链接的输出文件有意义。以前,所有链接都保持不变,而且所有链接都可以访问新文件内容。新的链接编辑器行为中断了此类链接,其结果是只有指定的输出文件名才能引用新文件。所有其他链接继续引用旧文件。为了确保行为一致,依赖于指向链接程序输出文件的多个硬链接的应用程序应该明确删除其他文件名,然后再重新链接这些文件名。