符号绑定如何在linux中的共享库中工作

当用g ++ -O0编译cpp程序时,我注意到我的二进制文件不包含空string(basic_string)的符号:_S_empty_rep_storage当我用-O2编译这个相同的程序时,我注意到前面提到的符号确实包含在二进制如下(在箱上使用nm):

00000000006029a0 V _ZNSs4_Rep20_S_empty_rep_storageE @@ GLIBCXX_3.4

我的应用程序使用几个.so(dynamic库),当我的应用程序加载时,我注意到这些.so文件中的几个绑定如下(我设置LD_DEBUG =所有和运行我的程序):

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] 

但从不绑定到二进制文件(mytestapplication),如上所示为mydynamiclib.so。

所以我想知道这实际上是什么意思? 这是否意味着anotherdynamiclib.so将对应用程序的其余部分使用不同的符号作为空string? 我想我真正要问的是,在上面的例子中,符号绑定是如何工作的?

谢谢!

恐怕我不能完全理解你的问题,但是你可能会在Ulrich Drepper的一篇名为“ 如何编写共享库”的论文中找到答案。 这是关于如何在Linux中使用elf可执行文件的最好的方法。

我有困难解析你的问题。 如果你包含了一小段代码,你正在编译它可能会有所帮助。

我注意到上述符号确实包含在二进制文件中,如下所示它取决于“包含在”中的意思。 符号表中有该符号的条目,但它是外部符号,而不是应用程序正在“导出”的符号。 请注意名称中的@@ GLIBCXX_3.4。 符号的实际位置是GLIBCXX(看起来像是实际上解析为libstdc ++)。

从你的输出中,nm看起来实际上并不显示ST_BIND信息(El32_Sym / Elf64_Sym结构中的st_info字段的一部分)。 这是确定链接器如何处理符号绑定的信息。 你可以运行readelf -s YOURBINNAME它会显示绑定。