共有ライブラリが不良です(未定義のシンボル)。
初めてdlopen()を呼び出すと、dlerror()から正しいエラーメッセージが表示されたNULLの結果が得られます。
エラーメッセージを無視し、同じ引数を使用してdlopen()を呼び出すと、2回目にnull以外のハンドルが取得されます(これは、ライブラリが正常にロードされたことを示します)。これは明らかに間違っています。
この問題はUbuntu11.04で発生します(IIRC、10.10にはこの問題はありませんでした)。Centos5.5ではこの問題は発生しません。
特に、この問題はTclインタープリター内で発生します。最初に正規化された絶対パスを使用して共有ライブラリをロードしようとします。それが失敗した場合は、ユーザーが指定した正確なパス文字列を使用して文字通り再び失敗します。私の場合、両方とも失敗するはずですが、Ubuntu11.04では2番目の呼び出しが正しく成功していません。
奇妙なことに、この問題を再現できるのは、正確な本番共有ライブラリを使用した場合のみです。縮小された共有ライブラリを作成すると、正しく機能しています。
このようなプログラムは、私の本番ライブラリの問題を示すのに十分です。
#include <stdio.h>
#include <dlfcn.h>
int main()
{
void* h;
h = dlopen("./prod.so", RTLD_NOW | RTLD_LOCAL);
printf("h is %p\n", h);
printf("err is %s\n", dlerror());
h = dlopen("./prod.so", RTLD_NOW | RTLD_LOCAL);
printf("h is %p\n", h);
}