3

g++ -O0 で cpp プログラムをコンパイルすると、バイナリに空の文字列 (basic_string) のシンボルが含まれていないことに気付きました: _S_empty_rep_storage この同じプログラムを -O2 でコンパイルすると、前述のシンボルが実際にバイナリ内に含まれていることに気付きました。次のように (ビンで nm を使用):

00000000006029a0 V _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

私のアプリケーションはいくつかの .so (動的ライブラリ) を使用しており、アプリケーションがロードされると、これらの .so ファイルのいくつかが次のようにバインドされていることに気付きました (私は LD_DEBUG=all を設定してプログラムを実行しました):

 28596: binding file /home/bbazso/usr/local/lib/mydynamiclib.so [0] to /usr/lib64/libstdc++.so.6 [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4]
 28596: binding file /home/bbazso/usr/local/lib/mydynamiclib.so [0] to /home/bbazso/workspace/mytestapplication [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4]
 28596: binding file /home/bbazso/workspace/mytestapplication [0] to /usr/lib64/libstdc++.so.6 [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4]**

しかし、私の .so の 1 つが次のようにのみバインドされていることにも気付きました。

  28087:    binding file /home/bbazso/usr/local/lib/anotherdynamiclib.so [0] to /usr/lib64/libstdc++.so.6 [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4]

ただし、上記の mydynamiclib.so のようにバイナリ (mytestapplication) にバインドすることはありません。

それで、これが実際に何を意味するのか疑問に思いましたか?これは、anotherdynamiclib.so が上記の空の文字列に対して、アプリケーションの残りの部分とは異なるシンボルを使用することを意味しますか? 私が本当に求めているのは、上記の例のコンテキストでシンボルバインディングがどのように機能するかということだと思います.

ありがとう!

4

2 に答える 2

1

申し訳ありませんが、あなたの質問を完全には理解していませんが、How to write shared librariesという Ulrich Drepper の論文で答えが見つかるかもしれません。Linux での elf 実行可能ファイルのシンボルについては、私が知っている最高のものです。

于 2010-02-28T18:19:41.770 に答える
0

あなたの質問を解析するのが難しいです。コンパイルしているサンプル コードの小さなスニペットを含めると、役立つ場合があります。

前述のシンボルが実際に次のようにバイナリ内に含まれていることに気付きました。「含まれている」とはどういう意味かによって異なります。シンボル テーブルにそのシンボルのエントリがありますが、これは外部シンボルであり、アプリケーションが「エクスポート」しているシンボルではありません。名前の @@GLIBCXX_3.4 に注意してください。シンボルの実際の場所は GLIBCXX にあります (実際には libstdc++ に解決されるように見えます)。

出力から、nm は実際には ST_BIND 情報 (El32_Sym/Elf64_Sym 構造の st_info フィールドの一部) を表示していないようです。これは、リンカーがシンボルのバインディングをどのように扱うかを決定する情報です。readelf -s YOURBINNAME を実行できますか バインディングが表示されます。

于 2010-12-26T18:19:19.137 に答える