【问题标题】:Solaris .so file dependencySolaris .so 文件依赖项
【发布时间】:2021-05-13 21:17:07
【问题描述】:

我需要找出所有的 exe/so 文件都依赖于另一个 so 文件。例如,libs1.so、libs2.so 和 sample.exe 使用 libsample.so 文件。我知道我们可以通过运行 ldd 命令获得 libs1.so、libs2.so 和 sample.exe 的依赖关系。但是反过来有可能吗?像我想知道谁都依赖于 libsample.so?

在我的项目 bin 文件夹下,与 libsample.so 相关的所有库/exe 是什么?我们能找到吗?

【问题讨论】:

    标签: shared-libraries solaris ldd


    【解决方案1】:

    动态库依赖项存储在相关 ELF 二进制文件的 .dynamic 部分中。它们具有NEEDED 标签,值是依赖项的名称。例如:

    $ elfdump -d /usr/bin/nc | head
    
    Dynamic Section:  .dynamic
        index  tag              value    
          [0]  POSFLAG_1        0x1        [ LAZY ]
          [1]  NEEDED           0x61d      libresolv.so.2
          [2]  POSFLAG_1        0x1        [ LAZY ]
          [3]  NEEDED           0x63c      libdladm.so.1
          [4]  POSFLAG_1        0x1        [ LAZY ]
          [5]  NEEDED           0x65a      libuutil.so.1
          [6]  NEEDED           0x668      libc.so.1
    

    这些是直接依赖项。在上面的 /usr/bin/nc 示例中,当前有 4 个这样的条目。如果您在动态链接的二进制文件上运行ldd,它将为您提供递归依赖项。在我们的示例中,ldd /usr/bin/nc 总共打印了 91 个库依赖项(主要贡献者是 libdladm.so.1,它依赖于一大堆其他库,而这些库又依赖于其他库......)。

    系统中没有中心位置可以存储此依赖关系信息。它全部分布在 ELF 二进制文件中。因此,要获取可执行文件或库的依赖项(而不是依赖项),有必要遍历目录树的相关部分并累积它们。这应该很容易编写脚本,例如使用 find(1) 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2016-09-19
      相关资源
      最近更新 更多