2009年11月25日- Shuichi501 presents -
改めてdlopen(3)か
アプリケーションから呼び出しがあった場合、
アプリケーションでは、
関数呼び出し dlopen(3) と dlclose(3) を使用して
共有オブジェクトやプレーンな実行可能ファイルの読み込みや
読み込みの取り消しを行うようだ。
プログラムの開始時に環境変数 LD_LIBRARY_PATH に
コロン区切りのディレクトリのリストが定義されていれば、
この環境変数に定義されたディレクトリが検索される
そもそも、
linux ではダイナミックリンクの方法に
「暗黙的なリンク」と「明示的なリンク」があるわけだが、
apache では module をロードするために
「明示的」なリンクであるところの
dlopen(3) を行っているようだ。
dlopen(3)で指定しているRTLD_LAZYというのは、
ロード時にシンボルの値の解決をさぼる(lazy)の意味である。
RTLD_LAZYの代わりにRTLD_NOWをしているすると、
ロード時にシンボルの値を解決する。
もし解決に失敗すると、dlopen(3)自体が失敗となる。
RTLD_LAZYの場合は、解決できないシンボルがあっても、
dlsym(3)で調べるまでは解決しないので、
dlopen(3)はエラーにはならない。
アプリケーションでは、
関数呼び出し dlopen(3) と dlclose(3) を使用して
共有オブジェクトやプレーンな実行可能ファイルの読み込みや
読み込みの取り消しを行うようだ。
プログラムの開始時に環境変数 LD_LIBRARY_PATH に
コロン区切りのディレクトリのリストが定義されていれば、
この環境変数に定義されたディレクトリが検索される
そもそも、
linux ではダイナミックリンクの方法に
「暗黙的なリンク」と「明示的なリンク」があるわけだが、
apache では module をロードするために
「明示的」なリンクであるところの
dlopen(3) を行っているようだ。
dlopen(3)で指定しているRTLD_LAZYというのは、
ロード時にシンボルの値の解決をさぼる(lazy)の意味である。
RTLD_LAZYの代わりにRTLD_NOWをしているすると、
ロード時にシンボルの値を解決する。
もし解決に失敗すると、dlopen(3)自体が失敗となる。
RTLD_LAZYの場合は、解決できないシンボルがあっても、
dlsym(3)で調べるまでは解決しないので、
dlopen(3)はエラーにはならない。

