跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris 11.1 链接程序和库指南 Oracle Solaris 11.1 Information Library (简体中文) |
动态链接通常是涵盖多个链接概念的术语。动态链接是指链接编辑过程中那些生成动态可执行文件和共享目标文件的部分。动态链接还指运行时链接这些目标文件以生成可运行进程。利用动态链接,多个应用程序可以通过在运行时将应用程序绑定到共享目标文件来使用此共享目标文件提供的代码。
通过使应用程序和标准库的服务分开,动态链接还提高了应用程序的可移植性和可扩展性。由于服务接口及其实现也彼此分开,系统可以在维持应用程序稳定性的同时进行演变。动态链接在提供应用程序二进制接口 (Application Binary Interface, ABI) 方面是至关重要的因素,而且是 Oracle Solaris 应用程序的首选编译方法。
根据其定义,系统组件和应用程序组件之间的二进制接口允许非同步地实现这些功能的改进。Oracle Solaris 链接编辑器和运行时链接程序依靠这些接口来对要执行的应用程序进行汇编。虽然 Oracle Solaris 链接编辑器和运行时链接程序所处理的所有组件都具有二进制接口,但是我们将系统提供的整个接口集合称为 Oracle Solaris ABI。
Oracle Solaris ABI 在技术上讲,是从 ABI 功能衍生而来的,这种衍生开始于 System V 应用程序二进制接口。ABI 功能因 SPARC International, Inc. 为其 SPARC 处理器提供了附加特性而得以改进,该特性称为 SPARC 兼容性定义 (SPARC Compliance Definition, SCD)。
链接编辑器以 32 位应用程序和 64 位应用程序的形式提供。每种链接编辑器都可以对 32 位目标文件和 64 位目标文件执行操作。在运行 64 位环境的系统上,两个版本的链接编辑器都可以运行。在运行 32 位环境的系统上,只能运行链接编辑器的 32 位版本。
运行时链接程序以 32 位目标文件和 64 位目标文件的形式提供。32 位目标文件用于执行 32 位进程,而 64 位目标文件用于执行 64 位进程。
链接编辑器和运行时链接程序对 32 位目标文件和 64 位目标文件的操作相同。本文档一般使用 32 位示例。对于 64 位处理与 32 位处理不同的情况,将明确指出。
有关 64 位应用程序的更多信息,请参阅《Oracle Solaris 64-bit Developer’s Guide》。
链接编辑器和运行时链接程序支持许多以字符 LD_ 开头的环境变量,例如,LD_LIBRARY_PATH。每个环境变量都可以其通用形式存在,也可以指定 _32 或 _64 后缀,例如,LD_LIBRARY_PATH_64。此后缀使环境变量分别特定于 32 位或 64 位进程。此后缀还将覆盖任何可能有效的通用无后缀环境变量版本。
注 - 在 Oracle Solaris 10 发行版之前,链接编辑器和运行时链接程序会忽略未指定值的环境变量。因此,在以下示例中,将使用通用环境变量设置 /opt/lib 来搜索 32 位应用程序 prog 的依赖项。
$ LD_LIBRARY_PATH=/opt/lib LD_LIBRARY_PATH_32= prog
从 Oracle Solaris 10 发行版开始,可以处理未指定值的带有 _32 或 _64 后缀的环境变量。这些环境变量将有效地取消任何关联的通用环境变量设置。因此在前面的示例中,将不会使用 /opt/lib 来搜索 32 位应用程序 prog 的依赖项。
在本文档中,任何对链接编辑器环境变量的引用都使用通用的无后缀变体。所有支持的环境变量在 ld(1) 和 ld.so.1(1) 中定义。
Oracle Solaris 操作系统还提供了几个支持工具和库。可以使用这些工具分析和检查这些目标文件和链接进程。这些工具包括 elfdump(1)、lari(1)、nm(1)、dump(1)、ldd(1)、pvs(1)、elf(3ELF),以及一个链接程序调试支持库。在本文档中,许多讨论都含有这些工具的示例。