你能解释为什么gcc -S输出像汇编一样吗?

时间:2010-03-28 16:35:07

标签: gcc switch-statement

$ 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 
    ... 

帮助信息表明它不应该编译或汇编:

 -S                       Compile only; do not assemble or link

为什么他们矛盾?

3 个答案:

答案 0 :(得分:2)

compilinglinking概念的一个很好的解释是here

另外,请参阅此SO thread(编译和链接之间的差异)。

答案 1 :(得分:1)

这是由于代码相似的“汇编”语言(又称汇编程序)和代码的“汇编”(“-S”帮助引用的过程)的区别。

答案 2 :(得分:0)

assemble表示翻译compile阶段的结果,而link表示将gcc的不同执行的汇编阶段的结果组合成一个可执行文件或库。< / p>

compile阶段采用预处理阶段的结果并粗略地产生汇编代码。