2009-01-07 42 views
4

我使用g ++版本4.2.3在同一个GNU/Linux服务器上编译了2个不同的二进制文件。什么使g ++包含GLIBCXX_3.4.9?

第一个使用:

GLIBC_2.0 
GLIBC_2.2 
GLIBC_2.1 
GLIBCXX_3.4 
GLIBC_2.1.3 

第二个用途:

GLIBC_2.0 
GLIBC_2.2 
GLIBC_2.1 
GLIBCXX_3.4.9 
GLIBCXX_3.4 
GLIBC_2.1.3 

为什么第二二进制使用GLIBCXX_3.4.9即仅在的libstdC++ so.6.0.9和可用。而不是 in libstdC++。so.6.0.8

g ++生成的新功能需要ABI中断并强制系统具有GLIBCXX _3.4.9?

有没有办法禁用这个新功能不需要GLIBCXX_3.4.9?

回答

8

要找出上市GLIBCXX_3.4.9符号(S)的二进制文件,实际上取决于,这样做:

readelf -s ./a.out | grep 'GLIBCXX_3\.4\.9' | c++filt 

一旦你知道找哪个符号,您可以追溯到对象这需要他们:

nm -A *.o | grep _ZN<whatever> 

最后,以配合这回源,你可以这样做:

objdump -dS foo.o 

并查看哪个代码引用了3.4.9符号。

0

那么第一个问题是你是如何生成上面的列表。
人们会认为编译器是确定性的,因此以相同的方式链接二进制文件。

我假设我被标记为不直接回答问题,但评论会很好。但我仍然认为你没有提供正确的信息,并且很高兴看到显示你的问题的命令输出。

假设你使用的LDD:
你会得到一个输出看起来像这样:

lib<X>.so.<ver> => /usr/lib/lib<X>.so.<verM> (<Addr>) 

但是,这并不是故事的结尾。
试图做对文件的LS它可能是一个符号链接

> ls /usr/lilb/lib<X>.so.<verM> 
lrwxrwxrwx 1 root root <Date> /usr/lib/lib<X>.so.<verM> -> lib<X>.so.<verM>.<verm>.<verp> 
+0

我删除了我的-1因为它似乎让你不高兴:)我这样做是因为你的回答没有回答我的问题,就这些。别把它弄坏! – acemtp 2009-01-07 19:32:04

+0

我认为马丁认为你采用了相同的源代码,相同的编译器和相同的libstdC++并编译了你的程序,得到了不同的结果。对于那种情况,我认为马丁的回答是非常正确的。 – 2009-01-07 19:35:32

3

既然你自找的,在这里是具有至少ABI版本3.4.9符号:

GLIBCXX_3.4.9 { 

    _ZNSt6__norm15_List_node_base4hook*; 
    _ZNSt6__norm15_List_node_base4swap*; 
    _ZNSt6__norm15_List_node_base6unhookEv; 
    _ZNSt6__norm15_List_node_base7reverseEv; 
    _ZNSt6__norm15_List_node_base8transfer*; 

    _ZNSo9_M_insertI[^g]*; 
    _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertI[^g]*; 
    _ZNSi10_M_extractI[^g]*; 
    _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractI[^g]*; 

    _ZSt21__copy_streambufs_eofI[cw]St11char_traitsI[cw]EE[il]PSt15basic_streambuf*; 

    _ZSt16__ostream_insert*; 

    _ZN11__gnu_debug19_Safe_sequence_base12_M_get_mutexEv; 
    _ZN11__gnu_debug19_Safe_iterator_base16_M_attach_singleEPNS_19_Safe_sequence_baseEb; 
    _ZN11__gnu_debug19_Safe_iterator_base16_M_detach_singleEv; 
    _ZN11__gnu_debug19_Safe_iterator_base12_M_get_mutexEv; 

    _ZNKSt9bad_alloc4whatEv; 
    _ZNKSt8bad_cast4whatEv; 
    _ZNKSt10bad_typeid4whatEv; 
    _ZNKSt13bad_exception4whatEv; 

} GLIBCXX_3.4.8; 

运行该文件libstdc++-v3/config/abi/post/i386-linux-gnu/baseline_symbols.txt通过C++ filt,GLIBCXX_3.4.9的grepping来理解这些名称(它们看起来像通配符)。我没有这样做,因为这些名字变得很长并且嵌套。后来的版本大多包含C++ 1x的东西。以上文件请参见文件libstdc++-v3/config/abi/pre/gnu.ver。阅读here关于VERSION链接器脚本命令。

+0

只见符号名之后的 “纳米” 的一声GLIBC的版本,所以我发现那些用于: _ZNSi10_M_extractIdEERSiRT _ @@ GLIBCXX_3.4.9 _ZNSo9_M_insertIdEERSoT _ @@ GLIBCXX_3.4.9 _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i @@ GLIBCXX_3.4.9 感谢 – acemtp 2009-01-07 19:29:47