答案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