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
복사
참고 자료



