GNU Compiler Collection »ç¿ëÇϱâ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Contents

1 GCC ¿¡ ´ëÇØ¼­
2 GCCÀÇ ±âº» ¿É¼Çµé
2.1 GCC Ư¡°ú Áö¿ø ȯ°æ È®ÀÎ
2.2 Object ÆÄÀÏÀÇ »ý¼º
2.3 ½ÇÇàÆÄÀÏ »ý¼º
3 PreProcess ¿¡ ´ëÇØ¼­
3.1 proprocessed Ãâ·Â
3.2 ¸ÅÅ©·Î ġȯ (#define)
4 Assembly ÄÚµå »ý¼º
5 ¶óÀ̺귯¸® »ç¿ëÇϱâ
6 profiling ¹× µð¹ö±ë
7 ÄÄÆÄÀÏ ½Ã°£ ¸ð´ÏÅ͸µ
8 GCC ÃÖÀûÈ­
8.1 °ü·Ã¹®¼­


1 GCC ¿¡ ´ëÇØ¼­

GNU C compiler´Â GNU systemÀ» ÀÌ·ç°í ÀÖ´Â Áß¿äÇÑ ºÎºÐÁß ÇϳªÀ̸ç Richard Stallman¿¡ ÀÇÇØ¼­ ¸¸µé¾îÁ³´Ù. ÃÖÃÊ¿¡´Â ´ÜÁö CÄڵ常À» ÄÄÆÄÀÏ ÇÒ ¼ö ÀÖ¾ú±â ¶§¹®¿¡ GNU C Compiler·Î ºÒ¸®¿ü¾ú´Ù. ±×·¯´ø °ÍÀÌ ´Ù¸¥ ¸¹Àº Áö¿øÀڵ鿡 ÀÇÇØ¼­ C++, Fortran, Ada, Java µîÀÇ ÄÄÆÄÀϵµ Áö¿øÇÒ ¼ö ÀÖ°Ô µÇ¸é¼­ GNU Compiler CollectionÀ¸·Î À̸§À» º¯°æÇÏ°Ô µÈ´Ù. ÀÌ ¹®¼­´Â ´ÜÁö C¾ð¾îÄڵ忡 ´ëÇÑ ÄÄÆÄÀÌ·¯·Î½áÀÇ GCCÀÇ »ç¿ë¹ý¿¡ ´ëÇØ¼­ ´Ù·é´Ù.

GCC´Â Linux»Ó¸¸ ¾Æ´Ï¶ó FreeBSD, NetBSD, OpenBSD, SunOS, HP-UX, AIXµîÀÇ *Nix¿î¿µÃ¼Á¦ ±×¸®°í Cygwin, MingW32ÀÇ À©µµ¿ìȯ°æ¿¡¼­µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Ç÷¿Æû ¿ª½Ã Intel x86, AMD x86-64, Alpha, SPARC µî¿¡¼­ »ç¿ë°¡´É ÇÏ´Ù. ÀÌ·¯ÇÑ ´Ù¾çÇÑ È¯°æ¿¡¼­ÀÇ ¿î¿ë°¡´É¼º ¶§¹®¿¡ ´Ù¾çÇÑ Ç÷¿Æû¿¡¼­ ÀÛµ¿À» ÇØ¾ß ÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé±â À§ÇÑ ¸ñÀûÀ¸·Î À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù.

2 GCCÀÇ ±âº» ¿É¼Çµé

GCC°¡ ¿©·¯ºÐÀÇ ½Ã½ºÅÛ¿¡ ¼³Ä¡µÇ¾î ÀÖ´Ù°í °¡Á¤ÇÏ°í ±ÛÀ» ¾²µµ·Ï ÇϰڴÙ.

2.1 GCC Ư¡°ú Áö¿ø ȯ°æ È®ÀÎ

[root@localhost include]# gcc -v 
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.4/specs 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man  
--infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking  
--with-system-zlib --enable-__cxa_atexit  
--disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux 
Thread model: posix 
gcc version 3.4.4 20050721 (Red Hat 3.4.4-2) 
 
-v¿É¼ÇÀ» ÀÌ¿ëÇϸé GCC¿Í °ü·ÃµÈ ´Ù¾çÇÑ Á¤º¸µéÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. À§ÀÇ Á¤º¸¿¡¼­ ÇöÀç ¼³Ä¡µÈ gcc´Â POSIX(12) ¾²·¹µå ¸ðµ¨À» Áö¿øÇϰí ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÀÌ´Â ´ÙÁß¾²·¹µå¸¦ Áö¿øÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÀÛ¼ºÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.

ÀÌÁ¦ ÇϳªÀÇ Çì´õÆÄÀϰú ÇϳªÀÇ ¼Ò½ºÄÚµåÆÄÀÏ·Î ÀÌ·ç¾îÁø °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé°í ÄÄÆÄÀÏÀ» ÇØº¸¸é¼­ GCC¿¡¼­ Áö¿øÇÏ´Â ´Ù¾çÇÑ ÄÄÆÄÀÏ ¿É¼Çµé¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
// helloworld.h 
#define COUNT 2 
 
static char hello[] = "hello world"; 
 
// helloworld.c 
#include <stdio.h> 
#include "helloworld.h" 
 
int main() 
{ 
  int i; 
  for (i =0; i <= COUNT; i++) 
  { 
    printf("%s - %d\n", hello, i); 
  } 
  return 0; 
} 
 

2.2 Object ÆÄÀÏÀÇ »ý¼º

[root@localhost ~]# gcc -v -c helloworld.c  
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.4/specs 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/u 
sr/share/info --enable-shared --enable-threads=posix --disable-checking --with-s 
ystem-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-aw 
t=gtk --host=i386-redhat-linux 
Thread model: posix 
gcc version 3.4.4 20050721 (Red Hat 3.4.4-2) 
 /usr/libexec/gcc/i386-redhat-linux/3.4.4/cc1 -quiet -v helloworld.c -quiet -dum 
pbase helloworld.c -auxbase helloworld -version -o /tmp/ccs8066J.s 
ignoring nonexistent directory "/usr/lib/gcc/i386-redhat-linux/3.4.4/../../../.. 
/i386-redhat-linux/include" 
#include "..." search starts here: 
#include <...> search starts here: 
 /usr/local/include 
 /usr/lib/gcc/i386-redhat-linux/3.4.4/include 
 /usr/include 
End of search list. 
GNU C version 3.4.4 20050721 (Red Hat 3.4.4-2) (i386-redhat-linux) 
        compiled by GNU C version 3.4.4 20050721 (Red Hat 3.4.4-2). 
GGC heuristics: --param ggc-min-expand=64 --param ggc-min-heapsize=64407 
 as -V -Qy -o helloworld.o /tmp/ccs8066J.s 
GNU assembler version 2.15.92.0.2 (i386-redhat-linux) using BFD version 2.15.92. 
0.2 20040927 
 
À§ °á°ú¿¡¼­ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸¸µé±â À§Çؼ­ include °æ·Î¸¦ ã´Â °úÁ¤°ú GNU assembler¸¦ ÀÌ¿ëÇØ¼­ ÄÄÆÄÀÏÀ» Çϰí ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÄÄÆÄÀÏ·¯´Â ¿øº»ÆÄÀÏ·Î ºÎÅÍ /tmp/ccs8066J.s ¶ó´Â ¾î¼Àºí¸®Äڵ带 ¸¸µé°í, À̰ÍÀ» as¸¦ ÀÌ¿ëÇØ¼­ helloworld.o¶ó´Â À̸§ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸¸µé¾ú´Ù.

2.3 ½ÇÇàÆÄÀÏ »ý¼º

[root@localhost ~]# gcc -v -o helloworld helloworld.c  
...[»ý·«]... 
GNU C version 3.4.4 20050721 (Red Hat 3.4.4-2) (i386-redhat-linux) 
        compiled by GNU C version 3.4.4 20050721 (Red Hat 3.4.4-2). 
GGC heuristics: --param ggc-min-expand=64 --param ggc-min-heapsize=64407 
 as -V -Qy -o /tmp/ccj9GxKi.o /tmp/ccGzRoCh.s 
GNU assembler version 2.15.92.0.2 (i386-redhat-linux) using BFD version 2.15.92.0.2 20040927 
 /usr/libexec/gcc/i386-redhat-linux/3.4.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker  
/lib/ld-linux.so.2 -o helloworld /usr/lib/gcc/i386-redhat-linux/3.4.4/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/3.4.4/../../../crti.o  
/usr/lib/gcc/i386-redhat-linux/3.4.4/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/3.4.4 -L/usr/lib/gcc/i386-redhat-linux/3.4.4  
-L/usr/lib/gcc/i386-redhat-linux/3.4.4/../../.. /tmp/ccj9GxKi.o -lgcc  
--as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s 
--no-as-needed /usr/lib/gcc/i386-redhat-linux/3.4.4/crtend.o /usr/lib/gcc/i386-redhat-linux/3.4.4/../../../crtn.o 
 
-L ¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ ¸µÅ©ÇÒ ¶óÀ̺귯¸®ÀÇ °æ·Î¸¦ ã°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ¿©±â¿¡¼­´Â ±âº»ÀûÀ¸·Î ÁöÁ¤µÈ °æ·Î¿¡¼­¸¸ ¶óÀ̺귯¸®¸¦ ã°í Àִµ¥, º°µµ·Î -L ¿É¼ÇÀ» Á༭ ´Ù¸¥ °æ·Î¿¡¼­ ¶óÀ̺귯¸®¸¦ ãµµ·Ï ÇÒ ¼öµµ ÀÖ´Ù. ±×¸®°í -l¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ ¸µÅ©ÇÒ ¶óÀ̺귯¸®¸¦ ÁöÁ¤Çϰí ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. -l·Î ÁöÁ¤µÈ ¶óÀ̺귯¸®´Â -L¿¡ ÀÇÇØ ÁöÁ¤µÈ °æ·Î¿¡¼­ µ¿ÀÏÇÑ À̸§ÀÇ ¶óÀ̺귯¸®°¡ ÀÖ´ÂÁö¸¦ ã¾Æ¼­ ¸µÅ©ÇÏ°Ô µÈ´Ù.

ÇÊ¿äÇÑ ¶óÀ̺귯¸®µéÀ» ¸µÅ© ½ÃŰ°í ³ª¸é, ¿ÏÀüÇÑ ½ÇÇàÆÄÀÏÀÌ ¸¸µé¾îÁø´Ù.

3 PreProcess ¿¡ ´ëÇØ¼­

Àü󸮱â·Î ºÒ¸®¿ì±âµµ ÇÏ´Â preprocessor´Â CÄÄÆÄÀÏ·¯¿¡¼­ ¸Å¿ì Áß¿äÇÑ ¿ªÇÒÀ» ´ã´çÇÑ´Ù. preprocessorÀº #include, #ifdef, #pragmaµî '#'À¸·Î ½ÃÀ۵Ǵ Äڵ带 ºÐ¸®ÇØ ³½´Ù. À̵é ÄÚµå´Â ÄÄÆÄÀÏÀÌ ÀÌ·ç¾îÁö±â Àü¿¡, ¸ÅÅ©·Î ġȯ, Á¶°ÇºÎ ÄÄÆÄÀÏ È®ÀÎ, ÆÄÀÏ Ã·°¡(include)µîÀÇ ¾÷¹«¸¦ ó¸®ÇÑ´Ù. ¿¹¸¦ µé¾î #define COUNT 2 ¶ó´Â ÄÚµå¶óÀÎÀÌ ÀÖ´Ù¸é, À̺κÐÀ» ÇØ¼®Çؼ­ ¼Ò½ºÄڵ忡 ÀÖ´Â ¸ðµç COUNT¸¦ 2·Î ġȯÇÏ´Â ÀÏÀ» ÇÑ´Ù. preprocessorÀº ÁÙ´ÜÀ§·Î ó¸®ÇÑ´Ù.

3.1 proprocessed Ãâ·Â

# gcc -E helloworld.c > helloworld.preprocess 
 
ÆÄÀÏ÷°¡, ¸ÅÅ©·ÎġȯµîÀ» Æ÷ÇÔÇÑ ¸ðµç preprocess °úÁ¤À» ÆÄÀÏ·Î ÀúÀåÇϰí ÀÖ´Ù. ÆíÁý±â¸¦ ÀÌ¿ëÇØ¼­ ÆÄÀÏÀ» ¿­¾îº¸¸é preprocess°¡ ´ã´çÇÏ´Â ÀÏÀÌ ¾î¶²°ÇÁö¸¦ ´ë·«ÀûÀ¸·Î ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ½ÇÁúÀûÀ¸·Î CÄÄÆÄÀÏ·¯´Â preprocess°¡ ¿ÏÀüÈ÷ ³¡³­ »óÅÂÀÎ helloworld.preprocess¸¦ ¼Ò½ºÄÚµå·Î ÇØ¼­ ÄÄÆÄÀÏÀ» ¼öÇàÇÑ´Ù.

3.2 ¸ÅÅ©·Î ġȯ (#define)

# gcc -E helloworld.c -dM | sort | less 
 
¸ðµç define ¹®À» ó¸®Çϰí À̸¦ sort ÇØ¼­ º¸¿©ÁÖ°í ÀÖ´Ù. ¿©±â¿¡¼­ GNUC, GNUC_MINOR, GNUC_PATCHLEVEL µîµî GCC¹öÀü°ú °ü·ÃµÈ Á¤º¸µéµµ È®ÀÎÇÒ ¼ö ÀÖ´Ù.

4 Assembly ÄÚµå »ý¼º

GCC´Â ÀÌÁøÄڵ带 ¸¸µé±âÀü¿¡ CÄڵ带 assembly ÄÚµå·Î º¯È¯µÇ°í, º¯È¯µÈ assembly°¡ ÇØ¼®µÇ¾î¼­ ÀÌÁøÄڵ尡 ¸¸µé¾îÁø´Ù. -S ¿É¼ÇÀ» ÀÌ¿ëÇϸé, CÄڵ尡 ¾î¶² assemblyÄÚµå·Î º¯È¯µÇ´ÂÁö¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
# gcc -S helloworld.c 
 
´ÙÀ½Àº ¸¸µé¾îÁø assembly ÄÚµå´Ù.
  .file "helloworld.c" 
  .data 
  .type hello, @object 
  .size hello, 12 
hello: 
  .string "hello world" 
  .section  .rodata 
.LC0: 
  .string "%s - %d\n" 
  .text 
.globl main 
  .type main, @function 
main: 
  pushl %ebp 
  movl  %esp, %ebp 
  subl  $8, %esp 
  andl  $-16, %esp 
  movl  $0, %eax 
  addl  $15, %eax 
  addl  $15, %eax 
  shrl  $4, %eax 
  sall  $4, %eax 
  subl  %eax, %esp 
  movl  $0, -4(%ebp) 
.L2: 
  cmpl  $2, -4(%ebp) 
  jg  .L3 
  subl  $4, %esp 
  pushl -4(%ebp) 
  pushl $hello 
  pushl $.LC0 
  call  printf 
  addl  $16, %esp 
  leal  -4(%ebp), %eax 
  incl  (%eax) 
  jmp .L2 
.L3: 
  movl  $0, %eax 
  leave 
  ret 
  .size main, .-main 
  .section  .note.GNU-stack,"",@progbits 
  .ident  "GCC: (GNU) 3.4.4 20050721 (Red Hat 3.4.4-2)" 
 
À§ÀÇ ¾î¼Àºí¸® Äڵ忡¼­ ¿ì¸®´Â "hello world" ¹®ÀÚ¿­ÀÌ ÀбâÀü¿ë µ¥ÀÌÅÍ·Î staticÇÏ°Ô Á¤ÀǵǾî ÀÖ´Â°É È®ÀÎÇÒ ¼ö ÀÖ´Ù. .LC0 ¼½¼ÇÀº printfÀÇ ÀÎÀÚ¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ÀÌ °ªµéÀº ½ºÅÿ¡ ³Ö¾îÁö¸ç printf()°¡ È£ÃâµÉ ¶§ Àоî¿Â´Ù. .L2 ¼½¼Ç¿¡ loop¸¦ À§ÇÑ »óŰ˻ç Äڵ尡 µé¾î°¬´Ù. .L3 ¼½¼ÇÀº ÇÔ¼ö°¡ ³¡³­ÈÄ ÇÊ¿äÇÑ °ªÀ» ¸®ÅÏÇϰí Á¾·áÇϱâ À§ÇÑ Äڵ尡 µé¾î°¬´Ù. ÀÌ ¾î¼Àºí¸®ÄÚµå´Â ÄÄÆÄÀϵǾ ±â°è°¡ ÇØ¼®ÇÒ ¼ö ÀÖ´Â ÀÌÁøÄÚµå·Î º¯°æµÇ¸ç, ÀÌ·¯ÇÑ ÄÄÆÄÀÏ ÀÛ¾÷Àº as°¡ ´ã´çÇÑ´Ù.

5 ¶óÀ̺귯¸® »ç¿ëÇϱâ

¸¸µç Äڵ带 ´Ù¸¥ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¶óÀ̺귯¸® ÇüÅ·Π¸¸µé±â¸¦ ¿øÇÑ´Ù¸é -fpic ¿É¼ÇÀ» ÁÖ¸éµÈ´Ù. fpic ¿É¼ÇÀº Äڵ带 Position Independent Code (PIC) ·Î ¸¸µé¾î ÁØ´Ù. ¶óÀ̺귯¸®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº library ¸¸µé±â¸¦ Âü°íÇϱ⠹ٶõ´Ù.

6 profiling ¹× µð¹ö±ë

profiling ´Â ÇÁ·Î±×·¥ÀÇ ½ÇÇà½Ã°£½Ã ÄÚµåÀÇ ¾î¶² ºÎºÐÀÌ °¡Àå ¸¹Àº ÀÚ¿øÀ» Â÷ÁöÇϰí ÀÖ´ÂÁö ¾Ë¾Æ³»±â À§Çؼ­ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. profilingÀº ±âº»ÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ Æ¯Á¤ÇÑ ÁöÁ¡¿¡ ¸ð´ÏÅ͸µ Äڵ带 ÀÔ·ÂÇÏ´Â ¹æ½ÄÀ¸·Î ÀÌ·ç¾îÁö¸ç GCCÀÇ -pg¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ ¸ð´ÏÅ͸µ Äڵ带 ÀÔ·ÂÇÒ ¼ö ÀÖ´Ù. profiling¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº Gprof¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¥ ÃÖÀûÈ­¸¦ Âü°íÇϱ⠹ٶõ´Ù.

ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥À» µð¹ö±ë Çϱâ À§Çؼ­´Â ´ç¿¬È÷ ÇÁ·Î±×·¥ ½ÇÇà ÄÚµå ¿ÜÀÇ ´Ù¸¥ Äڵ尡 »ðÀÔµÅ¾ß ÇÑ´Ù. -g ¿É¼ÇÀ» ÀÌ¿ëÇϸé, gdb¸¦ ÅëÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¿©ºÐÀÇ µð¹ö±ë Á¤º¸°¡ Äڵ忡 »ðÀԵȴÙ. ¿©ºÐÀÇ Äڵ尡 »ðÀԵDZ⠶§¹®¿¡ ½ÇÇàÆÄÀÏÀÇ Å©±â°¡ Ä¿Áø´Ù´Â ´ÜÁ¡ÀÌ ÀÖÁö¸¸, ¾îÂ÷ÇÇ µð¹ö±ëÀÌ ³¡³­´ÙÀ½¿¡´Â µð¹ö±ëÄڵ带 Á¦°ÅÇÏ°í ´Ù½Ã ÄÄÆÄÀÏÇÏ¸é µÇ¹Ç·Î Å©°Ô ¹®Á¦µÉ°Ç ¾ø´Ù. ÀÏ´Ü µð¹ö±ë ¸ðµå·Î ÄÄÆÄÀÏÀÌ µÇ¸é ¸ðµç ÃÖÀûÈ­(optimization) Ç÷¡±×°¡ ¹«È¿È­ µÈ´Ù.
$ gcc -g -o helloworld helloworld.c #for adding debugging information 
$ gcc -pg -o helloworld helloworld.c #for profiling 
 

7 ÄÄÆÄÀÏ ½Ã°£ ¸ð´ÏÅ͸µ

¿ÏÀüÇÑ ÇϳªÀÇ ½ÇÇàÆÄÀÏÀ» ¸¸µé±â À§Çؼ­´Â ¸î°³ÀÇ ´Ü°è¸¦ °ÅÃÄÇÑ´Ù. ±×·¸´Ù¸é °¢°¢ÀÇ ´Ü°è¿¡ ¾î´ÀÁ¤µµÀÇ ½Ã°£ÀÌ ¼Ò¸ðµÇ´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë°í ½ÍÀ» ¶§°¡ ÀÖÀ» °ÍÀÌ´Ù. -time ¿É¼ÇÀ» »ç¿ëÇÏ¸é °¢ ´Ü°èº° ¼Ò¸ð½Ã°£À» ¾Ë ¼ö ÀÖ´Ù.
[root@localhost ~]# gcc -time helloworld.c  
# cc1 0.07 0.01 
# as 0.00 0.00 
# collect2 0.06 0.01 
 
-Q ¿É¼ÇÀ» ÀÌ¿ëÇϸé Á»´õ ÀÚ¼¼ÇÑ ¼Ò¸ð½Ã°£À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ´õºÒ¾î ÄÄÆÄÀÏÀÌ ¾î¶°ÇÑ °úÁ¤À¸·Î ÀÌ·ç¾îÁö´ÂÁöµµ È®ÀÎ °¡´ÉÇÏ´Ù.
[root@localhost ~]# gcc -Q helloworld.c  
 main 
 
Execution times (seconds) 
 preprocessing         :   0.02 (25%) usr   0.00 ( 0%) sys   0.05 (26%) wall 
 lexical analysis      :   0.01 (12%) usr   0.01 (50%) sys   0.01 ( 5%) wall 
 parser                :   0.01 (13%) usr   0.00 ( 0%) sys   0.04 (21%) wall 
 global alloc          :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 5%) wall 
 TOTAL                 :   0.08             0.02             0.19 
 

8 GCC ÃÖÀûÈ­

ÃÖÀûÈ­¿¡ ´ëÇØ¼­ ¼³¸íÇϱâ Àü¿¡, ¾î¶»°Ô ÄÄÆÄÀÏ·¯°¡ ¼­·Î´Ù¸¥ Ç÷¿Æû°ú ´Ù¸¥ ¾ð¾î¿¡¼­ »ç¿ë°¡´ÉÇÑ Äڵ带 »ý¼ºÇس»´ÂÁö¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÄÄÆÄÀÏ ÇÁ·Î¼¼½º´Â ´ÙÀ½ÀÇ 3°¡Áö ÄÄÆ÷³ÍÆ®µé·Î ÀÌ·ç¾îÁø´Ù.

  • Front End : ÃÖÃÊ¿¡ ÀÔ·ÂµÈ ÄÚµå´Â Àΰ£ÀÌ ÀÌÇØÇϱ⠽¬¿î ¹®ÀÚ¿­·Î ÀÌ·ç¾îÁö´Âµ¥, À̸¦ ÄÄÇ»ÅͰ¡ ´É·üÀûÀ¸·Î ÇØ¼®ÇÒ ¼ö Çü½ÄÀ¸·Î ¸¸µé¾î Áà¾ß ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ÄÄÆÄÀÏ·¯´Â ÁÖ¾îÁø Äڵ带 ÆÄ½ÌÀ» ÇØ¼­ Tree Çü½ÄÀÇ µ¥ÀÌÅÍ ±¸Á¶·Î À籸¼ºÇÑ´Ù. ÀÌ ´Ü°è´Â ÃÖÀûÈ­ÇÒ ¸¸ÇÑ ¿©Áö°¡ °ÅÀÇ ¾øÀ¸¸ç, GCC°¡ Áö¿øÇÏ´Â ¾ð¾î¿¡ µû¶ó¼­ ´Ù¸¥ ¹æ¹ýÀ¸·Î Tree¸¦ ±¸¼ºÇÏ°Ô µÉ °ÍÀÌ´Ù.

  • Middle End : ÄÚµå»ý¼ºÀ» À§Çؼ­ ±¸¼ºµÈ Æ®¸®±¸Á¶¿¡¼­ ÀûÀýÇÑ °ªµéÀ» °¡Áö°í ¿Í¼­ Àç ¹èÄ¡½ÃŲ´Ù. ÀÌ ´Ü°è´Â ¸ðµç ¾ð¾î¿Í Ç÷¿Æû¿¡¼­ ÀϹÝÀûÀÎ °úÁ¤À» °ÅÄ¡°Ô µÇ¹Ç·Î ¿ª½Ã ÃÖÀûÈ­ÀÇ ¿ä¼Ò´Â °ÅÀÇ ¾ø´Ù°í º¼ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °úÁ¤µéÀÌ ¾î¶»°Ô ÀϾ´ÂÁö¸¦ È®ÀÎÇϱ⠿øÇÑ´Ù¸é ÄÄÆÄÀÏ·¯¿Í °ü·ÃµÈ ¹®¼­¸¦ Àоî¾ß ÇÑ´Ù.

  • Back End : ½ÇÁ¦ ÀÌÁøÄڵ带 ¸¸µé¾î ³»±â À§ÇÑ ¸¶Áö¸· Àü ´Ü°è·Î, Ç÷¿ÆûÀÇ Æ¯¼ºÀ» µû¸£°Ô µÈ´Ù. ÀÌ ´Ü°è¿¡¼­ Ç÷§ÆûÀÇ Æ¯¼º¿¡ µû¸¥ ÃÖÀûÈ­ÀÇ ´ëºÎºÐÀÌ ÀÌ·ç¾îÁö°Ô µÈ´Ù. ÄÄÆÄÀÏ·¯´Â MMX/SSE2/3DNow¿Í °°Àº È®ÀåµÇ°Å³ª µ¶Æ¯ÇÑ instruction¼Â¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÌ¿ëÇØ¼­ °Å±â¿¡ ¸Â´Â ¹ÙÀ̳ʸ® Äڵ带 »ý¼ºÇÏ·Á°í ÇÑ´Ù. CPUÀÇ Á¾·ù¿¡ µû¶ó¼­ registerÀÇ °¹¼ö, ij½¬¿Í ÆÄÀÌÇÁ¶óÀÎÀÇ ±¸Á¶°¡ ´Ù¸£±â ¶§¹®¿¡, ÄÄÆÄÀÏ·¯´Â ÀÌµé ±¸Á¶°£ÀÇ Â÷ÀÌÁ¡À» °í·ÁÇØ¼­ °¡´ÉÇÑ ºü¸¥ Äڵ带 ¸¸µç´Ù.

ÃÖÀûÈ­¿¡´Â ¼Óµµ ¿ì¼± ÃÖÀûÈ­¿Í °ø°£ ¿ì¼± ÃÖÀûÈ­ÀÇ µÎ°¡Áö°¡ ÀÖ´Ù. ÀÌ»óÀûÀ¸·Î º¸ÀÚ¸é ¼Óµµ¿Í °ø°£À» ¸ðµÎ °í·ÁÇØ¼­ ÃÖ»óÀÇ ±ÕÇüÁ¶°ÇÀ» ã´Â°Ô ÁÁÀ» °ÍÀÌ´Ù. ÃÖ±Ù¿¡´Â ¸Þ¸ð¸®ÀÇ °¡°ÝÀÌ ³»·Á°£ °ü°è·Î ¸Þ¸ð¸®ÀÇ ¼Òºñ¸¦ Áõ°¡ÇÏ°í ¼Óµµ¸¦ ¿ì¼±ÀûÀ¸·Î ³ôÀÌ´Â ¹æ¹ýÀ» ¸¹ÀÌ »ç¿ëÇÏ°Ô µÈ´Ù. ÀζóÀÎ ÇÔ¼ö°¡ °¡Àå ´ëÇ¥ÀûÀÎ °æ¿ì°¡ µÉ°ÍÀÌ´Ù. ÀζóÀÎ ÇÔ¼ö¸¦ »ç¿ëÇÏ°Ô µÇ¸é ½ÇÇàÆÄÀÏÀÇ Å©±â°¡ Ä¿ÁöÁö¸¸, ´ë½Å Á»´õ ºü¸¥ ÇÔ¼öÀÇ È£ÃâÀÌ °¡´ÉÇØÁö¹Ç·Î ÀüüÀûÀ¸·Î ½ÇÇà¼Óµµ°¡ Çâ»óµÉ °ÍÀÌ´Ù.

GCC´Â 4´Ü°èÀÇ ÃÖÀûÈ­ Á¤µµ¸¦ Á¦°øÇÑ´Ù. ´Ü°è´Â -O ¿É¼ÇµÚ¿¡ ´Ü°è¸¦ ³ªÅ¸³»´Â ¼ýÀÚ¸¦ ¸í½ÃÇÏ´Â ½ÄÀ¸·Î ÀÌ·ç¾îÁø´Ù. ±âº»ÀûÀ¸·Î´Â "ÃÖÀûÈ­¸¦ ¾ÈÇÔ"Àε¥ -O0¿Í µ¿ÀÏÇÏ´Ù. -O1, -O2, -O3Àº ¾Æ·¡¿Í °°Àº ÃÖÀûÈ­ ¼öÁØÀ» °¡Áø´Ù.
  • -O1 ´Â ÄÄÆÄÀÏ ½Ã°£ÀÇ Æ¯º°ÇÑ Áõ°¡ ¾øÀÌ ÄÚµåÀÇ Å©±â¿Í ½ÇÇà ½Ã°£À» ÁÙ¿©ÁØ´Ù.
  • -O2 ´Â ÄÚµåÀÇ Å©±â¿Í ½ÇÇà ½Ã°£À» ÀýÃæÇÑ ÃÖÀûÈ­ Äڵ带 ¸¸µç´Ù.
  • -O3 ´Â °¡´ÉÇÑ ¸ðµç ÃÖÀûÈ­¸¦ ÇÑ´Ù. ´ë½Å ÄÄÆÄÀÏ ½Ã°£ÀÌ ´Ã¾î³ª°Ô µÈ´Ù.
[root@localhost ~]# gcc -O3 -o hello3 helloworld.c  
[root@localhost ~]# gcc -O0 -o hello0 helloworld.c  
 
[root@localhost ~]# ls -al hello* 
-rwxr-xr-x  1 root root  4754  1¿ù  3 19:12 hello3 
-rwxr-xr-x  1 root root  4782  1¿ù  3 19:12 hello0 
 
[root@localhost ~]# time ./hello3 > /dev/null  
 
real    0m0.003s 
user    0m0.001s 
sys     0m0.001s 
[root@localhost ~]# time ./hello0 > /dev/null  
 
real    0m0.002s 
user    0m0.000s 
sys     0m0.002s 
 
À§ÀÇ °á°ú¸¦ º¸¸é -O3 ÃÖÀûÈ­¸¦ ÇßÀ» °æ¿ì ½ÇÇàÆÄÀÏÀÇ Å©±â°¡ ´õ ÀÛ¾ÆÁ³À½À» ¾Ë ¼ö ÀÖ´Ù.

-O ÃÖÀûÈ­ ¿É¼ÇÀº gccÀÇ ´Ù¾çÇÑ ÄÄÆÄÀÏ ¿É¼ÇÀ» ´Ü°èº°·Î Á¶ÇÕÇÑ °ÍÀ¸·Î ·¹º§º°·Î ´ÙÀ½ÀÇ ¿É¼ÇÀ» °¡Áø´Ù.
ÃÖÀûÈ­ ·¹º§ -O1 -O2 -Os -O3
defer-pop O O O O
thread-jumps O O O O
branch-probabilities O O O O
cprop-registers O O O O
guess-branch-probability O O O O
omit-frame-pointer O O O O
merge-constants O O O O
loop-optimize O O O O
if-conversion O O O O
if-conversion2 O O O O
align-loops X O X O
align-jumps X O X O
align-labels X O X O
align-functions X O X O
crossjumping X O O O
prefetch-loop-array ? ? X ?
optimize-sibling-calls X O O O
cse-follow-jumps X O O O
cse-skip-blocks X O O O
gcse X O O O
gcse-lm X O O O
gcse-sm X O O O
gcse-las X O O O
expensive-optimizations X O O O
strength-reduce X O O O
rerun-cse-after-loop X O O O
rerun-loop-opt X O O O
caller-saves X O O O
force-mem X O O O
peephole2 X O O O
regmove X O O O
strict-aliasing X O O O
delete-null-pointer-checks X O O O
reorder-blocks X O O O
reorder-functions X O O O
unit-at-a-time X O ? O
schedule-insns X O O O
schedule-insns2 X X X O
schedule-interblock X O ? O
sched-spec X O ? O
inline-functions X X X O
rename-registers X X X O
web X X X O
unswitch-loops X X ? O


¶ÇÇÑ CPU¿Í architecture¿¡ µû¸¥ ÃÖÀûÈ­µµ °¡´ÉÇÏ´Ù. ¿¹¸¦ µé¾î architecture¿¡ µû¶ó¼­ °¡Áú ¼ö ÀÖ´Â ·¹Áö½ºÅÍÀÇ ¼ö°¡ ´Þ¶óÁú ¼ö Àִµ¥, À̸¦ Àß ÀÌ¿ëÇϸé Á»´õ ÃÖÀûÈ­µÈ ½ÇÇàÆÄÀÏÀ» ¸¸µé ¼ö ÀÖ´Ù.

CPUÀÇ Á¾·ù´Â -mcpu=<CPU name>, architecture´Â -march=<architecture ŸÀÔ> À¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. architecture¿¡´Â ix86(i386, i486, i586), Pentiumx(pentium, pentium-mmx, pentiumpro, pentium2, pentium3, pentium4), athlon(athlon, athlon-tbird, athlon-xp, opteron)µîÀÌ ¿Ã ¼ö ÀÖ´Ù. architecture¸¦ ÁöÁ¤ÇØ ÁÙ°æ¿ì Á»´õ ¼¼¹ÐÇÑ ÃÖÀûÈ­°¡ °¡´ÉÇϰÚÁö¸¸, ºñ±³Àû ÃÖ½ÅÀÇ ¾ÆÅ°ÅØÃ³ ŸÀÔÀÔÀ» ÁöÁ¤ÇÒ °æ¿ì ÁÖÀÇ ÇØ¾ß ÇÑ´Ù. -march=i386 À¸·Î ÃÖÀûÈ­ÇÑ ÄÚµåÀÇ °æ¿ì i686 ¿¡¼­µµ ¹®Á¦¾øÀÌ µ¹¾Æ°¡°ÚÁö¸¸, -march=i686À¸·Î ÃÖÀûȭȯ ÄÚµå´Â ¿À·¡µÈ CPU¿¡¼­ ÀÛµ¿ÇÏÁö ¾ÊÀ» ¼öµµ Àֱ⠶§¹®ÀÌ´Ù.

8.1 °ü·Ã¹®¼­

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.