■ [ライブラリ][ToDo]ライブラリの依存関係について 05:20
unixのライブラリについてよくわかっていないので、勉強したことをまとめてみました。
- 動的ローダについて
- プログラムを実行したときにそのプログラムが必要とする動的ライブラリを探します。
- 動的リンカともいうらしい。
- FreeBSDにおいては/libexec/ld-elf.so.1が該当するようです。
- 動的ローダは、環境変数LD_LIBRARY_PATHに設定されているライブラリパスを最初に検索します。その後、/lib と /usr/lib から検索します。次に、後述のELFキャッシュに記載しているライブラリパスを検索するようです。そのELFキャッシュにライブラリパスを追加するには/etc/ld-elf.so.conf ファイルを編集すればよいみたいです。(編集してldconfigコマンド実行したらELFキャッシュに反映されるんだっけ。。?)
- このファイルはFreeBSDのバイナリを実行するのにとてもとても大事なファイルで、間違って消してしまったり移動してしまったりすると、ls、cp、mvなどのコマンドすら実行できなくなる。もし間違って移動してしまった場合は、/rescue/mvつかって元に戻すことができる。
コンパイラやリンカは出力するプログラムにライブラリへの絶対パスを埋めこむことはしません。その代りに、ライブラリ名と適切な動的ローダへの絶対パスを埋めこみます。そして、実行時に、(動的ローダが)適切なライブラリに結びつけるわけです。a.out のプログラム用には /lib/ld.so、 ELF のプログラム用には /lib/ld-linux.so.1 がそれぞれ動的ローダになっています。
http://www.linux.or.jp/JF/JFdocs/archive/ELF-HOWTO.html
- キャッシュについて
- ELF キャッシュは /var/run/ld-elf.so.hints
- a.out キャッシュは /var/run/ld.so.hints
- /etc/ld-elf.so.confをもとに、ldconfig(8)で更新される。
- ldconfig -m /hogeとすれば、/hogeがライブラリのパスに追加される。
- ldconfig -rで、ヒントファイルの中身が表示される。
- ライブラリのパスが、LD_LIBRARY_PATHで設定。(.profileなどで指定)
- ToDo: 実際にldconfigためしてみる。
- ELFELFとかa.outとかってのは実行形式のフォーマット。昔は、a.out使われていたけど、最近はELFが主流らしいとか。FreeBSDも3.?まではa.out形式で実行ファイルもってらすい。
- 最近は、/etc/ld-elf.so.confに記載するより、/etc/defaults/rc.conf内にあるidconfig_pathsに記述するのが流行り?らしい。
- ライブラリの種類について
- 動的ライブラリ
- 静的ライブラリ(拡張子a?)
- 共有ライブラリ(拡張子so?)
- ToDO:動的ライブラリと共有ライブラリの違いがよくわかってないので調べる。
- ライブラリのいろんな形式について
- libhoge.soのような形式の名前を、linker nameとよび
- libhoge.so.3のような形式の名前を、so nameとよび
- libhoge.so.3.0のような形式の名前を、real nameとよぶ。
・ふりび5系
# find / -name \*libcrypt.so\*
/usr/lib/libcrypt.so
/lib/libcrypt.so.2
# ls -asl /usr/lib/libcrypt.so
0 lrwxrwxrwx 1 root wheel 18 3 26 01:59 /usr/lib/libcrypt.so -> /lib/libcrypt.so.2
・ふりび6系
# find / -name \*libcrypt.so\*
/usr/lib/libcrypt.so
/usr/obj/usr/src/tmp/lib/libcrypt.so.3
/usr/obj/usr/src/tmp/usr/lib/libcrypt.so
/usr/obj/usr/src/lib/libcrypt/libcrypt.so
/usr/obj/usr/src/lib/libcrypt/libcrypt.so.3
/lib/libcrypt.so.2
/lib/libcrypt.so.3
# ls -asl /usr/lib/libcrypt.so
0 lrwxr-xr-x 1 root wheel 18 May 3 13:36 /usr/lib/libcrypt.so -> /lib/libcrypt.so.3