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

退出打印视图

更新时间: 2014 年 7 月
 
 

非绑定产品之间的依赖性

另一个与依赖项位置相关的问题是如何建立非绑定产品能借以表达相互之间依赖性的模型。

例如,非绑定产品 XYZ 可能依赖于产品 ABC。可以通过主机软件包安装脚本来建立此依赖性。此脚本生成一个指向 ABC 产品安装点的符号链接,如下图所示:

图 10-2  非绑定共同依赖项

image:非绑定共同依赖项示例。

XYZ 产品的二进制代码和共享目标文件可使用符号链接来表示其对于 ABC 产品的依赖性。此链接现在是一个稳定的参照点。对于应用程序 xyz,此运行路径将如下所示:

$ cc -o xyz xyz.c '-R$ORIGIN/../lib:$ORIGIN/../ABC/lib' \
    -L/opt/ABC/lib -lX -lA
$ elfdump -d xyz | egrep 'NEEDED|RUNPATH'
     [0]  NEEDED           0x1b5               libX.so.1
     [1]  NEEDED           0x1bf               libA.so.1
     ....
     [2]  NEEDED           0x18f               libc.so.1
     [5]  RUNPATH          0x1c9               $ORIGIN/../lib:$ORIGIN/../ABC/lib

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

$ cc -o libX.so.1 -G -Kpic X.c '-R$ORIGIN:$ORIGIN/../ABC/lib' \
    -L/opt/ABC/lib -lY -lC
$ elfdump -d libX.so.1 | egrep 'NEEDED|RUNPATH'
     [0]  NEEDED           0x96                libY.so.1
     [1]  NEEDED           0xa0                libC.so.1
     [5]  RUNPATH          0xaa                $ORIGIN:$ORIGIN/../ABC/lib

如果此产品目前安装在 /usr/local/XYZ 下,则需要使用其后安装脚本来建立以下内容的符号链接:

$ ln -s ../ABC /usr/local/XYZ/ABC

如果在您的 PATH 中增加 /usr/local/XYZ/bin,则调用应用程序 xyz 将产生如下所示的路径名查询,以查找其依赖项:

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

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

  find object=libY.so.1; required by /usr/local/XYZ/lib/libX.so.1
    search path=$ORIGIN:$ORIGIN/../ABC/lib \
               (RUNPATH/RPATH from file /usr/local/XYZ/lib/libX.so.1)
      trying path=/usr/local/XYZ/lib/libY.so.1
        libY.so.1 =>     /usr/local/XYZ/lib/libY.so.1

  find object=libC.so.1; required by /usr/local/XYZ/lib/libX.so.1
    search path=$ORIGIN:$ORIGIN/../ABC/lib \
               (RUNPATH/RPATH from file /usr/local/XYZ/lib/libX.so.1)
      trying path=/usr/local/XYZ/lib/libC.so.1
      trying path=/usr/local/ABC/lib/libC.so.1
        libC.so.1 =>     /usr/local/ABC/lib/libC.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

注 - 在运行时,可以通过组合使用 dlinfo(3C)RTLD_DI_ORIGIN 标志来获取目标文件源。该来源路径可用于访问关联的产品分层结构中的其他文件。