UNIX/Linuxの部屋 lddコマンドの使い方


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド ldd ダイナミックリンクの関係を表示

プログラムを作成する場合、既に用意してあるライブラリを利用することが多い。例えばほとんどのプログラムでは printf(3) を使うが、だからといってほとんどのバイナリに printf(3) のコードを埋め込むのはディスクスペースの無駄である。そこでコンパイル時にライブラリをリンクするのではなく、実行時に動的にリンクを行う仕組みがある。ldd はコマンドがどのランタイムライブラリを参照しているか表示する。
% ldd /usr/X11R6/bin/kterm
/usr/X11R6/bin/kterm:
-lXt.6 => /usr/X11R6/lib/libXt.so.6.0 (0x806f000)
-lX11.6 => /usr/X11R6/lib/libX11.so.6.1 (0x80bd000)
-lXmu.6 => /usr/X11R6/lib/libXmu.so.6.0 (0x805f000)
-lSM.6 => /usr/X11R6/lib/libSM.so.6.0 (0x8153000)
-lICE.6 => /usr/X11R6/lib/libICE.so.6.0 (0x815b000)
-lgnumalloc.2 => /usr/lib/libgnumalloc.so.2.0 (0x816d000)
-ltermcap.2 => /usr/lib/libtermcap.so.2.1 (0x8171000)
-lc.2 => /usr/lib/libc.so.2.2 (0x8175000)

ダイナミックリンクは、バイナリのサイズが少なくなることとひきかえに、そのバイナリ単独での実行が不可能になるという欠点がある。

この例では kterm は8つのランタイムライブラリを実行時に必要とし、1つでも欠けると実行することはできない。もし OS の起動時に何か不具合があってシングルユーザモードで起動したとき、/bin/ls や /bin/mount が/usr/lib/libc.* を必要としたとしたら、/usr がマウントされていないと復旧作業はできなくなってしまう。そのため、/bin、/sbin などのコマンドはランタイムライブラリを必要としないように作られている。

kterm のようなリンク方式を、ダイナミックリンク・動的リンクと言い、ls のようなリンク方式をスタティックリンク・静的リンクという。静的にリンクされたバイナリを ldd で見ると
% ldd /bin/ls
ldd: /bin/ls: not a dynamic executable
となる。
>> FreeBSDオンラインマニュアル(man) FreeBSD ldd(1)
>> Linuxオンラインマニュアル(man) Linux ldd(1)
>> Solaris10オンラインマニュアル(man) Solaris10 ldd(1)


頑張って書いたおすすめコンテンツ!
クラウドサービス徹底比較・徹底解説