查找二进制文件所链接的库

查找二进制文件所链接的库

我知道有一个命令可以列出软件所链接的库和相应的版本。

与 ld 或 libtool 有关吗?

但我就是想不起来。在谷歌上搜索了好久,也没找到什么有用的信息。

更新
ldd <binary>有助于 Linux,(@埃尔内利),而我发现otool -L <binary>在 MacOS X 上也有类似的事情。

答案1

尝试 ldd二进制执行

例子:

~$ ldd /bin/bash
    linux-gate.so.1 =>  (0x00606000)
    libncurses.so.5 => /lib/libncurses.so.5 (0x00943000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00c5d000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x003e9000)
    /lib/ld-linux.so.2 (0x00a41000)

答案2

要找到它直接需要的东西:

readelf -d APP | grep NEEDED

ldd如其他地方所述,将显示所有直接和间接库 - 运行时所需的一切。这可能不是完整的列表,因为您可以使用 dlopen() 动态打开内容,但这在 99% 的时间内应该有效。

ld 和 libtool 在编译/链接时使用。一旦有了应用程序,它们就没用了。

编辑从您后来的回答中我可以看出您问的是有关 OSX 的问题,但我想补充一下有关 Linux 工具的回答:

很久以前我忘了提一件事;你问过版本问题。两者都ldd不会readelf回答“什么版本”的问题。他们会告诉你你正在寻找的库的文件名,命名约定可能有一些版本信息,但没有任何东西强制执行这一点。符号可能是版本化的,你需要了解甚至更低级别的知识才能nm看到这些,

答案3

另一种方法是使用 objdump。

objdump -x “二进制” | grep 需要

这仅显示此二进制文件所需的所有依赖项。非常有用。

答案4

其他答案忽略了一个重要点:

共享库可以是直接地链接,或间接通过另一个库链接。

仅限直接链接

objdump --private-headers “${bin}” | grep ‘NEEDED’ | cut --delimiter=’ ’ --fields=18-

为了全部

ldd “${bin}” | cut --fields=2 | cut --delimiter=' ' --fields=1 | rev | cut --delimiter='/' --fields=1 | rev | sort --unique --version-sort

相关内容