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

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド 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
となる。
>> Solaris10オンラインマニュアル(man) Solaris10 ldd(1)
>> FreeBSDオンラインマニュアル(man) FreeBSD ldd(1)
>> Linuxオンラインマニュアル(man) Linux ldd(1)