输入可重定位目标文件应该通过与位置无关的代码生成。例如,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 |