////
Search

GCC(GNU Compiler Collection)

GCC란?

GNU Compiler Collection
유닉스 / 리눅스 계열 플랫폼의 사실상 표준 컴파일러
GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러
원래는 C만을 지원했던 컴파일러로, GNU C 컴파일러가 본명이었지만, 나중에 여러 언어를 컴파일할 수 있게 되면서 GCC가 됐음

GNU란?

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

컴파일러란?

컴파일(Compile) : 어떤 언어의 코드를 다른 언어로 바꿔주는 과정
원시 코드에서 목적 코드로 옮기는 과정
원시 코드(소스코드) : 원래 문서
목적 코드 : 출력된 문서
주로 다른 프로그램이나 하드웨어가 처리하기 용이한 형태로 출력되지만, 사람이 읽을 수 있는 문서 파일이나 그림 파일 등으로 옮기는 경우도 존재
EX : C언어 코드 → 기계어
컴파일러(Compilor) : 특정 프로그래밍 언어로 쓰여진 소스 파일을 다른 언어로 바꿔주는 번역기 (언어 번역 프로그램)
고급 프로그래밍 언어를 실행 프로그램으로 만들기 위해 저급 프로그래밍 언어로 바꾸는 데 사용

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

4단계 : 전처리, 컴파일, 어셈블, 링크
gcc hello.c 명령어를 입력하면 4단계를 거쳐 실행 파일 생성(각 단계의 파일들은 임시 파일로 생성되었다가 사라짐)

1. 전처리 단계

전처리기(Preprocessor)를 통해 소스 파일 내 전처리기 지시자를 처리
소스 코드 파일(.c)을 전처리된 소스 코드 파일(.i)로 변환하는 과정
주석 제거, 헤더 파일 삽입, 매크로 치환 및 적용

전처리기 지시자란?

# 으로 시작하고 세미콜론 없이 개행문자로 종료되는 라인
#include (헤더 파일 삽입) : 지정된 특정 파일의 내용을 해당 지시자가 있는 위치에 삽입
#define (매크로 치환 및 적용) : 매크로 함수 및 상수 정의에 사용. 코드 내의 해당 상수를 프로그래머가 정의한 문자열로 대체
# 전처리 과정 실행 gcc -E main.c -o main.i
Shell
복사

2. 컴파일 단계

컴파일러(Compiler)를 통해 전처리된 파일.i 확장자 파일로부터 어셈블리어로된 파일.s 확장자를 가진 파일을 생성
일반적으로 컴파일하면 생각하는 언어 문법 검사
Static한 영역(Data, BSS 영역)들의 메모리 할당 수행
데이터 영역 vs BSS 영역
전역 변수 vs 정적 변수
# 컴파일 과정 실행 gcc -S main.i -o main.s
Shell
복사

어셈블리어란?

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

3. 어셈블 단계

어셈블리어 파일 .s 확장자 파일을, 기계어로 된 오브젝트 파일 .o 확장자 파일로 변환(= 컴퓨터가 읽을 수 있는 0과 1로 이뤄진 2진수 코드로 변환)
# 어셈블 과정 실행 gcc -c main.s -o main.o
Shell
복사

4. 링크 단계

작성한 프로그램이 사용하는 다른 프로그램이나 라이브러리를 가져와 연결하는 과정
그 결과, 실행 가능한 파일 생성
# 링크 단계 gcc main.o -o main
Shell
복사
참고 자료