1

私は、実行時に ACE_DLL::open を使用して動的ライブラリをロードする巨大なプロジェクトに取り組んでいます。

ライブラリが見つかり、開こうとしましたが、未解決のシンボルが原因で mmap (以下は strace ) で失敗しました。未解決のシンボルが原因であることは確かであり、 nm を実行することで、すべての未解決のシンボルのリストを取得できました。問題は、コンパイル時に未解決のシンボルが大量にあり、実行時に解決する必要があることです。そのため、すべてのシンボルを 1 つずつ確認する必要があるため、nm はあまり役に立ちません。

.so が読み込まれる原因を正確に把握するスマートな方法はありますか

open("libxxxxxxx_d.so", O_RDONLY) = 29
read(29, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300w\3\0004\0\0\0"..., 512) = 512
fstat64(29, {st_mode=S_IFREG|0755, st_size=10130306, ...}) = 0
mmap2(NULL, 373832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 29, 0) = 0xffffffffed5f5000
mmap2(0xed64e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 29, 0x59)  =   0xffffffffed64e000
close(29)                               = 0
munmap(0xed5f5000, 373832)              = 0
munmap(0xed5cc000, 167764)              = 0
4

3 に答える 3

2

環境変数として設定ACE_DEBUG=1すると、ACE ログは、未解決のシンボルを示すデバッグ メッセージを出力する必要があります。これは 1 つのシンボルにすぎないため、すべてを見つけるにはおそらく数回の反復が必要です。

于 2013-06-15T09:37:08.280 に答える
0

このコマンドは、共有ライブラリに不足している関数とオブジェクトを報告します。

ldd -r your_library.so

詳細については、を参照man lddしてください。

于 2013-06-17T07:52:50.693 に答える
0

フラグメントは、straceいかなる種類の障害も示しません。共有ライブラリのオープンは成功したようです。

私はあなたが言及したことに慣れていませんが、ここACE_DLL::openでいくつかの情報を見つけました。それは単なる薄いラッパーと友達のようです.dlopen()

現在、未解決のシンボルdlopen()が原因でライブラリが開かない可能性がありますが、使用されている場合のみですRTLD_NOW。問題は、エラー メッセージに問題のあるシンボルが 1 つしか記載されていないことです。

ライブラリが必要とするシンボルのリストをトラバースしたくない場合、nmおそらくobjdump -T最も簡単な方法は、問題のライブラリに対してアプリケーションをリンクし、リンカーがエラーとして報告するものを確認することです。1 つだけではなく、すべての問題を一覧表示する必要があります。最初に、ライブラリから有効なシンボルを参照するプレースホルダー コードをアプリケーションに追加し (ライブラリがリンカーによって強制的に取り込まれるようにするため)、次に-lxxxxxxx_dリンク オプションに追加します。

于 2013-06-14T14:18:38.340 に答える