输入可重定位目标文件应当通过与位置无关的代码生成。例如,C 编译器可以使用 –K pic 选项生成与位置无关的代码。请参见与位置无关的代码。使用 –z text 选项可以强制实施此要求。
避免包含未使用的可重定位目标文件。或者,请使用 –z discard-unused=sections 选项,此选项指示链接编辑器删除未引用的 ELF 节。请参见删除未使用的材料。
应用程序寄存器是 SPARC 体系结构的一项功能,可保留以供最终用户使用。供外部使用的 SPARC 共享目标文件应当对 C 编译器使用 –xregs=no%appl 选项,以便确保共享目标文件不使用任何应用程序寄存器。这样可以使应用程序寄存器对于任何外部用户均可用,同时不影响共享目标文件的实现。
通过定义应从共享目标文件可见的全局符号并将其他任何全局符号缩减到局部作用域,来建立共享目标文件的公共接口。该定义由 –M 选项与关联的 mapfile 共同提供。请参见Chapter 9, 接口和版本控制。
请针对共享目标文件使用版本化名称以便将来可以升级。请参见协调版本化文件名。
自包含的共享目标文件可以提供最大的灵活性。目标文件表示所有依赖性需要时会生成这些共享目标文件。使用 –z defs 可强制实现这种自包含。请参见生成共享目标文件输出文件。
避免包含不需要的依赖项。请使用带有 –u 选项的 ldd 来检测并删除不需要的依赖项。请参见共享目标文件处理。或者,使用 –z discard-unused=dependencies 选项,此选项指示链接编辑器将依赖项仅记录到所引用的目标文件中。
如果要生成的共享目标文件依赖于其他共享目标文件,则表明应该使用 –z lazyload 选项以延迟方式装入这些依赖项。请参见延迟装入动态依赖项。
如果要生成的共享目标文件依赖于其他共享目标文件,并且这些依赖项并不位于缺省的搜索位置,请使用 –R 选项将其路径名记录在输出文件中。请参见具有依赖项的共享目标文件。
如果没有针对此目标文件或其依赖项使用插入符号,请使用 –B direct 建立直接绑定信息。请参见Chapter 6, 直接绑定。
以下示例结合了以上几点。
$ 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 discard-unused=sections -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 discard-unused=sections -R /home/lib -h libfoo.so.1 foo.o -L. -lbar -lc $ ln -s libfoo.so.1 libfoo.so