1

infinibandrdmacmライブラリrdmacm.soを使用するプログラムがあります

1台のコンピューター(Ubuntuサーバー)で問題なく実行できます。私の開発用PC(Ubuntuデスクトップ版)では、次のようになります。

./test-client rdmacm.so:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません

ここで私は困惑します。

lddrdma-クライアント

linux-vdso.so.1 =>  (0x00007fffdb62b000)
libibverbs.so.1 => /usr/lib/libibverbs.so.1 (0x00007f97ca007000)
librdmacm.so.1 => /usr/lib/librdmacm.so.1 (0x00007f97c9dfe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f97c9a3e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f97c9821000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f97c961d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f97ca237000)

猫/etc/ld.so.conf

include /etc/ld.so.conf.d/*.conf

cat /etc/ld.so.conf.d/*.conf

# Multiarch support
/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu
/lib/i686-linux-gnu
/usr/lib/i686-linux-gnu
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/fglrx
/usr/lib32/fglrx
# Legacy biarch compatibility support
/lib32
/usr/lib32

ls -l / usr / lib / librdmacm *

-rw-r--r-- 1 root root 41146 Jul 19  2011 /usr/lib/librdmacm.a
lrwxrwxrwx 1 root root    18 Jul 19  2011 /usr/lib/librdmacm.so -> librdmacm.so.1.0.0
lrwxrwxrwx 1 root root    18 Jul 19  2011 /usr/lib/librdmacm.so.1 -> librdmacm.so.1.0.0
-rw-r--r-- 1 root root 35248 Jul 19  2011 /usr/lib/librdmacm.so.1.0.0

すべてが正しく見えます。test-clientを実行できないのはなぜですか。


編集

私が使用しているコードは、geekinthecornerブログからのものです。Infinibandテストアプリ。

クライアントでは、いくつかのdlopen呼び出しがあります。

すなわち

void *handle = dlopen("rdmacm.so", RTLD_LAZY);
...  
handle = dlopen("ibverbs.so", RTLD_LAZY);

これはubuntuサーバーで動作します。ただし、私の開発用デスクトップマシンでは、ライブラリが見つかりません。

ライブラリの名前をこのように変更すると

void *handle = dlopen("librdmacm.so", RTLD_LAZY);
...  
handle = dlopen("libibverbs.so", RTLD_LAZY);

それらが見つかりました。dlopenは自動的に「lib」を付加しませんか?ライブラリはこれなしで見つかるので、私はそうだと思います。それは私のサーバーに当てはまるはずです。

いずれにせよ、これらのdlopen呼び出しが必要かどうかはわかりません。それらを完全に削除することができ、プログラムは動作します。しかし、パスと/etc/ld.so.confセットアップに同じ検索パスが含まれている場合、2台のマシンでdlopenのパフォーマンスが異なる理由について知りたいと思います。

4

1 に答える 1

1

void *dlopen(const char *filename, int flag);

dlopen()nullで終了する文字列で指定されたダイナミックライブラリファイルをロードし、ダイナミックライブラリのfilename不透明な「ハンドル」を返します。ライブラリが他の共有ライブラリに依存している場合、これらもダイナミックリンカによって再帰的に自動的にロードされます。したがって、どのような場合でも、標準は文字列dlopen()の先頭に追加したり、文字列を変更したりすることはありませんfilename

指定されたファイル名は、次の方法で検索されます。

  • (ELFのみ)呼び出し側プログラムの実行可能ファイルにタグが含まれていて、タグDT_RPATHが含まれていない場合、DT_RUNPATHタグにリストされているディレクトリーDT_RPATHが検索されます。

  • プログラムの開始時に、環境変数LD_LIBRARY_PATHがコロンで区切られたディレクトリーのリストを含むように定義されていた場合、これらが検索されます。(セキュリティ対策として、この変数はset-user-IDおよびset-group-IDプログラムでは無視されます。)

  • (ELFのみ)呼び出し側プログラムの実行可能ファイルにタグが含まれている場合、DT_RUNPATHそのタグにリストされているディレクトリーが検索されます。

  • キャッシュファイル/etc/ld.so.cache(ldconfig(8)によって維持される)は、ファイル名のエントリが含まれているかどうかを確認するためにチェックされます。

  • ディレクトリ/lib/usr/libが(この順序で)検索されます。

librdmacm.soしたがって、dlopen()で気付くこの奇妙な動作は、ライブラリへの既存のシンボリックリンク/ハードリンク、および上記のライブラリ検索パスのいずれかでのlibibverbs.soasrdmacm.soおよびに起因する可能性があります。ibverbs.so

何らかのdlopen()理由で失敗した場合は、NULLを返します。によって返されるハンドルを使用する前に、NULLを確認してくださいdlopen

handle = dlopen("libxyz.so", RTLD_LAZY);
if (!handle)
{
     fprintf(stderr, "%s\n", dlerror());
     exit(EXIT_FAILURE);
}

参照:man 3 dlopen

于 2012-12-14T11:44:40.887 に答える