0

IBM の VisualAge C/C++ コンパイラを使用して AIX アプリケーションに (dlopen を使用して) 動的にロードする共有ライブラリを構築しています。残念ながら、必要なシンボルを取り除いているようです:

rtld: 0712-002 致命的なエラー: 終了しています。
rtld: 0712-001 Symbol setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__ が参照されました
モジュール ./object/AIX-6.1-ppc/plugins/plugin.so() から、しかしランタイム定義から
のシンボルが見つかりませんでした。

共有ライブラリと、共有ライブラリをロードするアプリケーションの両方が、エラー メッセージに記載されている VersionReporter を含む静的ライブラリに対してコンパイル/リンクします。

共有ライブラリをリンクするには、次のオプションを使用しています: -bM:SRE -bnoentry -bexpall アプリケーションをリンクするには、次のオプションを使用しています: -brtl

このシンボルがアプリケーションで削除されないようにするために使用できるオプションはありますか? IBM ドキュメントに記載されているように -nogc を使用してみましたが、共有ライブラリが無効な形式になるか、アプリケーションがリンクに失敗します (どちらを使用するかによって異なります)。

4

2 に答える 2

1

はい。これは、実際には特定の言語やコンパイラとは関係ありません。たとえば、gcc にも同じ一般的な手法が使用されます。-bI:foo.exp は、foo.exp にリストされているシンボルが先頭の名前から来ることをリンカに伝えるために使用されます。同様に、-BE:dog.exp は、dog.exp にリストされているシンボルがエクスポートされ、他のユーザーが使用できることをリンカーに伝えるために使用されます。

/bin/ldd と /bin/dump を使用してこれらのシンボルを確認できることがわかります。

于 2010-05-15T15:50:34.827 に答える
0

私はこれを理解しました。秘訣は、プラグインで使用されているがバイナリで使用されていないシンボルが削除されないように、エクスポート リストを使用することです。

# version.exp:
setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__

そして、アプリケーションの使用をリンクするとき: -brtl -bexpfull -bE:version.exp

詳細については、「AIX での C および C++ アプリケーションの開発と移植」を参照してください。

于 2010-05-04T18:40:09.430 に答える