Можете ли вы объяснить, почему gcc -S выводит что-то вроде ассемблера? - PullRequest
0 голосов
/ 28 марта 2010
$ 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 ]

2 голосов
/ 28 марта 2010

Хорошим объяснением понятий compiling и linking является здесь .

Также смотрите этот SO поток (разница между компиляцией и компоновкой).

1 голос
/ 28 марта 2010

Это связано с различием языка ассемблера с аналогичным корнем (он же ассемблер) и «сборки» кода (процесс, на который ссылается «-S»).

0 голосов
/ 28 марта 2010

assemble означает перевод результата фазы compile, а link означает объединение результатов этапов сборки различных исполнений gcc вместе в исполняемый файл или библиотеку.

Фаза compile берет результат фазы предварительной обработки и дает примерно код ассемблера.

...