バイナリがリンクされたライブラリを見つける


40

ソフトウェアがリンクされたライブラリとそれぞれのバージョンをリストするコマンドがあることを知っています。

ldまたはlibtoolで何か?

しかし、私はただ覚えていません。グーグルにしばらく時間を費やしたが、役に立つものは何も思いつかなかった。


ldd <binary>Linuxでの更新は(@ Ernelli から)助けになりますが、MacOS Xでも同様のことができることがわかりました。otool -L <binary>


回答:


41

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)

ダン!だから私の最初の試みは正しかった。Macにインストールするだけで、コマンドが実際に認識されます;-)
er4z0r

@ er4z0r:参考までに、Mac OSはBSDであり、Linuxはありません
荒廃

6
grwaity:あなたは正しい。Linuxではlddが役立ちますが、「otool -L <binary>」が似たようなことをすることがわかりました。
er4z0r

15

直接必要なものを見つけるには:

readelf -d APP | grep NEEDED

ldd他の場所で述べたように、すべての直接および間接ライブラリ-実行時に必要なすべてを表示します。dlopen()で動的に開くことができるため、これは完全なリストではない場合がありますが、これは99%の時間で動作するはずです。

ldおよびlibtoolは、コンパイル/リンク時に使用されます。アプリを作成したら、それらは役に立ちません。

編集あなたがOSXについて尋ねていた後の答えで見ることができますが、Linuxツールに関する私の答えに追加したいです:

かなり前に、私が言及するのを忘れていた一つのこと。バージョンについて尋ねました。「どのバージョン」の質問にlddreadelf答えません。彼らはあなたが探しているライブラリのファイル名を教えてくれますし、命名規則は何らかのバージョン情報を持っているかもしれませんが、これを強制するものは何もありません。シンボルはバージョン管理されている可能性があり、nmこれらを表示するにはさらに低いレベルにする必要があります。


9

別の方法は、objdumpを使用することです。

objdump -x "バイナリ" | grepが必要

これにより、このバイナリにのみ必要な依存関係がすべて表示されます。非常に便利。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.