Linux
 Computer >> コンピューター >  >> システム >> Linux

Linuxのlddコマンドの使い方:共有ライブラリの依存関係を確認する方法

lddコマンドとは

lddコマンドを使うと、任意のプログラムが必要とする共有ライブラリを一覧表示できます。依存関係が欠けている場合のトラブルシューティングに特に役立ち、不足している関数やオブジェクトも確認できます。

lddコマンドの構文

エラーを避けるため、まず正しい構文を確認しておきましょう。

ldd [OPTION]... FILE...

上記コマンドの[OPTION]の部分に、以下のオプションを1つ以上組み合わせて指定できます。

  • --help:ヘルプを表示して終了する
  • --version:バージョン情報を表示して終了する
  • -d, --data-relocs:データの再配置を処理する
  • -r, --function-relocs:データと関数の再配置を処理する
  • -u, --unused:使用されていない直接依存関係を表示する
  • -v, --verbose:すべての情報を詳細に表示する

lddコマンドの基本的な使い方

プログラムの詳細情報を取得するには、次のコマンドを実行します。

ldd -v /path/to/program/executable

出力にはバージョン情報に加えて、共有ライブラリへのパスとメモリアドレスが表示されます。

libshared.so
linux-vdso.so.1 => (0x00007fff26ac8000)
libc.so.6 => /lib/libc.so.6 0x00007ff1df55a000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff1dfafe000)
Linuxのlddコマンドの使い方:共有ライブラリの依存関係を確認する方法

必要なSOファイルがまったく存在しない場合は、次のコマンドで不足しているライブラリを特定できます。

ldd -d path/to/program

出力は以下のようになります。「not found」と表示されている箇所が、見つからなかったライブラリです。

linux-vdso.so.1 (0x00007ffc2936b000)
/home/gary/demo/garylib.so => not foundlibc.so.6 => usr/lib/libc.so.6 (0x00007fd0c6259000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd0c65fd000)
Linuxのlddコマンドの使い方:共有ライブラリの依存関係を確認する方法

セキュリティに関する注意点

信頼できないプログラムに対してlddコマンドを実行するのは避けてください。lddは対象プログラムを実行する動作をする可能性があり、悪意のあるコードが起動される危険があるためです。代わりに、依存関係ツリー全体ではなく直接の依存関係のみを表示する、より安全な次のコマンドを使用しましょう。

objdump -p /path/to/program | grep NEEDED
Linuxのlddコマンドの使い方:共有ライブラリの依存関係を確認する方法

アプリケーションのパスを見つける方法

lddでアプリケーションの依存関係を調べるには、実行ファイルへのフルパスを指定する必要があります。パスの調べ方はいくつかあります。

例として、Firefoxのパスをfindコマンドで検索してみましょう。

find / -name firefox

ただし、findコマンドには欠点があります。実行ファイル本体だけでなく、Firefoxに関連するすべての場所が一覧表示されてしまう点です。

/etc/skel/.mozilla/firefox
/home//cache/mozilla/firefox
/home//.mozilla/firefox
/usr/bin/Firefox
/usr/lib/Firefox
/usr/lib/Firefox/Firefox

この方法はやや冗長であり、権限不足による「permission denied」エラーを避けるために、sudoコマンドで特権を昇格する必要が生じることもあります。

そこで便利なのがwhereisコマンドです。こちらの方がシンプルにアプリケーションのパスを特定できます。

whereis firefox

出力は次のようになります。

/usr/bin/firefox
/etc/firefox
/usr/lib/firefox
Linuxのlddコマンドの使い方:共有ライブラリの依存関係を確認する方法

続いて、Firefoxが必要とする共有ライブラリを調べるには、次のコマンドを入力します。

ldd /usr/bin/firefox

コマンドの出力は、たとえば以下のようになります。

linux-vdso.so.1 (0x00007ffff8364000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007feb9917a000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007feb98f76000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007feb98bf4000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007feb988f6000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007feb986e0000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007feb9833c000)
/lib64/ld-linux-x86-64.so.2 (0x00007feb99397000)

各行の左側(linux-vdso.so.1など)はライブラリ名、右側の16進数はそのライブラリがメモリ上のどのアドレスにロードされたかを示しています。

多くの行では、=>記号の後にパスが続きます。これは実際のバイナリファイルが配置されている物理的なパスであり、その後ろの16進数がロード先のアドレスです。

  1. Linuxの「echo」コマンドとは?基本構文から実用的な活用例まで徹底解説

    Linuxを始めたばかりの方でも、長年Linuxデスクトップを使い続けている方でも、一見すると意味が分かりにくいコマンドがいくつか存在します。特にコマンドラインに触れる機会が少なかった方にとってはなおさらでしょう。しかし、Linuxやその他Unix系OSの真の力は、まさにそのコマンドラインの中にこそ秘められています。 その代表格とも言えるのが、古くから親しまれてきたechoコマンドです。一見すると何の役に立つのか分かりませんが、仕組みを理解してみると、意外なほど便利なコマンドであることが分かります。 echoコマンドは何をするもの? echoのマニュアルページを見ても、詳細な説明はほとんどあ

  2. Linuxのteeコマンド使い方ガイド|画面表示とファイル保存を同時に実現

    Linuxシェルでパイプやリダイレクトを使っているなら、teeコマンドの出番もきっとあるはずです。teeは「標準出力に表示しながら、同時にファイルにも書き込む」ことができる便利なユーティリティです。この記事では、teeコマンドの基本操作から、sudoとの組み合わせ、追記モード、エラー出力の扱い方まで、実例を交えながら詳しく解説します。 teeコマンドとは何をするもの? まず、次のようなコマンドを見てみましょう。 ls このコマンドは、現在のディレクトリの内容を表示します。つまり、標準出力(stdout)へ出力するわけです。標準出力とは通常、画面、正確には仮想端末のディスプレイのことです