Search
Duplicate

[GCC] GCC 컴파일러 개념 정리

간단소개
코드를 작성하고 실행 결과를 확인하기 위해 사용하는 gcc, 어떤 과정을 거쳐서 실행 프로그램을 만드는 지 정리한 글입니다.
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
gcc
Scrap
태그
기초지식
9 more properties
목차

GCC란?

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

GNU란?

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

컴파일러란?

컴파일(Compile)은 어떤 언어의 코드를 다른 언어로 바꿔주는 과정을 말한다. 예를 들어, 사람이 인식하고 이해할 수 있는 C언어 코드를 컴퓨터가 이해할 수 있는 기계어로 바꿔주는 것이다.
즉, 컴파일러(Compiler)는 어떤 프로그래밍 언어로 쓰여진 소스 파일을 다른 언어로 바꾸어주는 번역기이다.

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

소스 코드를 실행 파일로 만들기 위해 네 가지 단계를 거친다.
전처리 단계
컴파일 단계
어셈블 단계
링크 단계
gcc hello.c 명령어를 입력하면 네 가지 단계를 거쳐서 실행 파일이 생성되지만, 각 단계의 파일들은 임시 파일로 생성되었다가 사라진다.

1. 전처리 단계

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

전처리기 지시자란?

# 으로 시작하고 세미콜론 없이 개행문자로 종료되는 라인을 의미한다.
#include : 지정된 특정 파일의 내용을 해당 지시자가 있는 위치에 삽입
#define : 매크로 함수 및 상수 정의에 사용한다. 코드 내의 해당 상수를 프로그래머가 정의한 문자열로 대체한다.
전처리 단계를 거치면 소스 파일 hello.c 에서 확장 소스 파일인 hello.i 가 생성된다.
# 전처리 과정 실행 gcc -E main.c -o main.i
Bash
복사

2. 컴파일 단계

전처리된 파일인 hello.i 로부터 어셈블리어로 된 파일인 hello.s 파일을 생성한다.
# 컴파일 과정 실행 [ *.c -> (*.i) -> *.s ] gcc -S main.c
Bash
복사

어셈블리어란?

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

3. 어셈블 단계

어셈블리어 파일 hello.s 를 기계어로 된 오브젝트 파일 hello.o 파일로 변환한다. 즉, 컴퓨터가 읽을 수 있는 0과 1로 이루어진 2진수 코드로 변환하는 것이다.
# 어셈블 과정 실행 [ *.c -> (*.i) -> (*.s) -> *.o ] gcc -c main.c
Bash
복사

4. 링크 단계

링크 단계는 작성한 프로그램이 사용하는 다른 프로그램이나 라이브러리를 가져와서 연결하는 과정이다. 그 결과로 실행 가능한 파일을 생성한다. (hello.o → hello)
# 링크 단계 [ *.c -> (*.i) -> (*.s) -> (*.o) -> excutable ] gcc -o main main.c func.c
Bash
복사

GCC 컴파일 옵션

-o [파일명] [*.c] : 지정한 파일명으로 실행 파일을 저장한다. ex) gcc -o result.out main.c -E : 전처리 단계를 수행한 후, 컴파일 과정을 거치지 않는다. 실행 결과는 standard output에 출력된다. -S : 컴파일 단계를 수행한 후, 어셈블 과정을 거치지 않는다. 실행 결과로 어셈블리어로 변환된 *.s 파일이 생성된다. -c [파일명] [*.c] : 소스 코드를 컴파일 또는 어셈블하며, 링크를 하지 않는다. 파일명으로 오브젝트 파일을 생성한다. ex) gcc -c ft_isalnum.c -I [디렉토리명] : 디렉토리명에서 헤더 파일을 검색한다. -l [라이브러리] : 라이브러리 파일과 링크한다. 접미사나 확장자(.a/.o)가 없어도 링크한다. ex) 라이브러리 파일이 libmath.a 일때 다음과 같이 작성 gcc myfile.c -lmath -o myfile -L [디렉토리명] : 디렉토리 내에서 라이브러리 파일을 찾는다. -D [매크로상수명]=[값] : 매크로 상수를 정의하기 위한 옵션이다. ex) gcc -D BUFFER_SIZE=42 : BUFFER_SIZE 라는 매크로 상수의 값을 42로 설정한다.
Plain Text
복사
-c : 옵션은 링크를 하지 않고 컴파일만 진행한다. 이 옵션을 생략하면 main 함수를 찾을 수 없다는 오류가 출력된다.
$ gcc ft_isalnum.c # 오류 발생 Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Bash
복사

참고자료

GNU [나무위키]
컴파일러 [나무위키]
gcc 컴파일 옵션 정리 [티스토리, 참 놀라운 세상]
어셈블리어 [나무위키]