2004年06月25日
動的リンカ・ローダの事で、プログラムに必要な共有ライブラリを検索してロードする。
ld.soはa.out(Assembler OUT)バイナリが対象
ld-linux.soはELFバイナリが対象
共有ライブラリはlib*.a lib*.soとして記述される。
/lib/libc.so.6をみてみよう。
ld.soはあくまでもリンカ・ローダなので、これはコマンドとしては使われない。ldd, ldconfigにより使われる。
x86 Solaris9では、ld.so.1が実行時のリンカ(runtime linker for dynamic objects)となる。実行ファイルは/usr/lib/ld.so.1となるので、Linuxとは異なり環境変数PATHに/usr/libを通さなければならない。Linuxでは/etc/ld/ld.configが設定ファイルになるが、Solaris9では/var/ld/ld.configが設定ファイルになる。
bash-2.05# export | grep LD declare -x LD_CONFIG="/var/ld/ld.config" declare -x LD_LIBRARY_PATH="" declare -x OLDPWD="/" bash-2.05# cat /var/ld/ld.config
/usr/local/lib
上記のように環境変数LD_CONFIGに指定すればよいのかと思ったがpython実行時にエラーが出た。
bash-2.05# python ld.so.1: python: fatal: libstdc++.so.6: open failed: No such file or directory Killed
man ld.so.1を実行してみると、crleコマンドのマニュアルを参照とかかれているので確認してみるとcrleとは
Configure Runtime Linking Environment
であることが分かった。つまり手作業で/var/ld/ld.configを記述するのではなくcrleコマンドを使うようだ。
bash-2.05# crle
crle: /var/ld/ld.config: corrupt file, possible truncation
crleコマンドのマニュアル(man)を見ると
The system default search path for ELF objects is /usr/lib for 32-bit objects, and /usr/lib/64 for 64-bit objects. The system default search path for AOUT objects is /usr/4lib, /usr/lib and /usr/local/lib.
となっている。つまりSolaris9では.soのデフォルト検索パスに/usr/local/libは指定されていないためこれを/var/ld/ld.configに設定しなければならない。
# rm -f /var/ld/ld.confg
bash-2.05# crle Default configuration file (/var/ld/ld.config) not found Default Library Path (ELF): /lib:/usr/lib (system default) Trusted Directories (ELF): /lib/secure:/usr/lib/secure (system default) bash-2.05# crle -l /usr/lib:/local/lib bash-2.05# crle Configuration file [3]: /var/ld/ld.config Default Library Path (ELF): /usr/lib:/local/lib Trusted Directories (ELF): /lib/secure:/usr/lib/secure (system default) Command line: crle -c /var/ld/ld.config -l /usr/lib:/local/lib bash-2.05# crle -u -l /usr/local/lib bash-2.05# crle Configuration file [3]: /var/ld/ld.config Default Library Path (ELF): /usr/lib:/local/lib:/usr/local/lib Trusted Directories (ELF): /lib/secure:/usr/lib/secure (system default) Command line: crle -c /var/ld/ld.config -l /usr/lib:/local/lib:/usr/local/lib
さらにキャッシュの設定を行ってみる。
bash-2.05# crle -u -i /usr/local/lib bash-2.05# crle Configuration file [3]: /var/ld/ld.config Default Library Path (ELF): /usr/lib:/usr/local/lib Trusted Directories (ELF): /lib/secure:/usr/lib/secure (system default) Directory: /usr/local/lib libpanel.so.5 libgcc_s.so.1 libgcj.so libpanel.so.5.4 lib-org-w3c-dom.so libstdc++.so.6.0.0 libpanel.so lib-org-xml-sax.so.5 libg2c.so.0.0.0 libg2c.so.0 lib-org-xml-sax.so.5.0.0 libmenu.so.5.4 libncurses.so libform.so.5 lib-org-w3c-dom.so.5 libiconv_plug.so libstdc++.so.6 libgcc_s.so libcharset.so.1 libstdc++.so lib-org-xml-sax.so libcharset.so libmenu.so.5 libncurses.so.5 libg2c.so libltdl.so.3.1.0 libform.so libncurses.so.5.4 libcharset.so.1.0.0 libffi.so libltdl.so.3 libgcj.so.5.0.0 libiconv.so.2 libiconv.so.2.1.0 libmenu.so libform.so.5.4 libffi-2.00-beta.so lib-org-w3c-dom.so.5.0.0 libltdl.so libiconv.so libgcj.so.5 Command line: crle -c /var/ld/ld.config -l /usr/lib:/usr/local/lib -i /usr/local/lib
これで実行時のSharedLibraryのロードとその設定ファイルが分かってきた。
| OS | x86 Solaris9 | Linux(Redhat8) |
| link-editor | /usr/lib/ | /usr/bin/ld |
| runtime linker/loader | /usr/lib/ld.so.1 | /lib/ld-2.3.2.so(/lib/ld-linux.so.2) |
| configure | crle | ldconfig |
| config file | /var/ld/ld.config | /etc/ld.so.conf |
| cache file | /var/ld/ld.config | /etc/ld.so.cache |
| linker-editor manual | man ld | man ld |
| runtime linker/loader manual | man ld.so.1 | man ld.so |