【问题标题】: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) 命令。