2009-01-07 95 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