共有ライブラリをg ++とリンクする際に問題があります。次のような警告が表示されます。
hidden symbol XXX in YYY is referenced by DSO /usr/lib/...
特定の問題に関するいくつかの関連する質問を読みましたが、全体としてそれを理解したいと思います-この警告の意味と原因は何ですか:
DSOとは?
[〜#〜] dso [〜#〜]はDynamic Shared Object、またはそれより正式ではない shared library 。
隠しシンボルとは何ですか?
非表示シンボルは、非表示リンケージでコンパイルされたシンボル(つまり、関数またはデータオブジェクトの名前)です。 (GCC固有の)宣言に従って:
int x __attribute__ ((visibility ("hidden")));
x
が1つのDSOで定義されている場合、動的リンケージは別のDSOからそれを参照できません。リンカはx
(static
ではありません)を参照できますが、dynamicリンケージには使用できません。ドキュメント ここ
隠されている場合、どのように参照できますか?
それはありえない、それはあなたが警告されているものです。例えば。リンク時の警告:
/usr/lib/libc_nonshared.a(stat.oS)の隠しシンボル `stat 'はDSOによって参照されます
リンケージ内のDSOはシンボルstat
を参照し、リンカーは/usr/lib/libc_nonshared.a
内のstat
の定義を見つけることができますが、(明らかに)その定義はそれを参照し、そのDSOから参照できないDSOは、非表示になっているためです。
問題DSOがDSOとして使用するために正しく構築されていない場合、この問題が発生します。 この例 を参照し、解決策のフォローアップに従ってください。
OPのフォローアップに続く
非表示のシンボルが既にいくつかのDSOによって参照されている場合、なぜDSOに問題があるのですか?
リンカは言っています:
DSO X
には、シンボルS
への参照が含まれています。シンボルS
の定義は別のリンクされたモジュールY
ですが、その定義はX
の参照を満たすために利用できませんdynamically (つまり実行時)S
にはY
に隠されたリンケージがあるためです。
問題が非共有オブジェクトに伴うことを確認できます[...] [しかし]私は非共有オブジェクトでこれらのシンボルを明示的に隠しません。
非共有オブジェクトに隠されているシンボルを明示的にマークしていない場合があります。ビルド方法によっては、明示的にotherwiseとマークされていない限り、デフォルトでシンボルが非表示になる場合があります。
非共有オブジェクトはlibnonshared.a
であり、隠されているとされるシンボルはfoo
であるとします。実行:
objdump -t libnonshared.a
libnonshared.a
のシンボルに関する情報を取得します。出力で、foo
のエントリを探します。タグ.hidden
が含まれていますか? -例.
0000000000000000 g F .text 000000000000000b .hidden foo
このエントリは、foo
がグローバルシンボルであることを示しています(g
とマークされているため、リンカーはそれを見ることができます)butdynamicリンケージ。
これが当てはまる場合は、libnonshared.a
のビルドを修正して、foo
を隠さないようにする必要があります。そうでなければ、私は困惑しています。