动态模式是链接编辑器的缺省操作模式。通过指定 -d y 选项可以强制执行此模式;但是只要不使用 -d n 选项,便隐含表示为使用此模式。
在此模式下,可以接受的输入形式包括可重定位目标文件、共享目标文件和归档库。使用 -l 选项可以进行目录搜索,即搜索每个目录以查找共享目标文件。如果未找到任何共享目标文件,则会搜索同一目录来查找归档库。使用 -B static 选项可以强制仅对归档库执行搜索。请参见同时链接共享目标文件和归档。
输入可重定位目标文件应当通过与位置无关的代码生成。例如,C 编译器可以使用 -K pic 选项生成与位置无关的代码。请参见与位置无关的代码。使用 -z text 选项可以强制实施此要求。
请避免包含未使用的可重定位目标文件。或者,请使用 -z ignore 选项,此选项指示链接编辑器删除未引用的 ELF 节。请参见删除未使用的材料。
应用程序寄存器是 SPARC 体系结构的一项功能,可保留以供最终用户使用。供外部使用的 SPARC 共享目标文件应当对 C 编译器使用 -xregs=no%appl 选项,以便确保共享目标文件不使用任何应用程序寄存器。这样可以使应用程序寄存器对于任何外部用户均可用,同时不影响共享目标文件的实现。
通过定义应从共享目标文件可见的全局符号并将其他任何全局符号缩减到局部作用域,来建立共享目标文件的公共接口。该定义由 -M 选项与关联的 mapfile 共同提供。请参见附录 B。
请针对共享目标文件使用版本化名称以便将来可以升级。请参见协调版本化文件名。
自包含的共享目标文件可以提供最大的灵活性。目标文件表示所有依赖性需要时会生成这些共享目标文件。使用 -z defs 可强制实现这种自包含。请参见生成共享目标文件输出文件。
请避免不需要的依赖项。请使用带有 -u 选项的 ldd 来检测并删除不需要的依赖项。请参见共享目标文件处理。或者,使用 -z ignore 选项,此选项可指示链接编辑器将依赖项仅记录到所引用的目标文件中。
如果要生成的共享目标文件依赖于其他共享目标文件,则表明应该使用 -z lazyload 选项以延迟方式装入这些依赖项。请参见延迟装入动态依赖项。
如果要生成的共享目标文件依赖于其他共享目标文件,并且这些依赖项并不位于缺省的搜索位置,请使用 -R 选项将其路径名记录在输出文件中。请参见具有依赖项的共享目标文件。
如果没有针对此目标文件或其依赖项使用插入符号,请使用 -B direct 建立直接绑定信息。请参见附录 D。
以下示例结合了以上几点。
$ 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 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 ignore -R /home/lib -h libfoo.so.1 foo.o -L. -lbar -lc $ ln -s libfoo.so.1 libfoo.so
请考虑共享目标文件的性能含义:最大化共享性,如最大化可共享性中所述;最小化换页活动,如最小化分页活动中所述;减少重定位开销,尤其是通过最大程度上减少符号重定位的次数,如缩减符号作用域中所述;允许通过功能接口访问数据,如复制重定位中所述。
建议使用链接编辑器的 -z guidance 选项。指导消息提供有关链接编辑器选项和其他操作的建议,以帮助改善生成的目标文件。
表明应使用 -z lazyload 选项延迟装入动态可执行文件的依赖项。请参见延迟装入动态依赖项。
请避免不需要的依赖项。请使用带有 -u 选项的 ldd 来检测并删除不需要的依赖项。请参见共享目标文件处理。或者,使用 -z ignore 选项,此选项可指示链接编辑器将依赖项仅记录到所引用的目标文件中。
如果动态可执行文件的依赖项不位于缺省的搜索位置,请使用 -R 选项将其路径名记录在输出文件中。请参见运行时链接程序搜索的目录。
使用 -B direct 建立直接绑定信息。请参见附录 D。
以下示例结合了以上几点。
$ cc -o prog -R /home/lib -z ignore -z lazyload -B direct -L. \ -lfoo file1.o file2.o file3.o .....