새소식

공부/시스템

gcc 컴파일러란?

  • -

GCC 컴파일러란?


GCC 컴파일러의 특징

  • C, C++, Objective-C, Fortran, Ada 등을 포함한 다양한 프로그래밍 언어를 위한 무료 오픈 소스 컴파일러다.
  • Linux 및 Unix 커뮤니티에서 널리 사용되며 Windows와 같은 다른 운영 체제에서도 사용할 수 있다.
  • 높은 수준의 최적화와 x86, ARM 및 PowerPC를 포함한 광범위한 플랫폼 및 아키텍처를 지원한다.
  • 다양한 디버깅 및 프로파일링 도구를 지원하므로 코드의 버그를 쉽게 식별하고 수정할 수 있다.

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

GCC 컴파일러가 소스 코드를 실행 파일로 만들기까지 4가지 단계를 거친다.

[ *.c -> (*.i) -> (*.s) -> (*.o) -> excutable ]

  1. 전처리 단계
  2. 컴파일 단계
  3. 어셈블 단계
  4. 링크 단계

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

1. 전처리 단계

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

전처리기 지시자란?

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

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

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

전처리 과정 수동 실행 방법 :

gcc -E main.c -o main.i

2. 컴파일 단계

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

gcc -S main.c

3. 어셈블 단계

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

gcc -c main.c

4. 링크 단계

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

gcc -o main main.c func.c

 


아래 옵션은 위에서 사용한 옵션들이다.

-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로 설정한다.

출처 : https://80000coding.oopy.io/d5fa7c87-192f-4c68-95eb-aa4af5b9dbf5

 

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

목차

80000coding.oopy.io

 

'공부 > 시스템' 카테고리의 다른 글

DLL 이란?  (0) 2023.03.09
어셈블리 핸드레이 및 함수 구조  (0) 2023.03.09
컴퓨터 메모리 구조  (0) 2023.03.09
아키텍처의 정의와 종류 별 특징  (0) 2023.03.09
고급언어, 저수준 언어  (0) 2023.03.09
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.