链接程序和库指南

相关主题

动态链接

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

通过使应用程序和标准库的服务分开,动态链接还增加了应用程序的可移植性和可扩展性。由于服务接口及其实现也彼此分开,系统可以在维持应用程序稳定性的同时进行演变。动态链接在提供应用程序二进制接口 (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),以及一个链接程序调试支持库。在本文档中,许多过程都含有这些工具的示例。