2013-11-25 96 views
3

因此,在32位環境中,我編譯了一個「.c」文件。比較目標文件以查找變量更改

 A.c and get A.o 

我省了A.o。

假設交流轉換器有一個像

 int a // i change this to long a; 

變量i編譯更改後,並得到另一A.O。

現在,當我做「cmp A.o A.o」時,我可以看到這些文件不同。現在我的問題可以通過比較「.o」文件找出究竟發生了什麼變化。

我得到彙編代碼,並做差異,但我不能讓它的頭部和尾部。有人可以建議一個更聰明的方法。

+1

更聰明的辦法是差異比較的來源,而不是目標文件:-)嚴重的是,如果你不太瞭解彙編語言,比較目標文件將會非常困難。源代碼中的一些細微更改可能會在目標代碼中產生劇烈變化。其他更改可能根本不會更改目標代碼。相同的代碼可以生成不同的目標文件,但環境變化很小。 – Mat

+0

'.o'文件會很亂。它們已經被翻譯成目標微控制器的機器碼。 –

+0

爲什麼你這樣做? –

回答

4

我試着回答這個問題。目標文件可以直接與二進制十六進制編輯器進行比較。以這種方式獲得的東西不可讀,因爲目標文件大部分是機器代碼(當鏈接器尚未鏈接時,它也有鏈接器的符號)。我發現這種方法僅用於檢查一些小東西(如代碼版本和固件版本日期)。我認爲對重大變化的理解只能通過反彙編目標文件來實現。幸運的是,有些工具可以完成這項工作,例如用於linux和unix的objdump,彙編程序有時並不直接,但至少它是人類可讀的。假設您使用的是Linux機器,您可以運行以下命令:

objdump -d yourobjectfile1 > out1 
objdump -d yourobjectfile2 > out2 

並比較結果。你會發現,在C代碼稍加改動就導致彙編代碼的大調整,所以作爲一個實驗,我建議你用helloworld.c水平的東西

其他建議工作

  1. 使用-O0進行編譯,創建一個更簡單的程序集(更類似於您的c) ,因爲禁用了優化。
  2. 嘗試使用可執行文件或鏈接的共享庫(僅限機器代碼),並在比較之前去掉對象,這樣可以減小其大小。
  3. 您可以創建一個混合的C-彙編代碼,可以使閱讀這種方式更容易:gcc -g -c -fverbose-asm myfile.c; objdump -d -M intel -S ass.o > main.s

列表項