动态模式是链接编辑器操作的缺省模式。指定 -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 ..... |