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

时间:2010-02-24 16:48:55

标签: c++ linux binding dynamic-linking

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

00000000006029a0 V _ZNSs4_Rep20_S_empty_rep_storageE @@ GLIBCXX_3.4

我的应用程序使用了几个.so(动态库),当我的aplication加载时,我注意到其中几个.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]

但永远不会绑定到二进制(mytestapplication),如上面显示的mydynamiclib.so。

所以我想知道这究竟意味着什么?这是否意味着anotherdynamiclib.so将使用与上面的空字符串不同的符号而不是应用程序的其余部分?我想我真正想问的是符号绑定在上面的例子中是如何工作的?

谢谢!

2 个答案:

答案 0 :(得分:1)

我担心我不完全理解你的问题,但你可能会在名为How to write shared libraries的Ulrich Drepper论文中找到答案。关于如何在Linux中使用elf可执行文件的符号,这是我所知道的最好的。

答案 1 :(得分:0)

我无法解析您的问题。如果您包含一小段您正在编译的示例代码,它可能有所帮助。

  
    

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

  

从输出中,nm似乎并未实际显示ST_BIND信息(El32_Sym / Elf64_Sym结构中st_info字段的一部分)。这是确定链接器如何处理符号绑定的信息。你能跑吗 readelf -s YOURBINNAME 它将显示绑定。