01. GCC

지수호·2023년 2월 3일
0

C언어 공부

목록 보기
2/4
post-thumbnail

GCC

GCC는 GNU Complier Collection이라고 했었다.
그러면 실제 컴파일러는 뭐고 GCC의 역할이 뭔지 알아보자!


실제로 돌려보자!

// hello.c
#include <stdio.h>
int main(){
	printf("hello!!\n");
    return 0;
}
$ gcc hello.c
  • hello.c 소스를 작성하고 커맨드 라인에서 위의 명령줄을 입력해본다.
  • 윈도우 환경에선 a.exe, 리눅스 환경에선 a.out 파일이 생성되었을 것이다.
윈도우
$ a.exe
리눅스
$ .\a.out

D:\Workspace\cpp\01.cmake>a.exe
hello!!

  • 위와 같은 결과를 얻을 수 있다


사실은...

GCC는 전처리, 컴파일, 어셈블, 링크 4단계를 거쳐서 실행파일을 만들어준다.

1. 전처리 단계

컴퓨터 과학에서 전처리기(前處理器) 또는 프리프로세서(preprocessor), 프리컴파일러(precompiler)는 입력 데이터를 처리하여 다른 프로그램에 대한 입력으로서 사용되는 출력물을 만들어내는 프로그램이다. 여기서 출력물이란 전처리된 형태의 입력 데이터를 말하며 컴파일러와 같은 차후 프로그램들에 쓰인다. 처리할 양과 종류는 전처리기의 본성에 따라 다르며 어떠한 전처리기들은 상대적으로 단순한 문자 치환 및 매크로 확장만 할 수 있는 반면 다른 전처리기들은 성숙한 프로그래밍 언어의 기능을 하기도 한다. - 위키백과

말이 복잡하다... 간단히 표현하자면??

컴파일러가 컴파일을 할 수 있도록 컴파일 준비 작업을 해주는 것이다
이때 전처리 지시자를 처리한다.

전처리 지시자란?
#으로 시작되고 문장끝에 세미콜론을 사용하지 않는 라인을 의미한다.

전처리 지시자기능
#include프로그램의 외부 파일을 불러옴
#define매크로 상수/함수를 정의
#undef정의한 매크로 취소
#undef조건부 컴파일

이외에도 위키에 정말 자세하게 설명되어있다.

$ gcc -E hello.c -o hello.i

해당 명령줄을 입력하면 전처리 과정이 실행되고 hello.i 파일이 생길 것이다.

-E 옵션 : 전처리 과정의 결과를 화면에 보이는 옵션
-o 옵션 : 결과파일의 파일명을 정하는 옵션

E옵션을 지우고 아래 명령줄을 실행한다면 hello.i 파일을 열어볼 수 없을 것이다.

$ gcc hello.c -o hello.i

2. 컴파일 단계

컴파일의 정의는 이전 글에서 알아봤으니 간단하게 넘어가겠다.
컴파일 과정 실행 *.c -> (*.i) -> *.s

$ gcc -S hello.c

어셈블리어로 된 hello.s 파일이 생겼다.

-S 옵션 : cc1으로 전처리된 파일을 어셈블리 파일로 컴파일까지만 수행하고 멈춘다.

3. 어셈블 단계

어셈블러 (Assembler) 가 어셈블리어를 기계어로 바꿔주는 단계이다.
어셈블 과정 실행 *.c -> (*.i) -> (*.s) -> *.o

기계어란?
기계어는 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어를 통틀어 일컫는다. 기계어는 프로그램을 나타내는 가장 낮은 단계의 개념이다. 기계어는 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어를 통틀어 일컫는다. 기계어는 프로그램을 나타내는 가장 낮은 단계의 개념이다.

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

$ gcc -c hello.c

-c 옵션 : as에 의한 어셈블까지만 수행하고 링크는 수행하지 않는다.

4. 링크 단계

하나의 프로그램은 오프벡트 파일과 공용 라이브러리로 조합이 되어 하나의 프로그램이 된다.
컴퓨터가 실행할 수 있는 프로그램을 만드는 작업을 링킹이라고 한다.
링크 단계 *.c -> (*.i) -> (*.s) -> (*.o) -> excutable

드디어 실행파일이 나오는 단계까지 왔다.

$ gcc -o hello.exe hello.c
$ .\hello.exe
hello!!

실제로 이제 실행하고 결과를 확인할 수 있는 exe 파일이 생성된 것이다!



마무리

이번에는 gcc의 사용과 컴파일 과정을 알아보았다.

이 글에서 예시로 들었던 코드들은 소스 파일도 하나고 복잡하지 않아서 명령줄이 간단했다.

하지만 헤더도 많아지고 컴파일을 자주 하다보면 이 과정들이 굉장히 귀찮을 것이다.

이것을 해결해줄 수 있는 것이 make이다. Makefile 을 통해 일련의 과정들을 명령어 하나만으로 사용할 수 있게 해준다.

다음 글에서는 Makefile에 대하여 알아볼 예정이다!



참조
https://ko.wikipedia.org/wiki/GNU_%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC_%EB%AA%A8%EC%9D%8C
https://80000coding.oopy.io/d5fa7c87-192f-4c68-95eb-aa4af5b9dbf5
http://seamless.tistory.com/2
http://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-2.html#ss2.1

profile
지수호

0개의 댓글