以下各节提供了最常用的链接编辑器方案的简单概述(也可称为备忘单)。有关链接编辑器生成的输出模块种类的介绍,请参见链接编辑。
提供的示例说明了提供给编译器驱动程序的链接编辑器选项,即调用链接编辑器最常用的机制。在这些示例中,将会使用 cc(1)。 请参见使用编译器驱动程序。
链接编辑器不会对任何输入文件名赋予任何意义。每个文件都会被打开并检查,以确定其需要的处理类型。 请参见输入文件处理。
可以使用 -l 选项输入遵循命名约定 libx.so 的共享库,以及遵循命名约定 libx.a 的归档库。 请参见库命名约定。这为允许使用 -L 选项来指定搜索路径提供了更大的灵活性。 请参见链接编辑器搜索的目录。
链接编辑器本质上以静态或动态两种模式之一运行。
使用 -d n 选项时会选定静态模式,通过此模式可创建可重定位目标文件和静态可执行文件。在此模式下,可以接受的输入形式只有可重定位目标文件和归档库。使用 -l 选项可以对归档库进行搜索。
$ cc -dn -r -o temp.o file1.o file2.o file3.o ..... |
静态可执行文件的使用将受到限制。 请参见静态可执行文件。静态可执行文件通常包含特定于平台实现的细节,这会限制可执行文件在备用平台上运行的能力。许多 Solaris 库的实现都取决于动态链接功能,如 dlopen(3C) 和 dlsym(3C)。 请参见装入其他目标文件。这些功能对于静态可执行文件不可用。
要创建静态可执行文件,请使用-d n 选项而不要使用 -r 选项:
$ cc -dn -o prog file1.o file2.o file3.o ..... |
-a 选项可用于指示静态可执行文件的创建。使用-d n 而不使用 -r 选项隐含表示为使用 -a。
动态模式是链接编辑器操作的缺省模式。指定 -d y 选项可以强制执行此模式;但是只要不使用 -d n 选项,则隐含表示为使用此模式。
在此模式下,可以接受的输入形式包括可重定位目标文件、共享库和归档库。使用 -l 选项可以进行目录搜索,即搜索每个目录以查找共享库。如果未找到任何共享库,则会搜索同一目录来查找归档库。使用 -B static 选项可以强制仅对归档库执行搜索。 请参见同时链接共享库和归档。
输入可重定位目标文件应该通过与位置无关的代码生成。例如,C 编译器使用 -K pic 选项生成与位置无关的代码。 请参见与位置无关的代码。使用 -z text 选项可以强制实施此要求。
请避免包括未使用的可重定位目标文件。或者,请使用 -z ignore 选项,此选项可指示链接编辑器删除未引用的 ELF 节。 请参见删除未使用的材料。
如果共享库旨在供外部使用,请确保其不使用任何应用程序寄存器。如果不使用应用程序寄存器,则外部用户可自由使用这些寄存器,而不必担心会危及共享库的实现。例如,SPARC C 编译器在使用 -xregs=no%appl 选项时不使用应用程序寄存器。
请通过定义应从共享库可见的全局符号并将其他任何全局符号限制到局部范围来建立共享库公共接口。该定义由 -M 选项与关联的 mapfile 共同提供。 请参见附录 B,版本控制快速参考。
请针对共享库使用版本化名称以便将来可以升级。 请参见协调版本化文件名。
独立的共享库可提供最大的灵活性。目标文件表示所有依赖性需要时会生成独立的共享库。使用 -z defs 可强制实现这种独立。 请参见生成共享库输出文件。
请避免使用不需要的依赖项。请使用带有 -u 选项的 ldd 来检测并删除不需要的依赖项。 请参见共享库处理。或者,请使用 -z ignore 选项,此选项可指示链接编辑器将依赖项仅记录到所引用的目标文件中。
如果要生成的共享库依赖于其他共享库,则表明应该使用 -z lazyload 选项以延迟方式装入这些依赖项。 请参见延迟装入动态依赖项。
如果要生成的共享库依赖于其他共享库,并且这些依赖项不是位于缺省的搜索位置中,请使用 -R 选项将其路径名记录在输出文件中。 请参见具有依赖项的共享库。
请通过将可重定位的各节合并成单独一个 .SUNW_reloc 节来优化可重定位处理。请使用 -z combreloc 选项。
如果没有针对此目标文件或其依赖项使用插入符号,请使用 -B direct 建立直接绑定信息。 请参见直接绑定。
以下示例结合了以上几点:
$ cc -c -o foo.o -K pic -xregs=no%appl foo.c $ cc -M mapfile -G -o libfoo.so.1 -z text -z defs -B direct -z lazyload \ -z combreloc -z ignore -R /home/lib foo.o -L. -lbar -lc |
如果要生成的共享库用作其他链接编辑的输入,请使用 -h 选项在其中记录共享库的运行时名称。 请参见记录共享库名称。
请通过创建指向非版本化共享库名称的文件系统链接,使共享库可用于编译环境中。 请参见协调版本化文件名。
以下示例结合了以上几点:
$ cc -M mapfile -G -o libfoo.so.1 -z text -z defs -B direct -z lazyload \ -z combreloc -z ignore -R /home/lib -h libfoo.so.1 foo.o -L. -lbar -lc $ ln -s libfoo.so.1 libfoo.so |
请考虑共享库的性能含义,即最大化共享性,如最大化可共享性中所述:最小化换页活动,如最小化换页活动中所述:减少重定位开销,尤其是通过最大程度上减少符号重定位的次数,如缩减符号范围中所述:允许通过功能接口访问数据,如复制重定位中所述。
表明应使用 -z lazyload 选项以延迟方式装入动态可执行文件的依赖项。 请参见延迟装入动态依赖项。
请避免使用不需要的依赖项。请使用带有 -u 选项的 ldd 来检测并删除不需要的依赖项。 请参见共享库处理。或者,请使用 -z ignore 选项,此选项可指示链接编辑器将依赖项仅记录到所引用的目标文件中。
如果动态可执行文件的依赖项不是位于缺省搜索位置中,请使用 -R 选项将其路径名记录在输出文件中。 请参见运行时链接程序搜索的目录。
请使用 -B direct 来建立直接绑定信息。 请参见直接绑定。
以下示例结合了以上几点:
$ cc -o prog -R /home/lib -z ignore -z lazyload -B direct -L. \ -lfoo file1.o file2.o file3.o ..... |