可以从命令行直接运行链接编辑器,也可以让编译器驱动程序调用链接编辑器。以下两小节详细介绍了这两种方法。但是,首选使用编译器驱动程序。编译环境通常是复杂且有时会发生变化的一系列操作(仅对编译器驱动程序可识别)。
直接调用链接编辑器时,必须提供创建预期输出所需的每个目标文件和库。链接编辑器对创建输出时要使用的目标文件模块或库不做任何假设。例如,以下命令将指示链接编辑器仅使用输入文件 test.o 创建名为 a.out 的动态可执行文件。
$ ld test.o
通常,动态可执行文件需要专用的启动代码和退出处理代码。此代码可能特定于语言或操作系统,并且通常通过编译器驱动程序提供的文件提供。
此外,您还可以提供自己的初始化代码和终止代码。必须正确封装和标记此代码,以便运行时链接程序可以正确识别并使用代码。也可以通过编译器驱动程序提供的文件提供此封装和标记。
创建运行时目标文件(如可执行文件和共享目标文件)时,应使用编译器驱动程序来调用链接编辑器。建议仅在使用 -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
注 - 编译器驱动程序包括的实际文件和用于显示链接编辑器调用的机制可能有所不同。
链接编辑器以 32 位应用程序和 64 位应用程序的形式提供。每种链接编辑器都可以对 32 位目标文件和 64 位目标文件执行操作。但是,在一个链接编辑过程中不能同时处理 32 位目标文件和 64 位目标文件。虽然 32 位链接编辑器可以生成 64 位目标文件,但是生成的目标文件(不包括 .bss)的大小限制为 2 GB。
缺省情况下,编译器驱动程序执行 32 位链接编辑器。该链接编辑器会检查命令行,确定是否应执行 64 位链接编辑器来完成链接编辑。
通常,不需要使用命令行选项来区分 32 位链接编辑或 64 位链接编辑。链接编辑器使用命令行中第一个可重定位目标文件的 ELF 类来控制操作的模式。专用链接编辑(例如,完全来自 mapfile 或归档库的链接)不受命令行目标文件影响。这些链接编辑缺省为 32 位模式,需要使用一个命令行选项启动 64 位链接编辑。
在下列任一情况下,将执行 64 位链接编辑器。
创建极大的 32 位目标文件可能会用尽可供 32 位链接编辑器使用的虚拟内存。可使用 -z altexec64 选项强制使用关联的 64 位链接编辑器。64 位链接编辑器可提供更大的虚拟地址空间供生成 32 位目标文件。
对于 SPARC 或 x86 目标,链接编辑器是一个交叉链接编辑器,可以链接 32 位目标文件或 64 位目标文件。不允许混用 32 位目标文件和 64 位目标文件。同样,只允许单个计算机类型的目标文件。
通常,不需要使用命令行选项来区分链接编辑目标。链接编辑器使用命令行中第一个可重定位目标文件的 ELF 计算机类型来控制操作的模式。专用链接编辑(例如,完全来自 mapfile 或归档库的链接)不受命令行目标文件影响。这些链接编辑缺省为 32 位本机目标。要显式定义链接编辑目标,可使用 -z target 选项。