Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

查找关联的依赖项

通常,非绑定产品用于在唯一的位置上安装。此产品由二进制文件、共享目标文件依赖项和关联的配置文件组成。例如,非绑定产品 ABC 可能具有下图所示的布局。

图 10-1  非绑定依赖项

image:非绑定依赖项示例。

假定此产品适用于安装在 /opt 下。通常,您会向 PATH 中增加 /opt/ABC/bin,以定位产品的二进制代码。每个二进制代码均使用硬编码的运行路径在二进制代码内查找其依赖项。对于应用程序 abc,此运行路径将如下所示:

$ cc -o abc abc.c -R/opt/ABC/lib -L/opt/ABC/lib -lA
$ elfdump -d abc | egrep 'NEEDED|RUNPATH'
     [0]  NEEDED           0x1b5                libA.so.1
     ....
     [4]  RUNPATH          0x1bf                /opt/ABC/lib

类似地,对于依赖项 libA.so.1,此运行路径将如下所示:

$ cc -o libA.so.1 -G -Kpic A.c -R/opt/ABC/lib -L/opt/ABC/lib -lB
$ elfdump -d libA.so.1 | egrep 'NEEDED|RUNPATH'
     [0]  NEEDED            0x96                libB.so.1
     [4]  RUNPATH           0xa0                /opt/ABC/lib

此依赖项表示法将一直有效,直到将产品安装到除建议的缺省目录之外的某个目录中。

动态标记 $ORIGIN 扩展到目标文件的原始目录中。此标记可用于过滤器、运行路径或依赖项定义。可以使用此技术重新定义非绑定应用程序,根据 $ORIGIN 查找其依赖项:

$ cc -o abc abc.c '-R$ORIGIN/../lib' -L/opt/ABC/lib -lA
$ elfdump -d abc | egrep 'NEEDED|RUNPATH'
     [0]  NEEDED           0x1b5                libA.so.1
     ....
     [4]  RUNPATH          0x1bf                $ORIGIN/../lib

而依赖项 libA.so.1 也可以根据 $ORIGIN 进行定义:

$ cc -o libA.so.1 -G -Kpic A.c '-R$ORIGIN' -L/opt/ABC/lib -lB
$ elfdump -d lib/libA.so.1 | egrep 'NEEDED|RUNPATH'
     [0]  NEEDED            0x96                libB.so.1
     [4]  RUNPATH           0xa0                $ORIGIN

如果此产品目前安装在 /usr/local/ABC 下,并在您的 PATH 中增加 /usr/local/ABC/bin,则调用应用程序 abc 将产生如下所示的路径名查询,以查找其依赖项:

$ ldd -s abc
....
  find object=libA.so.1; required by abc
    search path=$ORIGIN/../lib  (RUNPATH/RPATH from file abc)
      trying path=/usr/local/ABC/lib/libA.so.1
        libA.so.1 =>     /usr/local/ABC/lib/libA.so.1

  find object=libB.so.1; required by /usr/local/ABC/lib/libA.so.1
    search path=$ORIGIN  (RUNPATH/RPATH from file /usr/local/ABC/lib/libA.so.1)
      trying path=/usr/local/ABC/lib/libB.so.1
        libB.so.1 =>     /usr/local/ABC/lib/libB.so.1

注 - 包含 $ORIGIN 标记的目标文件可使用符号链接进行引用。在这种情况下,符号链接完全解析以确定目标文件的真正来源。