我使用g ++版本4.2.3在同一个GNU / Linux服务器上编译了2个不同的二进制文件。
第一个使用:
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和而不是在libstdc ++中.so.6.0.8
g ++生成的新功能是什么,需要ABI中断并强制系统拥有GLIBCXX_3.4.9?
有没有办法禁用这个新功能,不需要GLIBCXX_3.4.9?
答案 0 :(得分:8)
要找出二进制实际依赖的列出的GLIBCXX_3.4.9符号中的哪一个,请执行以下操作:
readelf -s ./a.out | grep 'GLIBCXX_3\.4\.9' | c++filt
一旦知道要查找的符号,就可以追溯到需要它们的对象:
nm -A *.o | grep _ZN<whatever>
最后,要将其与源相关联,您可以执行以下操作:
objdump -dS foo.o
并查看哪些代码引用了3.4.9符号。
答案 1 :(得分: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;
通过c ++ filt运行文件libstdc++-v3/config/abi/post/i386-linux-gnu/baseline_symbols.txt
,grepping GLIBCXX_3.4.9以理解这些名称(它们看起来只是通配符)。我没有这样做,因为这些名字变得很长并且嵌套了。后来的版本主要包括c ++ 1x的东西。有关上述内容,请参阅文件libstdc++-v3/config/abi/pre/gnu.ver
。阅读有关VERSION链接描述文件命令的here。
答案 2 :(得分: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>