-1

共有ライブラリ (.so) 内に存在するはずの関数のアドレスをマップしようとしています。私は正常にライブラリを開くことができ、その中の関数のアドレスを取得しようとしています:

fn_read = dlsym (handle, "functionName");

ただし、エラーが発生しています。検査すると、シンボルが見つからないというエラーが表示されます。私はこの呼び出しを正しく行っていると確信しています。また、マップしようとしている関数が共有ライブラリ自体に含まれていることも 100% 確信しています。ここで何をすべきかわかりません...誰かが私が見落としている可能性のあるいくつかの間違い/ポイントを指摘してもらえますか?

ありがとう、ファル

4

2 に答える 2

1

シンボルが本当にそこにある場合、唯一の合理的な原因は、functionName宣言されていない C++ 関数extern "C"です。コンポーネントを追加するかextern "C"、マングルされた名前を特定して代わりに見つけることができます。

于 2012-09-13T19:20:24.940 に答える
1

unix/linux コマンドを使用してみてくださいnm -g <library>.so。すべてのCスタイル シンボルが一覧表示されます。

C++ は「名前マングリング」に参加することに注意してください。そのため、「C スタイル」シンボルをエクスポートしていない場合、名前がマングルされ、直接到達できない可能性があります。 nm -gC <library>.soマングルされた C++ 名も表示されます。

C++ シンボルにアクセスしようとしていて、名前マングリングが問題の原因である場合は、C と C++ の混合に関する C++ FAQ ライトのガイドラインに従うと役立つ場合があります。

于 2012-09-13T19:22:00.160 に答える