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