<<戻る

2004年06月25日

ld.soとは? Dynamic Linker/Loaderを理解する

動的リンカ・ローダの事で、プログラムに必要な共有ライブラリを検索してロードする。

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