2014-02-26 37 views
0

有關我構建的服務器有問題(我不是唯一使用它的服務器......)。它是SLES 11(不是SP)。我試圖卸載並重新安裝gcc,glibc等沒有成功。Glibc鏈接差異導致分段錯誤

問題是我的內置程序只要碰到一個庫函數(比如memset或strlen)就會發生seg-fault(注意它是調用這個函數而不是函數本身,參數很好)。我認爲這肯定是連接錯誤,我可以證明它與readelf是不同的。例如:

# readelf -s myprog | grep memset 
    247: 081461d0 52 <OS specific>: 10 GLOBAL DEFAULT 27 [email protected]_2.0 (3) 
    3530: 081461d0 52 <OS specific>: 10 GLOBAL DEFAULT 27 [email protected]@GLIBC_2.0 

VS以前的工作版本,上面寫着:

69: 00000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.0 (2) 
    2035: 00000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.0 

它是一個相當標準的makefile並沒有什麼改變。鏈接器標誌是:

LDFLAGS = -L$(companylibrarypath) -lourcompanylibrary -L$(mysql_lib_path) -lmysqlclient -L/usr/tls/ -lpthread -pthread -lz -L$(curl_lib_path) -lcurl -lxslt 
+1

嘗試從頭開始重建,可能是舊的對象文件... –

+0

我試過了。還創建了新的程序,只有printf和memset,memset有同樣的問題... – user3194963

+0

@ user3194963你有多確定它不是該程序中的錯誤,即使它是一個非常簡單的程序? (即向我們展示那個測試程序,它的全部)。 – nos

回答

1

你的程序通過一些壞的方式重新定義memset(而不是使用std庫提供的版本)的功能。這可能是由一些標題引起的,這可能是「標準的」...也可能是你的編譯器(gcc?)以某種方式生成(elf)代碼不是爲你的平臺...
你也說鏈接過程是失敗,你的意思是鏈接器失敗,無法生成可執行文件?

+0

那麼,您對GCC是正確的..有人已將SLES 11 SP2 DVD放入驅動器中,並將其作爲存儲庫進行安裝。任何重新安裝開發工具的嘗試都會使其處於這種不良狀態。 – user3194963

0

的功能,你說失敗(memset的,printf的)被廣泛使用,如果你的glibc真的那麼壞啓動時,你不會永遠達到一個殼。當然,你無法編譯任何東西。我首先看看它通過-L...標誌拾取的庫。檢查一下LD_PRELOAD=...以某種方式偷偷摸摸。看看lddnm告訴你什麼。也許一個strace myprog 2> /tmp/log或運行它在調試器下清除了神祕...

+0

那麼printf不會失敗(不同的庫?),我說的任何構建的**鏈接**過程我嘗試失敗,而不是glibc本身。我嘗試了其餘的(也是valgrind),但是elfread輸出看起來最相關。即使在彙編語言級別,您也無法在gdb中遵循足夠的... – user3194963