ch@e
article thumbnail

 

GCC(GNU Compiler Collection)

직역하면 GNU 컴파일러 모음으로, GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러이다.

즉, 각종 프로그래밍 언어 소스를 컴파일 하기 위한 컴파일러 기능 제공 환경이다. 

지원 프로그래밍 언어로 C, C++, Objective C, Fortran, Pascal, Ada, Java 등

 

 

GNU(GNU's not UNIX)

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

 

 

컴파일러

어떤 언어의 코드를 다른 언어로 바꿔주는 과정을 이야기한다. 즉 어떤 프로그래밍 언어로 쓰여진 소스 파일을 다른 언어로 바꾸어주는 번역기이다. 

 

컴파일 과정

컴파일 과정(https://80000coding.oopy.io/d5fa7c87-192f-4c68-95eb-aa4af5b9dbf5)

 

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

 

전처리 단계

전처리기를 통해 소스코드 파일(*.c)을 전처리된 파일(*.i)으로 변환하는 과정 

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

전처리기 지시자: #으로 시작하고 세미콜론 없이 개행문자로 종료되는 라인

헤더 파일 삽입: #include 지시문을 만나면 해당하는 헤더 파일을 찾아 헤더 파일에 있는 모든 내용을 복사해서 소스코드에 삽입한다.지정된 특정 파일의 내용을 해당 지시자가 있는 위치에 삽입. 즉, 헤더 파일은 컴파일에 사용되지 않고 소스 파일 내에 전부 복사된다. 

매크로 치환 및 적용: #define 지시문에 정의된 매크로를 저장하고 같은 문자열을 만나면 #define된 내용으로 치환한다. 매크로 함수 및 상수 정의에 사용하는 #define문, 코드 내의 해당 상수를 프로그래머가 정의한 문자열로 대체. 즉, 매크로 이름을 찾아서 정의한 값으로 전부 바꿔준다.

 

컴파일 단계

컴파일러를 통해 전처리된 파일(*i)을 어셈블리어 파일(*.s)로 변환하는 과정

 

어셈블 단계

어셈블러를 통해 어셈블리어 파일(*.s)을 오브젝트 파일(*.o)로 변환하는 과정

오브젝트 파일이란? 사람이 알아볼 수 없는 기계어로 작성된 코드

 

링크 단계

링커를 통해 오브젝트 파일(*.o)을 묶어 실행 파일로 만드는 과정

이 과정에서 오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일로 만든다

 

 

 

gcc 컴파일 옵션

-o [파일명] [*.c] : 지정한 파일명으로 실행 파일을 저장한다.
                           ex) gcc -o result.out main.c
-E : 전처리 단계를 수행한 후, 컴파일 과정을 거치지 않는다.
      실행 결과는 standard output에 출력된다
.
-S : 컴파일 단계를 수행한 후, 어셈블 과정을 거치지 않는다.
      실행 결과로 어셈블리어로 변환된 *.s 파일이 생성된다.
-c [파일명] [*.c] : 소스 코드를 컴파일 또는 어셈블하며, 링크를 하지 않는다.
                            파일명으로 오브젝트 파일을 생성한다.
                            ex) gcc -c ft_isalnum.c
-I (대문자i) [디렉토리명] : 디렉토리명에서 헤더 파일을 검색한다.
-l (소문자L) [라이브러리] : 라이브러리 파일과 링크한다. 접미사나 확장자(.a/.o)가 없어도 링크한다.
                                           ex) 라이브러리 파일이 libmath.a 일때 다음과 같이 작성 gcc myfile.c -lmath -o myfile
-L [디렉토리명] : 디렉토리 내에서 라이브러리 파일을 찾는다.
-D [매크로상수명]=[값] : 매크로 상수를 정의하기 위한 옵션이다.
                                        ex) gcc -D BUFFER_SIZE=42 : BUFFER_SIZE 라는 매크로 상수의 값을 42로 설정한다.

 

 

 

파일

.so 공유라이브러리를 의미한다.
.a 정적라이브러리를 의미한다. 
.o 컴파일 어셈블 단계를 거친  컴파일된 오브젝트 파일을 의미한다.
.c c언어의 소스 코드 파일을 의미한다. 

 

'System & Reversing 필기' 카테고리의 다른 글

x86, x64 레지스터  (0) 2023.03.18
어셈블리어 명령어 정리  (0) 2023.03.12
DLL  (0) 2023.03.12
어셈블리 핸드레이, 함수 프롤로그와 에필로그  (0) 2023.03.11
컴퓨터 메모리 구조  (0) 2023.03.11
profile

ch@e

@ch@e

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그