centos5.6部署gcc4.7編譯的程式導致問題

冷侃發表於2013-07-22

因為用了c++0x的一些新特性,必須使用4.6及以上的版本編譯,所以使用了4.7編譯,執行時提示錯誤

libstdc++.so.6(GLIBCXX_3.4.14) 錯誤

這個時候下了個glibc2.7的程式碼進行編譯,並且編譯安裝後。。

哈,直接系統崩潰,所有的工具全部用不了,包括bash程式來起不來。只能重新

參考

-------------------------------------------------------

Glibc安裝的庫中有一個為ld-linux.so.X,其中X為一個數字,在不同的平臺上名字也會不同。可以用ldd檢視:

#ldd /bin/cat
linux-gate.so.1 => (0x00bfe000)
libc.so.6 => /lib/libc.so.6 (0x00a4a000)
/lib/ld-linux.so.2 (0x00a28000)

最後一個沒有=>的就是。其中第一個不是實際的庫檔案,你是找不到的,它是一個虛擬庫檔案用於和kernel互動。

ld-linux.so是專門負責尋找庫檔案的庫。以cat為例,cat首先告訴ld-linux.so它需要libc.so.6這個庫檔案,ld-linux.so將按一定順序找到libc.so.6庫再給cat呼叫。

ld-linux.so又是怎麼找到的呢?其實不用找,ld-linux.so的位置是寫死在程式中的,gcc在編譯程式時就寫死在裡面了。Gcc寫到程式中ld-linux.so的位置是可以改變的,通過修改gcc的spec檔案。

執行時,ld-linux.so查詢共享庫的順序

(1)ld-linux.so.6在可執行的目標檔案中被指定,可用readelf命令檢視
(2)ld-linux.so.6預設在/usr/lib和lib中搜尋;當glibc安裝到/usr/local下時,它查詢/usr/local/lib
(3)LD_LIBRARY_PATH環境變數中所設定的路徑
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路徑,由ldconfig生成二進位制的ld.so.cache中

編譯時,ld-linux.so查詢共享庫的順序

(1)ld-linux.so.6由gcc的spec檔案中所設定
(2)gcc --print-search-dirs所列印出的路徑,主要是libgcc_s.so等庫。可以通過GCC_EXEC_PREFIX來設定
(3)LIBRARY_PATH環境變數中所設定的路徑,或編譯的命令列中指定的-L/usr/local/lib
(4)binutils中的ld所設定的預設搜尋路徑順序,編譯binutils時指定。(可以通過“ld --verbose | grep SEARCH”來檢視)
(5)二進位制程式的搜尋路徑順序為PATH環境變數中所設定。一般/usr/local/bin高於/usr/bin
(6)編譯時的標頭檔案的搜尋路徑順序,與library的查詢順序類似。一般/usr/local/include高於/usr/include

 ----------------------------------------

綜上,千萬別把.so那個連結直接拷貝到伺服器上面,不然,會導致其他依賴到的檔案起不來.

相關文章