2010-11-11 169 views
0

我得到了一個用gcc 3.44編譯的工作程序,但是當我用4.44編譯它時出現了錯誤。函數中的某些局部變量似乎被未知的修改過,因此for循環將不會終止,因爲它的條件中的變量不斷地變爲0,即使它增加了。在循環中調用一個函數似乎沒問題,因爲它返回到了正確的地址。我試圖跟蹤循環受到影響的變量的值,我發現在if分支下調用打印函數後,該值被修改,刪除或添加更多的打印呼叫可以解決它,但我認爲它與無關打印函數並沒有修改該變量的代碼,除了循環中的增量外。我也試着在循環的開始和結束時跟蹤esp,它是一樣的。什麼可能導致這個問題?堆棧問題

+3

看起來像堆棧損壞。滾入代碼。 – sharptooth 2010-11-11 07:19:50

+1

我可以從這裏完全閱讀你的代碼¬_¬,換句話說,你希望我們幫助你告訴你你的問題是什麼或者只是一個通用的答案,換句話說,更多的信息代碼 – thecoshman 2010-11-11 07:29:24

+0

代碼很長。 ..它實際上是一個ATA驅動器檢測器在PCI總線上爲我的引導程序。我只是想知道爲什麼它在較老的GCC上工作。 – prinzrainer 2010-11-11 08:03:28

回答

0

如果這實際上是打印功能的問題,也許你正在用可變參數列表的某些參數破壞堆棧?也許你有關於標準數據類型或枚舉常量之一的假設不再適用?這些是你自己的打印功能嗎?然後嘗試使用gcc的__attribute__擴展來進行編譯時類型檢查。

+0

我沒有試過4.41 4.42但我有4.44 ... – prinzrainer 2010-11-15 06:45:23

1

您聲明您將從GCC v3.44(代碼工作的地方)到v4.44代碼被破壞的地方。

確保程序的所有其他部分(所有源文件和庫文件)也使用GCC v4.44編譯。你正在調用一個打印函數,所以我猜你指的是glibc中的標準printf函數。所以請確保glibc也是在v4.44下編譯的。