使用 g++ -O0 编译 cpp 程序时,我注意到我的二进制文件不包含空字符串 (basic_string) 的符号:_S_empty_rep_storage 当我使用 -O2 编译同一程序时,我注意到上述符号确实包含在二进制文件中如下(在 bin 上使用 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 之一只绑定如下:
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 将为上面的空字符串使用与应用程序的其余部分不同的符号?我想我真正要问的是符号绑定在上面示例的上下文中是如何工作的?
谢谢!