web-dev-qa-db-ja.com

DSOによって参照されている非表示のシンボルについて、警告は正確に何を意味しますか?

共有ライブラリをg ++とリンクする際に問題があります。次のような警告が表示されます。

hidden symbol XXX in YYY is referenced by DSO /usr/lib/...

特定の問題に関するいくつかの関連する質問を読みましたが、全体としてそれを理解したいと思います-この警告の意味と原因は何ですか:

  1. DSOとは何ですか?
  2. 隠されたシンボルとは何ですか?
  3. 非表示の場合、どのように参照できますか?
32
abyss.7

DSOとは?

[〜#〜] dso [〜#〜]Dynamic Shared Object、またはそれより正式ではない shared library

隠しシンボルとは何ですか?

非表示シンボルは、非表示リンケージでコンパイルされたシンボル(つまり、関数またはデータオブジェクトの名前)です。 (GCC固有の)宣言に従って:

int x __attribute__ ((visibility ("hidden")));

xが1つのDSOで定義されている場合、動的リンケージは別のDSOからそれを参照できません。リンカはxstaticではありません)を参照できますが、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を隠さないようにする必要があります。そうでなければ、私は困惑しています。

32
Mike Kinghan