尋找二進位檔案連結的庫

尋找二進位檔案連結的庫

我知道有一個命令列出了軟體連結的庫和相應版本。

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}" | objdump --private-headers "${bin}" | grep '需要' |剪切 --delimiter=' ' --fields=18-

為了全部:

ldd「${bin}」|切--字段=2 |剪切 --delimiter=' ' --fields=1 |轉 |剪切 --delimiter='/' --fields=1 |轉 |排序--唯一--版本排序

相關內容