Linux ldd コマンド
ldd(List Dynamic Dependencies)は、Linux システムにおいて非常に便利なコマンドラインツールであり、プログラムや共有ライブラリが依存する動的リンクライブラリを表示するために使用されます。Linux 上でプログラムを実行するとき、システムはそのプログラムが依存するさまざまな共有ライブラリ(.so ファイル)をロードする必要があります。ldd はこれらの依存関係を確認するためのツールです。
ldd コマンドの基本構文
ldd [选项] 可执行文件或共享库
よく使うオプションとパラメータの説明
| オプション | 説明 |
|---|---|
| -v | 詳細なバージョン情報を表示する |
| -u | 未使用の直接依存関係を表示する |
| -d | リロケーションを実行し、欠落している関数を報告する |
| -r | リロケーションを実行し、欠落している関数とデータを報告する |
| --help | ヘルプ情報を表示する |
ldd コマンドの動作原理
ldd は実際にはスクリプトであり、特別な環境変数を設定して対象プログラムを実行することで、プログラムが正常に実行されるのではなく、ロード時に依存するライブラリ情報を表示するようにします。具体的には:
- ELF 形式の実行可能ファイルの場合、ldd はその動的セグメント(dynamic segment)を解析します
- DT_NEEDED エントリを確認して、必要な共有ライブラリを特定します
- システムのライブラリパスでこれらのライブラリファイルを検索します
- 各ライブラリの完全なパスとメモリアドレスマッピングを表示します
使用例
例1:単純なプログラムの依存関係を確認する
ldd /bin/ls
一般的な出力:
linux-vdso.so.1 (0x00007ffd5a3f0000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f8e4a3b0000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e4a1c0000) libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f8e4a130000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8e4a120000) /lib64/ld-linux-x86-64.so.2 (0x00007f8e4a400000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8e4a100000)
例2:未使用の直接依存関係を確認する
ldd -u /usr/bin/python3
例3:詳細モードで依存関係を確認する
ldd -v /usr/bin/gcc
実際の応用シーン
シーン1:「library not found」エラーを解決する
プログラムがライブラリ不足で実行できない場合、ldd を使用すると問題をすばやく特定できます:
ldd ./my_program | grep "not found"
シーン2:ライブラリのバージョン競合を確認する
ldd -r ./my_program
シーン3:ライブラリのパスが正しいか検証する
ldd /path/to/your/executable | awk '{print $3}' | xargs ls -la
注意事項とよくある問題
-
セキュリティ警告:信頼できない実行可能ファイルに ldd を使用しないでください。実際にプログラムのコードの一部を実行しようとするためです
- 代替手段:
objdump -p /path/to/program | grep NEEDED
- 代替手段:
-
静的リンクプログラム:完全に静的にリンクされたプログラムの場合、ldd は「not a dynamic executable」と表示します
-
クロスコンパイル環境:クロスコンパイル環境では、対応するプラットフォームの ldd ツールを使用する必要があります
-
よくあるエラー:
ldd: ./program: No such file or directory→ インタープリタが不足しているか、プログラム自体が存在しない可能性がありますldd: exited with unknown exit code→ プログラムが実行中にクラッシュする可能性があります
上級テクニック
1. readelf と組み合わせてより詳細な依存情報を確認する
readelf -d /path/to/program | grep NEEDED
2. LD_TRACE_LOADED_OBJECTS 環境変数を使用する
LD_TRACE_LOADED_OBJECTS=1 /path/to/program
3. ライブラリの依存ツリーを確認する
ldd /path/to/library.so | awk '{print $3}' | xargs ldd
まとめ
ldd は Linux のシステム管理とプログラムデバッグに欠かせないツールであり、次のことができます:
- プログラムの動的ライブラリ依存関係をすばやく表示する
- ライブラリの欠落やバージョン競合の問題の解決に役立つ
- プログラムの実行環境が完全かどうかを検証する
- ソフトウェアのパッケージングとデプロイを支援する
ldd コマンドの使い方を習得すると、Linux 環境で依存関係の問題を解決する効率を大幅に向上させることができます。
その他の拡張
Linux コマンド大全