2010-03-28 19 views
0
$ gcc -S buffer-overflow.c && cat buffer-overflow.s 
_foo: 
     pushl %ebp   ;2 
     movl %esp, %ebp  ;3 
     subl $16, %esp  ;4 
     movl LC1, %eax  ;5 
     movl %eax, -4(%ebp) ;6 
     leal -4(%ebp), %eax ;7 
     leal 8(%eax), %edx ;8 
     movl $_bad, %eax ;9 
     movl %eax, (%edx) ;10 
     leave 
     ret 

_main: 
    ... 
     call _foo   ;1 
    ... 

的幫助信息說,它不應該編譯也不組裝:你能解釋爲什麼gcc -S輸出類似組裝的東西嗎?

-S      Compile only; do not assemble or link 

爲什麼他們是矛盾的?

+0

裝配實際上只是機器代碼從文本形式到二進制形式的轉換。 – Paggas 2010-03-28 16:49:14

+0

人們一直採取口頭捷徑,不同的人以不同的方式使用術語。特別是gcc文檔對於「編譯」,「彙編」和「鏈接」具有*它們自己的含義;並且這些術語中的每一個都可以隱藏幾個單獨的傳遞和輸入轉換。試圖強加從其他來源獲得的定義是愚蠢的,而且是徒勞的。現在是學習處理自然語言歧義的好時機。 – dmckee 2010-03-28 17:36:14

回答

0

assemble表示翻譯compile階段的結果,link表示將gcc的不同執行的彙編階段的結果組合成可執行文件或庫。

compile階段粗略地處理預處理階段的結果並生成彙編代碼。

2

compilinglinking概念的一個很好的解釋是here

此外,請參閱此SO thread(編譯和鏈接之間的差異)。

+0

它說:「編譯是將源代碼轉換爲目標代碼的行爲」,但實際上並非如此。或者當我們說編譯時,我們實際上是指編譯和彙編? – Mask 2010-03-28 16:51:37

+0

@Mask:來自維基百科(http://en.wikipedia.org/wiki/Compiler):「編譯器是將用計算機語言(源語言)編寫的源代碼轉換爲另一種計算機語言的東西。」所以編譯+組裝=編譯:) – Lazer 2010-03-30 07:59:41

1

這是由於代碼的類似根源的「彙編」語言(又名彙編)和「彙編」(「-S」幫助引用的過程)的區別。

相關問題