Solaris(64 位)开发者指南

链接目标文件

链接程序仍然是 32 位应用程序,但是该应用程序对于大多数用户应保持透明,因为它通常是由编译器驱动程序(例如 cc(1))间接调用的。如果向链接程序提供 ELF32 目标文件的集合作为输入,则它会创建 ELF32 输出文件;同样,如果向链接程序提供 ELF64 目标文件的集合作为输入,则它会创建 ELF64 输出文件。 链接程序不允许尝试混合使用 ELF32 和 ELF64 输入文件。

LD_LIBRARY_PATH 环境变量

SPARC。32 位应用程序和 64 位应用程序的动态链接程序分别是 /usr/lib/ld.so.1/usr/lib/sparcv9/ld.so.1

x86。对于 AMD64 体系结构,32 位应用程序和 64 位应用程序的动态链接程序分别是 /usr/lib/ld.so.1/usr/lib/amd64/ld.so.1

在运行时,这两个动态链接程序会搜索 LD_LIBRARY_PATH 环境变量所指定的用冒号分隔的相同目录列表。 但是,32 位动态链接程序仅绑定到 32 位库,而 64 位动态链接程序则仅绑定到 64 位库。 因此,如有必要,可通过 LD_LIBRARY_PATH 来指定同时包含 32 位和 64 位库的目录。

使用 LD_LIBRARY_PATH_64 环境变量可以完全覆盖 64 位动态链接程序的搜索路径。

$ORIGIN 关键字

分发和管理应用程序的一种常用方法就是将相关的应用程序和库放入一个简单的目录分层结构中。 通常,应用程序使用的库驻留在 lib 子目录中,而应用程序本身则驻留在基目录的 bin 子目录中。 该基目录随后可以使用 NFSTM(Sun 的分布式计算文件系统)导出并挂载到客户机上。 在某些环境中,自动挂载程序和名称服务可用来分发应用程序,并可确保应用程序分层结构的文件系统名称空间在所有客户机上都相同。 在此类环境中,可以在生成应用程序时,使用链接程序的 -R 标志来指定在运行时应当在其中搜索共享库的目录的绝对路径名。

但是在其他环境中,文件系统名称空间的控制并不是很好,并且开发者已转向使用调试工具(LD_LIBRARY_PATH 环境变量)来在包装脚本中指定库搜索路径。这是不必要的,因为可以在路径名(在链接程序的 -R 选项中指定)中使用 $ORIGIN 关键字。 $ORIGIN 关键字在运行时会扩展为可执行文件本身所在目录的名称。 实际上,这意味着可以使用相对于 $ORIGIN 的路径名来指定库目录的路径名。 这允许在完全未设置 LD_LIBRARY_PATH 的情况下重新定位应用程序的基目录。

此功能对于 32 位和 64 位应用程序均可用,并且需要考虑何时创建新的应用程序,以减少正确配置 LD_LIBRARY_PATH 时用户或脚本的依赖项。

有关更多详细信息,请参见《链接程序和库指南》