次のページ 前のページ 目次へ

7. ダイナミックロード(Dynamic Loading)

この章は今のところまだ短いです。私が ELF HOWTO の内容を消化するに連れ、 だんだん拡張されていくでしょう。

7.1 概念

前の章全部を一気に読んだ人はもう聞き飽きたかもしれませんが、 Linux は 共有ライブラリを利用しています。「名前を検索して置き換える」という動作 が、リンク時から実行時に先送りされるようになったのです。

7.2 エラーメッセージ

リンクエラーが起こったら送ってください!解決はできないかもしれませんが、 ここにまとめたいと思います...

can't load library: /lib/libxxx.so, Incompatible version

(a.out のみ)これは xxx ライブラリの major バージョンがあっていないか らです。ただシンボリックリンクを違うバージョンのライブラリに張っただけ ではだめですよ(そんなことをして segfault くらいで済んだら幸運というも のです)。新しいバージョンを入手してください。 ELF の場合、同じような 状況では以下のようなメッセージとなります。

ftp: can't load library 'libreadline.so.2'

warning using incompatible library version xxx

(a.out のみ)このメッセージを吐いたプログラムをコンパイルした人よりも minor バージョンが古いライブラリを使っている場合に出ます。多分プログ ラムはちゃんと動くと思います。でもアップグレードした方が良いでしょうね。

7.3 ダイナミックローダの動作をコントロールする

ダイナミックローダが参照する環境変数は多岐に渡っています。これらのほと んどは ldd だけが使うものなので、 ldd に対応するスイッチをつ けて実行する方が便利かもしれません。

7.4 ダイナミックロードを用いたプログラムを書く

Solaris 2.x でのダイナミックロード機能と非常に似ています(といっても Solaris ユーザにしかわかりませんね)。具体的な内容は H. J. Lu の ELF programming document および dlopen(3) の man ページで詳述されてい ます。後者は ld.so のパッケージに入っています。以下にもちょっとした例 を示します。 -ldl をつけてリンクしてください。

#include <dlfcn.h>
#include <stdio.h>

main()
{
  void *libc;
  void (*printf_call)();

  if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))
  {
    printf_call=dlsym(libc,"printf");
    (*printf_call)("hello, world\n");
  }

}


次のページ 前のページ 目次へ