问题描述
我需要找出哪些 exe/so 文件依赖于另一个 so 文件。例如,libsample.so 文件被 libs1.so、libs2.so 和 sample.exe 使用。我知道我们可以通过运行 ldd 命令来获取 libs1.so、libs2.so 和 sample.exe 的依赖项。但反过来有可能吗?就像我想知道谁都依赖 libsample.so?
在我的项目 bin 文件夹下,libsample.so 依赖的所有库/exe 是什么?我们能找到吗?
解决方法
动态库依赖项存储在相关 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) 命令。