
答案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}" | objdump --private-headers "${bin}" | grep '需要' |剪切 --delimiter=' ' --fields=18-
為了全部:
ldd「${bin}」|切--字段=2 |剪切 --delimiter=' ' --fields=1 |轉 |剪切 --delimiter='/' --fields=1 |轉 |排序--唯一--版本排序