查找二进制文件链接的库

er4*_*z0r 47 linux shared-libraries macos

我知道有一个命令列出了软件所链接的库和各自的版本。

有 ld 或 libtool 的东西吗?

但我就是想不起来。在谷歌上花了一些时间,但没有想出任何有用的东西。

更新
ldd <binary>对 linux 有帮助,(来自@ Ernelli),而我发现它otool -L <binary>在 MacOS X 上做了类似的事情。

Ern*_*lli 48

试试 ldd binary-exec

例子:

~$ 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)
Run Code Online (Sandbox Code Playgroud)

  • grwaity:你是对的。虽然 ldd 在 linux 上会有所帮助,但我发现 'otool -L &lt;binary&gt;' 做了类似的事情。 (7认同)

Ric*_*lka 19

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

readelf -d APP | grep NEEDED
Run Code Online (Sandbox Code Playgroud)

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

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

编辑我可以从您询问 OSX 的稍后答案中看到,但我想添加到我关于 Linux 工具的答案中:

很久以前我忘了提一件事;你问过版本。既ldd不会也readelf不会回答“什么版本”的问题。他们会告诉您要查找的库的文件名,并且命名约定可能有一些版本信息,但没有强制执行此操作。符号可能是版本化的,你必须使用更低的级别nm才能看到这些,


小智 11

另一种方法是使用 objdump。

objdump -x "二进制" | 需要grep

这仅显示此二进制文件的所有需要​​的依赖项。很有用。