lddコマンドの使い方を徹底解説!Linuxの依存ライブラリを確認する基本技術
生徒
「Linux(リナックス)でプログラムを動かそうとしたら、共有ライブラリが足りないというエラーが出てしまいました。どうすれば調べられますか?」
先生
「それは困りましたね。そんな時はldd(エルディーディー)コマンドを使えば、そのプログラムがどのライブラリを必要としているか一目で分かりますよ。」
生徒
「lddですか?難しそうな名前ですが、初心者でも使いこなせますか?」
先生
「仕組みはシンプルです。依存関係(イゾンカンケイ)という、プログラム同士のつながりを確認するだけですから。具体的な使い方を一緒に見ていきましょう。」
Linuxを初めて学ぶ人や、 OS・プロセス・メモリ管理・仮想マシン・コンテナの仕組みを図解で理解したい人におすすめの定番書籍です。
試して理解 Linuxのしくみを見る※ Amazonアソシエイト広告リンク
1. lddコマンドとは?
lddコマンドは、Linuxにおいて実行ファイルが必要としている共有ライブラリを表示するためのコマンドです。読み方はldd(エルディーディー)といいます。これは「List Dynamic Dependencies(リスト・ダイナミック・ディペンデンシーズ)」の略称で、直訳すると「動的依存関係の一覧」という意味になります。
Linuxの多くのプログラムは、自分自身ですべての機能を持っているわけではありません。他のプログラムと共通で使える部品である「共有ライブラリ(キョウユウライブラリ)」を呼び出して動いています。例えば、文字を画面に出す機能や、ネットワーク通信をする機能などは、外部のライブラリに頼っています。この「頼っている状態」を依存関係(イゾンカンケイ)と呼びます。
lddを使えば、特定のコマンドがどのファイルをライブラリとして読み込んでいるのか、またそのファイルがシステム上のどこに配置されているのかを瞬時に確認できるため、トラブルシューティングには欠かせないツールです。
2. 共有ライブラリの役割と重要性
共有ライブラリ(キョウユウライブラリ)とは、複数のアプリケーションで共通して利用される便利なプログラム集のことです。Windows(ウィンドウズ)の世界では「DLL(ディーエルエル)」と呼ばれているものに相当します。Linuxでは、一般的にファイル名の末尾が「.so」で終わる形式になっています。これは「Shared Object(シェアード・オブジェクト)」の略です。
なぜライブラリを共有するのでしょうか。それは、メモリの節約と開発の効率化のためです。もしすべてのプログラムが同じ機能を自前で持っていたら、ディスク容量を無駄に消費してしまいます。共有ライブラリという「共通の道具箱」を用意しておくことで、プログラム本体のサイズを小さく保つことができるのです。
しかし、プログラムを実行する際に、この「道具箱」が見つからないと、プログラムは「そんなファイルはありません」とエラーを出して止まってしまいます。これを解決するために、lddコマンドで中身をチェックする作業が必要になります。
3. lddコマンドの基本的な使い方
まずは最も基本的な使い方を確認しましょう。使い方は非常に簡単で、lddの後に調べたい実行ファイルのパスを指定するだけです。一般ユーザー権限で実行できるので、システムを壊す心配もありません。
例えば、私たちが普段よく使うls(エルエス)コマンドが、どのようなライブラリに依存しているか調べてみましょう。
ldd /usr/bin/ls
linux-vdso.so.1 (0x00007ffeeb9f4000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3a8b2f0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3a8b000000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f3a8b250000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3a8b350000)
実行結果には、左側にライブラリ名、右側にそのライブラリが実際に存在するシステムのフルパスが表示されます。一番右側の括弧内の数字は、メモリ上のアドレスを示しています。もしライブラリが見つからない場合は、ここに「not found(ノット・ファウンド)」と表示されます。
4. 出力結果の読み方をマスターしよう
lddの出力にはいくつかのパターンがあります。初心者の方が特に注目すべきは、矢印(=>)の記号です。これは「プログラムが探している名前 => 実際にシステムで見つかった場所」という意味を持っています。
例えば、libc.so.6(リブシー)というライブラリは、ほとんどのC言語で作られたプログラムが必要とする標準ライブラリです。これが正常にリンクされているかは非常に重要です。以下の例では、cat(キャット)コマンドの依存関係を確認しています。
ldd /usr/bin/cat
linux-vdso.so.1 (0x00007fff555fe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9e400000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8b9e650000)
表示されているlinux-vdso.so.1は、システムコールを高速化するためにカーネルが提供する仮想的なライブラリで、実際のファイルとしては存在しません。また、最後に表示されるld-linuxは「ダイナミックリンカ(ダイナミックリンカ)」と呼ばれるもので、他のライブラリを読み込む役割を持つ特別なプログラムです。
5. ライブラリが見つからない時のトラブル解決
自作したプログラムや、外部からダウンロードしたバイナリファイルを実行しようとして「error while loading shared libraries(エラー・ホワイル・ローディング・シェアード・ライブラリーズ)」というメッセージが出た場合、lddの出番です。
もしライブラリが不足していると、次のような表示になります。
ldd ./my_program
linux-vdso.so.1 (0x00007ffca839e000)
libtest.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2a1c600000)
このように「not found」と出た場合は、そのライブラリがシステムにインストールされていないか、インストールされていてもパス(保存場所の情報)が通っていないことを意味します。この問題を解決するには、ライブラリを適切なディレクトリに配置するか、LD_LIBRARY_PATH(エルディー・ライブラリ・パス)という環境変数を設定して、読み込み先を教えてあげる必要があります。
6. 詳細情報を確認するオプション機能
lddコマンドには、より詳しく調べたい時のためのオプションが用意されています。特によく使われるのが、未使用の依存関係を表示する機能や、詳細なシンボル情報を出す機能です。しかし、初心者のうちは、すべてのライブラリを表示する-v(バーボーズ)オプションを覚えておくと便利です。
-vオプションを使うと、ライブラリのバージョン情報なども詳しく表示されます。これにより、バージョンが古すぎて動かないといった問題の特定が可能になります。
ldd -v /usr/bin/grep
linux-vdso.so.1 (0x00007ffd31dfd000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f45c8100000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f45c7e00000)
Version information:
/usr/bin/grep:
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libpcre2-8.so.0 (LIBPCRE2_8_0) => /lib/x86_64-linux-gnu/libpcre2-8.so.0
通常の表示よりも情報量が多くなりますが、「Version information」という項目を見ることで、どのバージョンのライブラリが要求されているかが分かります。
7. ldd実行時の注意点とセキュリティ
lddコマンドを使う上で、一つだけ知っておくべき重要な注意点があります。それは、信頼できない実行ファイルに対して不用意にlddを実行しないということです。
実はlddは、対象のプログラムを安全な環境で一部実行しようとする性質があります。そのため、悪意のあるプログラム(ウイルスなど)に対して実行すると、ライブラリを確認するだけのつもりが、その不正なコードが実行されてしまう危険性がゼロではありません。
もし提供元が不明なファイルを安全に調べたい場合は、objdump(オブジェクトダンプ)やreadelf(リードエルフ)といった、ファイルを「実行」せずに中身のテキスト情報だけを解析するコマンドを使うのが、中級者以上のセオリーです。普段使いの標準的なコマンドを調べる分には、全く問題ありませんので安心してください。
8. システム全体のライブラリ管理を支える仕組み
Linuxには、ライブラリを効率よく探すための「キャッシュ」という仕組みがあります。/etc/ld.so.conf(設定ファイル)やldconfig(エルディーコンフィグ)というコマンドがそれにあたります。
新しいライブラリをインストールした直後は、システムがまだその存在を認識していないことがあります。そんな時はルートユーザーでキャッシュを更新します。
ldconfig
(何も表示されませんが、内部でライブラリのリストが更新されます)
lddで「not found」が出たけれど、確かにファイルは存在するという場合は、このldconfigを実行することで解決することが多いです。このように、lddは単独で使うだけでなく、システムの設定と組み合わせて活用される重要なコマンドなのです。
LPICレベル1の合格を目指している人や、 Linuxコマンド・シェル・ネットワーク・セキュリティの試験対策を効率よく進めたい人におすすめの定番問題集です。
Linux教科書 LPICレベル1 スピードマスター問題集を見る※ Amazonアソシエイト広告リンク
まとめ
Linuxシステムを安定して運用し、アプリケーションの実行エラーを迅速に解決するためには、lddコマンドの習得が欠かせません。本記事では、実行ファイルが依存している共有ライブラリ(Shared Object)を確認する方法から、トラブルシューティングの肝となる「not found」への対処法まで詳しく解説しました。
lddコマンドの重要ポイント再確認
lddコマンドは、単にファイルの一覧を表示するだけではありません。システムがどのようにプログラムをメモリ上に展開し、どのパスにあるライブラリを優先的に読み込んでいるかを可視化します。これにより、ライブラリのバージョン競合や、誤ったディレクトリからの読み込みといった、目に見えにくい問題を特定できるのです。
依存関係の可視化
プログラムが動作するために必須な「.so」ファイルの配置場所を瞬時にリストアップします。開発環境と本番環境の差異を調べる際にも有効です。
トラブル解決の鍵
「error while loading shared libraries」というエラーに直面した際、どの部品が欠けているのかを「not found」表示で具体的に示してくれます。
実践的な活用シーンとコマンド例
実際の開発現場やサーバー構築において、lddはどのように使われるでしょうか。例えば、特定の共有ライブラリが正しくリンクされているかを、パイプ処理とgrepを組み合わせて効率的に抽出することがよくあります。
# 特定のライブラリ(例: libc)が含まれているかだけを素早く確認
ldd /usr/bin/python3 | grep libc
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9e400000)
また、ライブラリのパスを一時的に通して動作確認を行う場合は、LD_LIBRARY_PATHという環境変数を利用します。以下のサンプルは、カレントディレクトリにあるカスタムライブラリを認識させてからプログラムを検証する際の手順です。
# 独自のライブラリディレクトリを追加してlddで確認する例
export LD_LIBRARY_PATH=/home/user/my_libs:$LD_LIBRARY_PATH
ldd ./my_application
プロフェッショナルな運用のために
Linuxエンジニアとして一歩先へ行くためには、lddの結果を受けて「どうシステムを修正するか」という判断力が求められます。共有ライブラリの検索パスは、主に以下の優先順位で決定されます。
- 実行ファイルに埋め込まれた RPATH や RUNPATH
- 環境変数 LD_LIBRARY_PATH で指定されたディレクトリ
- /etc/ld.so.cache に保存されているキャッシュ情報(ldconfigで更新)
- デフォルトのシステムディレクトリ(/lib や /usr/lib など)
もしライブラリをインストールしたのに認識されない場合は、sudo ldconfigを実行してキャッシュを更新することを忘れないでください。この一連の流れを理解しておくことで、Linux上のソフトウェア管理が劇的にスムーズになります。
生徒
「先生、ありがとうございました!lddコマンドを使ってみたら、足りなかったライブラリの名前がバッチリ表示されました。not foundって出てくるので、何が原因か一目瞭然ですね。」
先生
「それは良かったです。エラーメッセージだけで悩むよりも、まずはlddで中身を覗いてみるのが解決への近道ですよ。矢印の先のパスが正しいかどうかもチェックしましたか?」
生徒
「はい!実は全然違う古いバージョンのディレクトリを見に行っていたみたいです。環境変数のLD_LIBRARY_PATHを設定し直したら、ちゃんと正しいパスを指すようになりました。」
先生
「素晴らしいですね。環境変数は一時的な確認に便利ですが、恒久的に直したい場合は/etc/ld.so.conf.d/に設定ファイルを追加して、ldconfigを叩くという手順も覚えておくといいでしょう。」
生徒
「なるほど、キャッシュの更新ですね。あ、あと注意点にあったセキュリティのことも気をつけます。知らないサイトから落としてきた怪しいファイルにいきなりlddするのは控えるようにします。」
先生
「その通りです。安全が確認できないバイナリには、readelf -dを使って静的に依存関係を調べるという上級テクニックもあります。基本はlddで十分ですが、常に慎重に作業することが、優れたLinux管理者の条件ですよ。」
生徒
「勉強になります!これで依存関係のエラーが出ても怖くありません。どんどんコマンドを使いこなせるようになりたいです!」