Choi Kyeong Min Report

GCC

GCC란?

GCC는 GNU 컴파일러 모음 (GNU Compiler Collection)의 약자이다. GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러이다.

**GNU란?**

GNU는 GNU’s not UNIX 의 재귀약자로, 리처드 스톨먼이 각종 자유 소프트웨어들이 돌아가고 번영할 수 있는 기반 생태계를 구축하기 위해 시작한 프로젝트이다.

**컴파일러란?**

컴파일(Compile)은 어떤 언어의 코드를 다른 언어로 바꿔주는 과정을 말한다. 예를 들어, 사람이 인식하고 이해할 수 있는 C언어 코드를 컴퓨터가 이해할 수 있는 기계어로 바꿔주는 것이다.

즉, 컴파일러(Compiler)는 어떤 프로그래밍 언어로 쓰여진 소스 파일을 다른 언어로 바꾸어주는 번역기이다.

소스 코드가 실행 파일이 되는 과정

소스 코드를 실행 파일로 만들기 위해 네 가지 단계를 거친다.

  • 전처리 단계
  • 컴파일 단계
  • 어셈블 단계
  • 링크 단계

gcc hello.c 명령어를 입력하면 네 가지 단계를 거쳐서 실행 파일이 생성되지만, 각 단계의 파일들은 임시 파일로 생성되었다가 사라진다.

image

**1. 전처리 단계**

전처리기가 소스 파일 내의 전처리기 지시자를 처리한다.

**전처리기 지시자란?**

#으로 시작하고 세미콜론 없이 개행문자로 종료되는 라인을 의미한다.

  • #include : 지정된 특정 파일의 내용을 해당 지시자가 있는 위치에 삽입
  • #define : 매크로 함수 및 상수 정의에 사용한다. 코드 내의 해당 상수를 프로그래머가 정의한 문자열로 대체한다.

전처리 단계를 거치면 소스 파일 hello.c 에서 확장 소스 파일인 hello.i 가 생성된다.

# 전처리 과정 실행
gcc -E main.c -o main.i

**2. 컴파일 단계**

전처리된 파일인 hello.i 로부터 어셈블리어로 된 파일인 hello.s 파일을 생성한다.

# 컴파일 과정 실행 [ *.c -> (*.i) -> *.s ]
gcc -S main.c

**어셈블리어란?**

기계어보다 한 단계 위에 있는 언어이며, 기계어와 함께 단 두 가지 뿐인 저급 언어에 속한다. 기계어는 컴퓨터 관점에서 바로 읽을 수 있지만, 인간이 사용하기 불편한 언어이기 때문에 이를 보완하기 위해 등장한 것이 어셈블리어이다.

**3. 어셈블 단계**

어셈블리어 파일 hello.s 를 기계어로 된 오브젝트 파일 hello.o 파일로 변환한다. 즉, 컴퓨터가 읽을 수 있는 0과 1로 이루어진 2진수 코드로 변환하는 것이다.

# 어셈블 과정 실행 [ *.c -> (*.i) -> (*.s) -> *.o ]
gcc -c main.c

**4. 링크 단계**

image (1)

링크 단계는 작성한 프로그램이 사용하는 다른 프로그램이나 라이브러리를 가져와서 연결하는 과정이다. 그 결과로 실행 가능한 파일을 생성한다. (hello.o → hello)

# 링크 단계 [ *.c -> (*.i) -> (*.s) -> (*.o) -> excutable ]
gcc -o main main.c func.c
서브목차