链接程序和库指南

第 1 章 Solaris 链接程序介绍

本手册介绍 Solaris 链接编辑器和运行时链接程序的操作,以及链接编辑器操作的目标文件。Solaris 链接程序的基本操作涉及目标文件的组合。此组合会导致从正在连接的目标文件引用另一个目标文件内的符号定义。

本手册对以下内容进行了阐述:

链接编辑器

链接编辑器 ld(1) 串联并解释一个或多个输入文件中的数据。这些文件可以是可重定位目标文件、共享库或归档文件库。可以通过这些输入文件创建一个输出文件。此输出文件可以是可重定位目标文件、可执行应用程序或共享库。在编译环境中,最常调用链接编辑器。

运行时链接程序

运行时链接程序 ld.so.1(1) 在运行时处理动态的可执行文件和共享库,从而将可执行文件和共享库绑定在一起来创建可运行进程。

共享库

共享库是链接编辑阶段的一种输出形式。共享库有时被称为共享库。共享库在创建强大灵活的运行时环境方面非常重要。

目标文件

Solaris 链接程序处理符合可执行链接格式(又称为 ELF)的文件。

尽管可以将这些内容编写为单独的主题,但是它们之间有大量的重叠。在介绍上述每项内容的同时,本文档还将介绍其他相关内容。

链接编辑

链接编辑可处理各种输入文件,这些文件通常由编译器、汇编程序或者 ld(1) 生成。链接编辑器会串联并解释这些输入文件内的数据以形成单个输出文件。虽然链接编辑器提供许多选项,但是生成的输出文件为以下四种基本类型之一:

图 1–1 中显示了这些输出文件及其创建过程中使用的主要链接编辑器选项。

动态可执行文件共享库通常共同称为动态库。本文档重点介绍动态库。

图 1–1 静态或动态链接编辑

链接编辑器输出文件,以及用于创建这些文件的主要链接编辑器选项。

静态可执行文件

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

从 Solaris 10 发行版开始,不再提供 32 位系统归档文件库。如果没有这些库,尤其是 libc.a,不具备专业系统知识就无法创建静态可执行文件。请注意,链接编辑器处理静态链接选项的功能以及归档文件库的处理方式保持不变。

运行时链接

运行时链接涉及绑定目标文件(这些目标文件通常由以前的一个或多个链接编辑过程生成),以生成可运行进程。在链接编辑器生成这些目标文件的过程中,会生成相应簿记信息来表示已验证的绑定要求。利用此信息,运行时链接程序可以装入、重定位并完成绑定过程。

在进程执行过程中,运行时链接程序的功能将变为可用。通过在需要时添加附加共享库,这些功能可以用于扩展进程的地址空间。运行时链接过程中涉及的两个最常见组件为动态可执行文件共享库

动态可执行文件是在运行时链接程序控制下执行的应用程序。这些应用程序通常具有共享库(由运行时链接程序定位并绑定来创建可运行进程)形式的依赖性。动态可执行文件是链接编辑器生成的缺省输出文件。

共享库向动态链接系统提供主要组成单元。共享库类似于动态可执行文件,但是,系统尚未为其指定虚拟地址。

动态可执行文件通常依赖于一个或多个共享库。通常,必须将一个或多个共享库绑定到动态可执行文件以生成可运行进程。因为共享库可被许多应用程序使用,所以其构造的各个方面直接影响共享性、版本控制以及性能。

共享库是由链接编辑器处理还是由运行时链接程序处理,可以使用共享库的环境来区分:

编译环境

可由链接编辑器处理共享库,以生成动态可执行文件或其他共享库。共享库成为要生成的输出文件的依赖项。

运行时环境

共享库可由运行时链接程序处理,并与一个动态可执行文件共同生成可运行进程。

相关主题

动态链接

动态链接通常是涵盖多个链接概念的术语。动态链接是指链接编辑进程中那些生成动态可执行文件和共享库的部分。动态链接还指运行时链接这些目标文件以生成可运行进程。利用动态链接,多个应用程序可以通过在运行时将应用程序绑定到共享库来使用此目标文件提供的代码。

通过使应用程序和标准库的服务分开,动态链接还增加了应用程序的可移植性和可扩展性。由于服务接口及其实现也彼此分开,系统可以在维持应用程序稳定性的同时进行演变。动态链接在提供应用程序二进制接口 (application binary interface, ABI) 方面是至关重要的因素,而且是 Solaris 应用程序的首选编译方法。

应用程序二进制接口

根据其定义,系统组件和应用程序组件之间的二进制接口允许非同步地实现这些功能的改进。Solaris 链接程序依靠这些接口来装配要执行的应用程序。虽然 Solaris 链接程序所处理的所有组件都具有二进制接口,但是我们将系统提供的整个接口集称为 Solaris ABI

Solaris ABI 在技术上讲,是从 ABI 功能衍生而来的,这种衍生开始于 System V 应用程序二进制接口。ABI 功能因 SPARC International, Inc.® 为其 SPARC 处理器提供了附加特性而得以改进,该特性称为 SPARC 兼容性定义 (SPARC Compliance Definition, SCD)。

32 位环境和 64 位环境

链接编辑器有 32 位应用程序和 64 位应用程序两种。每种链接编辑器都可以对 32 位目标文件和 64 位目标文件执行操作。但是,在一个链接编辑过程中不能同时处理 32 位目标文件和 64 位目标文件。在运行 64 位环境的系统上,链接编辑器的两个版本都可以运行。在运行 32 位环境的系统上,只能运行链接编辑器的 32 位版本。虽然 32 位链接编辑器可以生成 64 位目标文件,但是生成目标文件的大小(不包括 .bss)限制为 2 GB。

不需要命令行选项来区分 32 位链接编辑或 64 位链接编辑。链接编辑器使用命令行上第一个可重定位目标文件的 ELF 类来管理操作的模式。专用链接编辑(如,只来自 mapfile 或归档文件库的链接)不受命令行目标文件的影响。这些链接编辑缺省为 32 位模式。在这些情况下,可以使用链接编辑器的 -64 选项强制执行 64 位链接编辑。

链接编辑器对 32 位目标文件和 64 位目标文件的操作相同。本文档通常使用 32 位示例。对于 64 位处理与 32 位处理不同的情况,将明确指出。

有关 64 位应用程序的更多信息,请参阅《Solaris(64 位)开发者指南》

环境变量

链接编辑器支持许多以字符 LD_ 开头的环境变量,如 LD_LIBRARY_PATH。每个环境变量都可以其通用形式存在,也可以使用 _32_64 后缀指定,例如 LD_LIBRARY_PATH_64。此后缀使环境变量分别特定于 32 位或 64 位进程。此后缀还覆盖任何可能有效的通用无后缀环境变量版本。


注 –

在 Solaris 10 发行版之前,链接编辑器忽略未指定值的环境变量。因此,在以下示例中,将使用通用环境变量设置 /opt/lib 来搜索 32 位应用程序 prog 的依赖项。


% LD_LIBRARY_PATH=/opt/lib  LD_LIBRARY_PATH_32=  prog

从 Solaris 10 发行版开始,处理未指定值的带有 _32_64 后缀的环境变量。这些环境变量将有效地取消任何关联的通用环境变量设置。因此在前面的示例中,将不会使用 /opt/lib 来搜索 32 位应用程序 prog 的依赖项。


在本文档中,任何对链接编辑器环境变量的引用都使用通用的无后缀变体。所有支持的环境变量都在 ld(1)ld.so.1(1) 中定义。

支持工具

Solaris 操作环境还提供了许多支持工具和库。可以使用这些工具分析和检查这些目标文件和链接过程。这些工具包括 elfdump(1)lari(1)nm(1)dump(1)ldd(1)pvs(1)elf(3ELF),以及一个链接程序调试支持库。在本文档中,许多过程都含有这些工具的示例。