第1 章• Solaris 链接程序介绍23
应用程序二进制接口
根据其定义,系统组件和应用程序组件之间的二进制接口允许非同步地实现这些功能的改
进。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)限制为2GB。
不需要命令行选项来区分32 位链接编辑或64 位链接编辑。链接编辑器使用命令行上第一个
可重定位目标文件的ELF 类来管理操作的模式。专用链接编辑(如,只来自mapfile 或归档
文件库的链接)不受命令行目标文件的影响。这些链接编辑缺省为32 位模式。在这些情况
下,可以使用链接编辑器的-64 选项强制执行64 位链接编辑。
链接编辑器对32 位目标文件和64 位目标文件的操作相同。本文档通常使用32 位示例。对
于64 位处理与32 位处理不同的情况,将明确指出。
有关64 位应用程序的更多信息,请参阅《Solaris 64-bit Developer’s Guide》。
环境变量
链接编辑器支持许多以字符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 的依赖项。
相关主题
24 链接程序和库指南• 2006 年10 月
在本文档中,任何对链接编辑器环境变量的引用都使用通用的无后缀变体。所有支持的环
境变量都在ld(1) 和ld.so.1(1) 中定义。
支持工具
Solaris 操作环境还提供了许多支持工具和库。可以使用这些工具分析和检查这些目标文件
和链接过程。这些工具包括
elfdump(1)、lari(1)、nm(1)、dump(1)、ldd(1)、pvs(1)、elf(3ELF),以及一个链接程序调试
支持库。在本文档中,许多过程都含有这些工具的示例。
相关主题
第1 章• Solaris 链接程序介绍25
26
链接编辑器
链接编辑过程根据一个或多个输入文件创建输出文件。输出文件的创建由提供给链接编辑
器的选项和输入文件提供的输入节控制。
所有文件都使用可执行链接格式(executable and linking format, ELF) 表示。有关ELF 格式的
完整说明,请参见第7 章。本章介绍两种ELF 结构:节和段。
节是ELF 文件中可以处理的最小不可分割单位。段是节的集合,节表示可由exec(2) 或运行
时链接程序ld.so.1(1) 映射到内存映像的最小独立单位。
虽然存在许多类型的ELF 节,但就链接编辑阶段而言可将所有节都归为两种类别:
包含程序数据的节,其解释仅对应用程序有意义,如程序指令.text 以及关联的数据
.data 和.bss。
包含链接编辑信息(如.symtab 和.strtab 中的符号表信息以及诸如.rela.text 的重定
位信息)的节。
本质上,链接编辑器将程序数据节串联成输出文件。链接编辑器将解释链接编辑信息节,
以便修改其他节。信息节还用于生成在后期处理输出文件时使用的新输出信息节。
以下对链接编辑器功能的简单细分介绍了本章中讨论的主题:
对提供的所有选项进行验证和一致性检查。
串联多个输入可重定位目标文件中具有相同特征的节,以便在输出文件中形成新的节。
串联的节又可与输出段关联。
处理可重定位目标文件和共享库中的符号表信息,以便验证并把引用和其定义合并起
来。在输出文件中生成新的符号表。
处理输入可重定位目标文件中的重定位信息,并通过更新其他输入节将此信息应用于输
出文件。此外,还可以生成输出重定位节以供运行时链接程序使用。
生成用于描述创建的所有段的程序头。
必要时生成动态链接信息节,这些节为运行时链接程序提供信息,如共享库依赖项和符
号绑定。
2第2 章
27
把相似的节串联起来以及关联节到段的处理是在链接编辑器中使用缺省信息完成的。对于
大多数链接编辑操作来说,链接编辑器提供的缺省节和段处理通常已满足要求。不过,可
将-M 选项与关联的mapfile 配合使用来处理这些缺省行为。请参见第9 章。
调用链接编辑器
可以从命令行直接运行链接编辑器,也可以让编译器驱动程序调用链接编辑器。以下两小
节详细介绍了这两种方法。但是,首选使用编译器驱动程序。编译环境通常是复杂且有时
会发生变化的一系列操作(仅对编译器驱动程序可识别)。
直接调用
直接调用链接编辑器时,必须提供创建预期输出所需的每个目标文件和库。链接编辑器对
创建输出时使用的目标文件模块或库不会作出任何假设。例如,当您发布以下命令时:
$ ld test.o
链接编辑器仅使用输入文件test.o 创建一个名为a.out 的动态可执行文件。要使a.out 成为
有用的可执行文件,应该包括用于启动和退出处理的代码。此代码可以特定于语言或操作
系统,并且通常通过编译器驱动程序提供的文件提供。
此外,您还可以提供自己的初始化代码和终止代码。必须正确封装和标记此代码,以便运
行时链接程序可以正确识别并使用代码。也可以通过编译器驱动程序提供的文件提供此封
装和标记。
创建运行时目标文件(如可执行文件和共享库)时,应使用编译器驱动程序来调用链接编
辑器。建议仅在使用-r 选项创建中间可重定位目标文件时直接调用链接编辑器。
使用编译器驱动程序
通常通过特定于语言的编译器驱动程序来使用链接编辑器。需要为编译器驱动程序cc(1) 和
CC(1) 等等提供组成应用程序的输入文件。编译器驱动程序将添加其他文件和缺省库以完成
链接编辑。展开编译调用可以看到这些其他文件,例如:
$ cc -# -o prog main.o
/usr/ccs/bin/ld -dy /opt/COMPILER/crti.o /opt/COMPILER/crt1.o \
/usr/ccs/lib/values-Xt.o -o prog main.o \
-YP,/opt/COMPILER/lib:/usr/ccs/lib:/usr/lib -Qy -lc \
/opt/COMPILER/crtn.o
调用链接编辑器
28 链接程序和库指南• 2006 年10 月
注– 编译器驱动程序包括的实际文件和用于显示链接编辑器调用的机制可能有所不同。
指定链接编辑器选项
大多数选项可以通过编译器驱动程序的命令行传递到链接编辑器。通常,编译器选项和链
接编辑器选项不会产生冲突。如果产生冲突,编译器驱动程序通常提供一种命令行语法,
您可以使用该语法将特定选项传递到链接编辑器。也可以通过设置LD_OPTIONS 环境变量为
链接编辑器提供选项。
$ LD_OPTIONS="-R /home/me/libs -L /home/me/libs" cc -o prog main.c -lfoo
链接编辑器解释-R 和-L 选项。这些选项位于从编译器驱动程序接收的任何命令行选项的前
面。
链接编辑器解析整个选项列表,以查找任何无效选项或具有无效关联参数的任何选项。如
果发现其中任何一种情况,则生成一条适当的错误消息。如果该错误被认为是致命错误,
则链接编辑将终止。在以下示例中,链接编辑器通过检查捕获到非法选项-X 和-z 选项的非
法参数。
$ ld -X -z sillydefs main.o
ld: illegal option -- X
ld: fatal: option -z has illegal argument ‘sillydefs’
如果指定了某个需要关联参数的选项两次,则链接编辑器将产生适当的警告并继续进行链
接编辑。
$ ld -e foo ...... -e bar main.o
ld: warning: option -e appears more than once, first setting taken
链接编辑器还会检查选项列表以查看是否存在任何致命的不一致性错误。
$ ld -dy -a main.o
ld: fatal: option -dy and -a are incompatible
处理完所有选项之后,如果未检测到任何致命错误状态,则链接编辑器将继续处理输入文
件。
请参见附录A以了解最常用的链接编辑器选项,并参见ld(1) 以了解所有链接编辑器选项的
完整说明。
指定链接编辑器选项