2011-09-21 14 views
6

我有一個測試驅動程序鏈接到我寫的庫。該庫使用autotools,因此它會生成一個存檔(.a文件)和一個動態庫(.so)。Valgrind與-static關聯時出錯 - 爲什麼?

當我用'g ++ -static'鏈接我的驅動程序時,想必鏈接到.a,valgrind會反覆抱怨'條件跳轉或移動取決於未初始化的值'。第一個故障發生在__pthread_initialize_minimal的main之前。

當我沒有-static鏈接,大概連接.so,我沒有得到任何valgrind投訴。

有誰知道爲什麼? valgrind只是不工作 - 靜態?

UPDATE:因爲它連接到一個非常大的圖書館,我也不可能削減下來,我不能發表我的司機,甚至削減版本,但我注意到,最簡單的所有程序的

int main() 
{ 
    return 0; 
} 

==15449== Use of uninitialised value of size 8 
==15449== at 0x40B0F3: exit (in /home/jdgordo/src/t) 

我應該已經包括我在64位運行RedHat 5.5:

在用-static和運行從Valgrind的連接提供了一個錯誤。

+0

嘗試將問題縮小到儘可能少的行代碼並在此處發佈。 – fazo

+4

在各種系統庫中有很多失誤和快捷方式,所以看到那些出現在valgrind中的人並不罕見。我可以嘗試系統地忽略它們,或者只是使用共享版本進行測試。 –

+0

我在我的系統上看不到這個。 @KerrekSB - 雖然是對的,但它並不是真正需要擔心的事情,而valgrind會附帶大型文件來壓制大部分這些文件。它可能在某種程度上與您的系統上的libc/compiler版本稍微不匹配。 – Flexo

回答

10

valgrind是否只能用-static工作?

它的確如此。問題不在於Valgrind,而在於glibc,而不是Valgrind的清潔。 glibc開發人員拒絕解決這些問題(因爲問題是「無關緊要」,並且需要花費幾個週期)。

當您動態鏈接時,這些錯誤來自libc.so.6,並且可以很容易地被抑制,這是Valgrind在默認情況下所做的。

但是,當您靜態鏈接時,這些錯誤來自您的可執行文件(它現在包含來自libc.a的代碼),因此默認的Valgrind抑制不會抑制它們。

您可以編寫新的抑制(參見Valgrind --gen-suppressions=yesdocumentation)。您可以安裝和使用glibc-audit

+0

當libc靜態鏈接時,Valgrind會攔截malloc和免費調用嗎? –

1

如果庫引起valgrind中的問題,則只能通過writing suppression files忽略這些問題。

一個問題,我遇到的是alocating上堆的東西,像這樣:

// library 
int * some = new int; 

// main links the library 
int main() 
{ 
} 

這個例子會報告有關泄漏錯誤。

編輯:如果你有圖書館的來源,你可以修復錯誤(使用未初始化的變量),並重新編譯它。

相關問題