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 が上記の空の文字列に対して、アプリケーションの残りの部分とは異なるシンボルを使用することを意味しますか? 私が本当に求めているのは、上記の例のコンテキストでシンボルバインディングがどのように機能するかということだと思います.
ありがとう!