最近覚えたコマンド ldd - 共有ライブラリへの依存関係を表示する

chroot sshのときに出てきたので勉強した。んでもってlinuxの共有ライブラリのことも少し学習した。lsとかcdとかのバイナリのコマンドは、それ単体だけで実行できるものだと思ってました。でもそれは大間違いで、色んな共有ライブラリに依存してるようです。

hoge@hoge % ldd /bin/ls
linux-gate.so.1 =>  (0xffffe000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7edf000)
libacl.so.1 => /lib/libacl.so.1 (0xb7ed6000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb7ec3000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d94000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7d82000)
/lib/ld-linux.so.2 (0xb7efb000)
libattr.so.1 => /lib/libattr.so.1 (0xb7d7e000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7d7b000)
libsepol.so.1 => /lib/libsepol.so.1 (0xb7d42000)

こうするとlsが使ってるライブラリがずらずら出てくる。おー。なのでこの辺のファイル群がないとls出来ないわけですな。

↓詳しくはこの辺参照

UNIXの部屋 検索:ldd

ただ、このページには

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

となってるのが不思議です。unixlinuxの違いとかなんですかね。とりあえず気にしないでおこう。

linux-gate.so.1

それよりもちょっと嵌ってしまったのが、/bin/lsをlddしたときの1個目の"linux-gate.so.1"ってファイル。これだけが特殊。大抵のライブラリはシンボリックリンクで別のファイルを参照してる。下から4つ目のはフルパスでファイルそのものが表示されてる。じゃー1個目のは何やねんと。findしてもlocateしても出てこないし。すげー気になる。
と悩んでいたところを救ってくれたのが次のwebページ。

Stray Penguin - Linux Memo (jail-2)

一番上の linux-gate.so.1 は「実体」が無い、つまりカーネルにスタティックコンパイルされたライブラリなわけで、「そんなファイルどこ探しても無いじゃないか!」と悩む必要はない。

おーなるほど!これで解決だ。chroot-sshのmemoはまた後日。