「ldd コマンドって何をするコマンドなの?」
Linuxサーバーを運用していると、こういったライブラリ関連のエラーは頻繁に遭遇します。
ライブラリの仕組みを理解しておかないと、エラーの原因すら特定できません。
この記事では、静的ライブラリと共有ライブラリの違い、ldd/ldconfig/LD_LIBRARY_PATH の使い方、
RHEL9 / Rocky Linux 9 対応の共有ライブラリ管理方法を実行例付きで解説します。
この記事のポイント
・ldd コマンドでプログラムが必要とする共有ライブラリの一覧を確認できる
・/etc/ld.so.conf にディレクトリを追加後、ldconfig を実行してキャッシュを更新する
・LD_LIBRARY_PATH 環境変数で一時的にライブラリ検索パスを追加できる
・RHEL9/Rocky9 では /etc/ld.so.conf.d/ 配下に .conf ファイルを置くのが推奨
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
ライブラリとは何か
ライブラリとは、よく使われる機能をまとめて他のプログラムから呼び出せるようにした「部品集」です。例えばファイルのI/O処理、文字列操作、ネットワーク通信など、
多くのプログラムが共通して使う機能はライブラリとして提供されています。
これにより、同じコードを各プログラムが重複して持つ必要がなくなり、
ディスクや実行効率を改善できます。
静的ライブラリと共有ライブラリの違い
ライブラリには2種類のリンク方式があります。1. 静的ライブラリ(スタティックリンク)
コンパイル時にライブラリのコードを実行ファイル内に直接埋め込む方式です。・ファイル名:libXXX.a(アーカイブ形式)
・メリット:ライブラリが別途インストールされていなくても動作する(依存がない)
・デメリット:複数のプログラムが同じライブラリを持つため、ファイルサイズが大きくなる
ライブラリを更新しても実行ファイルを再コンパイルしないと反映されない
2. 共有ライブラリ(ダイナミックリンク)
プログラムの実行時にライブラリを動的にロードする方式です。・ファイル名:libXXX.so.バージョン番号(例:libclamav.so.6、libc.so.6)
・格納場所:/lib、/usr/lib、/lib64、/usr/lib64(RHEL系)
・メリット:複数プログラムが同じライブラリを共有するため、ディスク節約・メモリ効率が良い
ライブラリだけ更新すれば全プログラムに反映される
・デメリット:必要なライブラリがインストールされていないとプログラムが起動しない
現代のLinuxシステムでは、ほとんどのプログラムが共有ライブラリ(ダイナミックリンク)を使っています。
ldd コマンドで共有ライブラリを確認する
実行ファイルが必要とする共有ライブラリは ldd コマンド で確認できます。1. 基本的な使い方
$ ldd /bin/cp linux-vdso.so.1 (0x00007fff5abc9000) libacl.so.1 => /lib64/libacl.so.1 (0x00007f8a12345000) libattr.so.1 => /lib64/libattr.so.1 (0x00007f8a12234000) libc.so.6 => /lib64/libc.so.6 (0x00007f8a11e00000) /lib64/ld-linux-x86-64.so.2 (0x00007f8a12567000)
・ライブラリ名 => パス:ライブラリ名とその実際のファイルパス
・(アドレス):メモリアドレス(実行時に決まる)
・not found:ライブラリが見つからない場合(この場合はエラーで実行不可)
2. 「not found」が表示される場合
$ ldd /path/to/myapp libmylib.so.1 => not found ← このライブラリがない libc.so.6 => /lib64/libc.so.6 (0x00007f...)
3. セキュリティ上の注意
ldd は信頼できないバイナリには使わないでください。ldd は内部的に LD_TRACE_LOADED_OBJECTS 環境変数を使ってプログラムを実行するため、
悪意のあるバイナリに対して使うと予期しない動作が起きる可能性があります。
共有ライブラリの検索パス(ld.soの仕組み)
プログラムの実行時、ld.so リンカ・ローダが共有ライブラリを次の優先順位で検索します。1. 環境変数 LD_LIBRARY_PATH(最優先)
2. プログラムの RPATH(コンパイル時に埋め込まれたパス)
3. /etc/ld.so.cache(ldconfig が生成するキャッシュ)
4. デフォルトパス(/lib、/usr/lib、/lib64、/usr/lib64)
/etc/ld.so.conf とldconfig の設定
1. /etc/ld.so.conf の構造(RHEL9/Rocky9)
RHEL9 / Rocky Linux 9 では /etc/ld.so.conf は次のようにインクルード形式になっています。$ cat /etc/ld.so.conf include ld.so.conf.d/*.conf
$ ls -l /etc/ld.so.conf.d/ -rw-r--r--. 1 root root 17 6月 7 2024 dyninst-x86_64.conf -rw-r--r--. 1 root root 63 7月 22 2024 kernel-5.14.0-427.13.1.el9_4.x86_64.conf -rw-r--r--. 1 root root 17 2月 29 2024 mariadb-x86_64.conf $ cat /etc/ld.so.conf.d/mariadb-x86_64.conf /usr/lib64/mysql
2. カスタムライブラリパスを追加する手順
自分でコンパイルしたライブラリを /usr/local/lib に置いた場合の例です。# Step1: 設定ファイルを作成 $ sudo vi /etc/ld.so.conf.d/myapp.conf # 次の1行を追加 /usr/local/lib # Step2: ldconfigでキャッシュを再構築 $ sudo ldconfig # Step3: 確認 $ ldconfig -v 2>/dev/null | grep myapp /usr/local/lib: libmyapp.so.1 -> libmyapp.so.1.0.0
3. ldconfig コマンドの使い方
# キャッシュを再構築(設定変更後は必ず実行) $ sudo ldconfig # 現在のキャッシュ内容を確認 $ ldconfig -p | head -10 1404 libs found in cache `/etc/ld.so.cache' libzstd.so.1 (libc6,x86-64) => /lib64/libzstd.so.1 libz.so.1 (libc6,x86-64) => /lib64/libz.so.1 libzio.so.1 (libc6,x86-64) => /usr/lib64/libzio.so.1 ... # 特定のライブラリを検索 $ ldconfig -p | grep libssl libssl.so.3 (libc6,x86-64) => /lib64/libssl.so.3 libssl.so.1.1 (libc6,x86-64) => /lib64/libssl.so.1.1
LD_LIBRARY_PATH で一時的にパスを追加する
環境変数 LD_LIBRARY_PATH を使うと、ldconfig の設定を変更せずに一時的にライブラリの検索パスを追加できます。テスト目的や、一般ユーザーが自分のライブラリを使いたい場合に便利です。
1. 一時的な設定(現在のセッションのみ)
$ export LD_LIBRARY_PATH=/home/pakira/mylib:$LD_LIBRARY_PATH $ echo $LD_LIBRARY_PATH /home/pakira/mylib: $ ldd /home/pakira/myapp libmylib.so.1 => /home/pakira/mylib/libmylib.so.1 (0x00007f...) # 見つかるようになった
2. 特定のコマンドにのみ適用
$ LD_LIBRARY_PATH=/home/pakira/mylib ./myapp # myapp の実行時だけ LD_LIBRARY_PATH が有効
3. 注意:本番運用での常用は推奨されない
LD_LIBRARY_PATH は便利ですが、本番サーバーでの常用は以下の理由で推奨されません。・システム全体のライブラリ優先順位を変えてしまい、意図しない動作につながる場合がある
・セキュリティリスク(悪意のあるライブラリを優先してロードさせる攻撃手法が存在する)
本番環境では /etc/ld.so.conf.d/ への設定追加 + ldconfig 再実行が正しい方法です。
実践:「error while loading shared libraries」の対処法
よくあるエラーとその対処法を整理します。1. エラーの確認
$ ./myapp ./myapp: error while loading shared libraries: libmylib.so.1: cannot open shared object file: No such file or directory
2. ldd でどのライブラリが足りないか特定
$ ldd ./myapp libmylib.so.1 => not found ← これが原因 libc.so.6 => /lib64/libc.so.6 (0x...)
3. ライブラリのインストールまたはパスの追加
# ① ライブラリパッケージをインストール(パッケージが存在する場合) $ sudo dnf install libmylib ← RHEL9/Rocky9の場合 # ② ライブラリが /usr/local/lib に置かれている場合はldconfigで追加 $ sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/mylib.conf $ sudo ldconfig # ③ 確認 $ ldconfig -p | grep libmylib libmylib.so.1 (libc6,x86-64) => /usr/local/lib/libmylib.so.1
本記事のまとめ
| コマンド・ファイル | 用途 |
|---|---|
| ldd /path/to/binary | バイナリが依存する共有ライブラリの一覧表示 |
| ldconfig -p | 現在のライブラリキャッシュを確認 |
| sudo ldconfig | /etc/ld.so.cache を再構築(設定変更後に必須) |
| /etc/ld.so.conf.d/XXX.conf | ライブラリ検索パスを追加する設定ファイル |
| export LD_LIBRARY_PATH=パス | 一時的にライブラリ検索パスを追加(テスト用) |
| /etc/ld.so.cache | ldconfig が生成するバイナリキャッシュ(直接編集不可) |
ライブラリの仕組みを理解していれば、エラーが出ても何が原因かすぐ特定できます。
「not found」が出たら ldd でどのライブラリが足りないかを確認し、
インストールまたはldconfigでパスを追加する、という手順を覚えておきましょう。
DNFコマンドによるパッケージ管理についてはyum/dnfでシステムアップデートする方法も参照してください。
環境変数LD_LIBRARY_PATHの設定方法については環境変数PATHの設定方法も合わせてご確認ください。
Linuxサーバーの仕組みを体系的に学びたい方へ
ライブラリのような低レベルの仕組みを理解することで、サーバートラブルへの対応力が格段に上がります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます