ldd - 共有ライブラリの依存関係を確認

スポンサーリンク

lddコマンドはプログラム等が要求する共有オブジェクト(共有ライブラリ)を表示するコマンドになり、共有ライブラリの依存関係を確認できます。
プログラムがうまく動かない原因でよくあるものとして、共有ライブラリのパスがうまくいっていなかったり、必要な共有ライブラリのバージョンが異なったりといったような要因があります。
lddコマンドを用いることで何の共有ライブラリが足りていないかやどのような場所にある共有ライブラリがを使用しているかなどを確認でき、共有ライブラリの依存関係の問題の解決の手助けになります。

スポンサーリンク

共有ライブラリの依存関係を確認

lddコマンドは共有ライブラリの依存関係を確認できます。

また、必要な共有ライブラリが存在しない場合は、not foundのように表示されます。

ここで使用している/usr/local/bin/gnuplotはソースコードからビルドしたものを使用しています。パッケージからダウンロードしたものとはおそらく結果は異なります。

 

 

 

シンボルのバージョン情報を含む詳細な情報を表示

-vオプションはシンボルのバージョン情報などを含めた情報を表示します。
通常のlddコマンドで表示される加えて、Version information:のような行からが-vオプションで追加で表示されます。
また、(GLIBC_2.2.5)や(GCC_3.0)のような情報がシンボルのバージョン情報になります。

また、このようなシンボルのバージョン情報は、共有ライブラリに対してobjdumpコマンドを利用するとその定義を確認することができます。例えば、上の/usr/local/bin/gnuplotのバージョン情報の一番上の行に

があります。この共有ライブラリに対して、objdumpコマンドを実行すると

のように表示され、Version definision:の行の下にシンボルのバージョン情報がいくつか書かれており、共有ライブラリに定義されているシンボルのバージョン情報を確認できます。

 

 

 

オブジェクトの再配置を行う

-dオプションを用いるとオブジェクトの再配置を実行し、不足しているオブジェクトを報告します。特に問題がない場合は、オプションなしのlddコマンドと似たような表示になります。

ここで、省略されていますが、/usr/local/bin/gnuplotが依存しているライブラリのひとつ/usr/local/lib/libQt5Core.so.5の名前変更してgnuplotのプログラムからは見えなくした場合を紹介します。

libQt5Core.so.5を見えなくしてから、-dオプションを用いて、オブジェクトの再配置を行うとundefined symbol:のような行が表示されました。

このシンボルについて、報告されているlibQt5Gui.so.5でobjdump -Tを用いると

のような表示がされました。*UND*は未定義であり、ここでは定義されていません。

同様にプログラムから見えなくしたlibQt5Core.so.5(libQt5Core.so.5.bakで名前を変更)をobjdump -Tを用いると

のように表示されます。ここで、上のobjdump -Tの結果のどちらにも"DO"のような文字が真ん中あたりにあります。これは、一文字ずつに意味があり、Dがダイナミックを意味し、Oがオブジェクトを意味しています。

また、このDやOの文字の意味は下のobjdumpの-Tオプションではなく、-tオプションでまとめています。

objdump - オブジェクトファイルの情報を表示する
objdumpコマンドはオブジェクトファイルの内容を表示できるコマンドになります。objdumpコマンドは実行ファイルやオブジェクトファイルを調査するのに便利なコマンドです。 objdumpコマンドでアーカイブファイルを指定するとそのアーカ...

 

 

 

オブジェクトと関数の再配置を行う

-rオプションを用いるとオブジェクトと関数の両方の再配置を実行し、不足しているオブジェクトまたは関数を報告します。特に問題がない場合は、オプションなしのlddコマンドと似たような表示になります。

-dオプションの時と同様に、/usr/local/lib/libQt5Core.so.5の名前変更してgnuplotのプログラムからは見えなくした場合を紹介します。

ここで。最終行にある_ZN7QString16fromAscii_helperEPKciというシンボルについて、objdump -Tを用いて、その内容を確認してみます。
まず、gnuplotに対して、objdump -Tを用いると

のような表示になります。
-dオプションの時と同様に、プログラムから見えなくしたlibQt5Core.so.5(libQt5Core.so.5.bakで名前を変更)に対してobjdump -Tを用いると

のように表示されます。ここで、上のobjdump -Tの結果のどちらにも"DF"のような文字があります。これは、Dがダイナミックを意味し、Fが関数(function)を意味しています。-rオプションでは、-dオプションと違って、関数のシンボルについても報告が表示されます。

また、このDやFの文字の意味は下のobjdumpの-Tオプションではなく、-tオプションでまとめています。

objdump - オブジェクトファイルの情報を表示する
objdumpコマンドはオブジェクトファイルの内容を表示できるコマンドになります。objdumpコマンドは実行ファイルやオブジェクトファイルを調査するのに便利なコマンドです。 objdumpコマンドでアーカイブファイルを指定するとそのアーカ...

 

 

 

未使用の依存関係を確認

-uオプションは未使用の共有ライブラリの依存関係を確認できます。

また、補足として、上のプログラムについて、-rオプションと一緒に利用すると未使用の依存関係がなくなります。

 

 

 

lddコマンドのセキュリティ上の注意

lddコマンドはプログラムを直接実行して、依存関係を取得する場合があります。セキュリティのため、信頼できない実行プログラムに対して依存関係を取得する方法として、objdumpコマンドを代替として利用する方法があります。