gcc deep dive その3. 〜コンパイラ〜

gccバージョン3以降はcc1がプリプロセッサコンパイラを兼ねている。
cc1はプリプロセス(マクロ展開)の結果に基づいてコンパイルを行い、アセンブリコード(*.sファイル)を生成する。


<マクロ展開結果>

↓cc1

アセンブリコード(*.s)

gcc に -S オプションをつけるとcc1によるコンパイル後の段階で処理を止めることができる。
結果のアセンブリコードは*.sファイルに出力される。

#include <string.h>

int main(void){
        char *hoge = "hoge";
        int len = strlen(hoge);
        return len;
}
[user1@vm03 test]$ gcc -S test1.c
[user1@vm03 test]$ cat test1.s
        .file   "test1.c"
        .section        .rodata
.LC0:
        .string "hoge"
        .text
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        subl    $32, %esp
        movl    $.LC0, 24(%esp)
        movl    24(%esp), %eax
        movl    %eax, (%esp)
        call    strlen
        movl    %eax, 28(%esp)
        movl    28(%esp), %eax
        leave
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-11)"
        .section        .note.GNU-stack,"",@progbits

[参考]
http://ysserve.wakasato.jp/sugsi/Lecture/c2/e_10.html