ldd
は、Linuxの実行可能ファイル(バイナリ)や共有ライブラリが依存する他の共有ライブラリをリストアップするために使用されるコマンドです。これにより、プログラムやライブラリが動作するために必要なライブラリの依存関係を確認することができます。
1. 基本概念と動作
ldd
コマンドの動作
ldd
は、指定された実行可能ファイルまたは共有ライブラリが依存する共有ライブラリを表示します。内部的には、バイナリのELF(Executable and Linkable Format)ヘッダーを解析し、ダイナミックセクション(DT_NEEDED
)から必要なライブラリの情報を抽出します。
ELFファイルの構造
ELFファイルには、実行可能ファイルや共有ライブラリに関する様々な情報が格納されています。その中でもダイナミックセクション(DYNAMIC
)に、実行時に必要となるライブラリやシンボル情報が含まれています。
ダイナミックセクションと DT_NEEDED
ELFのダイナミックセクションに含まれるDT_NEEDED
タグには、ライブラリ名が格納されています。ldd
はこの情報を読み取り、ライブラリ名を表示します。
基本的な使い方
ldd
コマンドの基本的な構文は以下の通りです。
ldd <実行ファイルまたはライブラリのパス>
使用例
ldd /usr/bin/ls
上記のコマンドを実行すると、/usr/bin/ls
が依存しているライブラリのリストが表示されます。
出力例
linux-vdso.so.1 => (0x00007fffda5fe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f50c86f0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f50c8a06000)
出力される情報は以下の通りです:
- ライブラリ名(例:
libc.so.6
) - ロードされるパス(例:
/lib/x86_64-linux-gnu/libc.so.6
) - メモリ上のロードアドレス(例:
(0x00007f50c86f0000)
)
この情報を元に、依存するライブラリが正しくシステムに配置されているか、バージョンが合っているかなどを確認できます。
2. 依存ライブラリの詳細
ライブラリが見つからない場合
ldd
コマンドは、依存しているライブラリが見つからない場合には、not found
と表示します。
出力例(ライブラリが見つからない場合)
libXYZ.so.1 => not found
この場合、libXYZ.so.1
というライブラリがシステムにインストールされていないことを示しています。ライブラリが欠如している場合、インストールするか、ライブラリパスを設定する必要があります。
ライブラリが見つかった場合
ライブラリがシステムに存在する場合、ldd
はそのライブラリのパスを表示します。
出力例(ライブラリが見つかった場合)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f50c8a06000)
この場合、libm.so.6
が/lib/x86_64-linux-gnu/
に存在していることが確認できます。
ロードされたライブラリの確認
ldd
はバイナリが依存するライブラリを表示するだけでなく、それがメモリ上でどこにロードされているかも確認できます。
出力例
/lib64/ld-linux-x86-64.so.2 (0x00007f50c8a06000)
上記はld-linux-x86-64.so.2
がメモリのアドレス0x00007f50c8a06000
にロードされていることを示します。
3. よく使うオプション
-v
オプション(詳細情報を表示)
-v
オプションを使用すると、ldd
はより詳細な情報を表示します。例えば、どのシステムライブラリがリンクされているのか、バージョン情報などが確認できます。
ldd -v /usr/bin/ls
-u
オプション(未使用のライブラリを表示)
-u
オプションを使用すると、実際には使用されていないライブラリを表示します。これにより、実行ファイルが依存しているが、使用されていないライブラリを把握できます。
ldd -u /usr/bin/ls
--version
オプション(ldd
のバージョン表示)
--version
オプションを使うと、ldd
コマンド自体のバージョン情報を表示することができます。
ldd --version
4. ldd
を使う上でのセキュリティ注意点
ldd
は、内部で指定されたバイナリを実行してライブラリの依存関係を解析します。悪意のあるバイナリに対してldd
を実行すると、予期しない動作やセキュリティリスクが発生する可能性があります。
ldd
を使う際のリスク
- 不正なバイナリによるリスク
悪意のあるバイナリを直接実行してしまう可能性があります。そのため、ldd
コマンドは信頼できるバイナリに対してのみ実行するべきです。
安全に使用する方法
信頼できるバイナリに対してldd
を使用する前に、バイナリが安全であるかを確認することが重要です。また、以下のようにして、出力結果をファイルにリダイレクトして確認することも一つの方法です:
ldd /path/to/binary 2>/dev/null
これにより、不正なライブラリやリンクの問題が出力されることを防ぐことができます。
5. readelf
コマンドによる補完
ldd
はあくまで簡単に依存関係を表示するツールですが、さらに詳細な情報を得たい場合にはreadelf
コマンドを使用できます。特に、readelf -d
を使用することで、ELFファイルのダイナミックセクションを詳細に表示できます。
readelf -d /path/to/binary
出力例
Dynamic section at offset 0x1234 contains 32 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x00000001 (NEEDED) Shared library: [libm.so.6]
readelf -d
コマンドを使うと、DT_NEEDED
のエントリが直接表示され、どのライブラリが必要なのかが一目でわかります。