가상머신에서 C언어 파일 컴파일 과정

2017. 10. 12. 21:36SystemHacking/System

 

 

가상머신 VMware에서 C언어 파일을 컴파일 해서 실행파일로 만드는방법에 대해서 알아보겠습니다

간단히 말하자면, C언어 파일을 만든뒤 컴파일하면 끝입니다

아래는 C언어 파일입니다 ( #vi hello.c )

 

유닉스 운영체제에서 무료로 제공되는 컴파일러 gcc 를 사용하겠습니다

#gcc hello.c -o hello

-o ( output ) 옵션 : 출력파일명 = hello

 

file 명령어를 통해서 해당 파일의 종료를 확인할 수 있습니다

hello 라는 실행파일이 생성되었고, 실행시킬 수 있습니다

 

gcc를 이용해서 쉽게 C언어 파일을 실행파일로 컴파일 하였습니다

컴파일 되어지는 과정에 대해서 알아보겠습니다

 

[ 컴파일 과정 ]


1> 전처리 과정

hello.c -> hello.i

include, define 처리

 

2> 컴파일 과정

-> hello.s ( 어셈블 형태 )

 

3> 어셈블러 과정

-> hello.o ( 바이너리파일, 0 과 1 )

 

4> 링킹 과정

-> hello

실행에 필요한 라이브러리파일들과 연결시켜준다 ( = 혼자서 실행가능한 실행파일이 생성된다 )

 

 

#gcc hello.c -o hello -v

v 옵션을 통해서 컴파일 과정을 볼 수 있다

 

#gcc hello.c -o hello -save-temps

-save-temps 옵션을 통해서 컴파일 과정에서 생성되어 지는 파일들을 삭제 하지 않게 할 수 있습니다

 

hello.i 파일 ( 전처리 과정뒤에 생성되는 파일 , define이나 include를 처리 후 생성되는 파일 )

 

hello.c -> [ 전처리 ] -> hello.i -> [ 컴파일 ] -> hello.s -> [ 어셈블리 ] -> hello.o -> [ 링킹 ] -> hello

 

 

[ 컴파일러 과정 ]

Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs

gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cpp -lang-c -v -undef -D__GNUC__=2 -D__GNUC_MINOR__=91 -D__ELF__ -Dunix -Di386 -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__i386__ -D__linux__ -D__unix -D__i386 -D__linux -Asystem(posix) -Asystem(unix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__tune_i386__ hello.c hello.i
 // 전처리 과정
 // cpp 사용

GNU CPP version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
 /usr/i386-redhat-linux/include
 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include
 /usr/include
End of search list.
 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cc1 hello.i -quiet -dumpbase hello.c -version -o hello.s
 // 컴파일 과정

 // cc1 사용

GNU C version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release) (i386-redhat-linux) compiled by GNU C version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release).
 as -V -Qy -o hello.o hello.s
 // 어셈블리 과정
 // as 사용

GNU assembler version 2.9.5 (i386-redhat-linux) using BFD version 2.9.5.0.22
 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/crtbegin.o -L/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66 -L/usr/i386-redhat-linux/lib hello.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/crtend.o /usr/lib/crtn.o
 // 링킹 과정
 // collect 사용