3

使用 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 将为上面的空字符串使用与应用程序的其余部分不同的符号?我想我真正要问的是符号绑定在上面示例的上下文中是如何工作的?

谢谢!

4

2 回答 2

1

恐怕我不完全理解您的问题,但您可能会在 Ulrich Drepper 的一篇名为How to write shared libraries的论文中找到答案。这是我所知道的关于如何在 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 回答