오늘 알아볼 것
- GCC 컴파일러는 대체 뭐하는 물건일까?
- 저 컴파일러 알아보면서 나온 .so, .a, .o, .c파일은 대체 뭘까? (중간에 섞듯이 쓸 예정)
목차
- 열어가는 글
- GCC란?
- 컴파일 과정
-
열어가는 글.
이 gcc. 1학년때 컴공개론과 code block이라는 프로그램을 쓰면서 많이 들어봤던 이름이다.
그때 내가 듣기로는 여러가지 장점이 많았던거로 기억한다.
오늘은 이 gcc가 뭔지, 그리고 여기서 배우면서 나오는 여러 파일들에 대해 살펴보는 시간을 가지도록 하겠다.
GCC란?
- GCC는 GNU 컴파일러 모음(GNU Compiler Collection)의 약자다. - GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러다.
GNU는 또 뭔가?
- GNU's not UNIX의 재귀 약자로, 리처드 스톨먼이라는 사람이 각종 자유 소프트웨어들이 돌아가고 번영 할 수 있는 기반 생태계를 구축하기 위해 시작한 프로젝트라고 한다.
컴파일러는 또 뭔가?
- 컴파일(compile)자체의 뜻을 먼저 알아야 하는데, 어떤 언어의 코드를 다른 언어로 바꿔주는 과정을 말한다.
- 여기서 컴파일러는? 어떤 프로그래밍 언어로 쓰여진 소스 파일을 다른언어로 바꿔주는 일종의 번역기다.
- 어셈블러하고 궤를 같이하는 느낌?
여기서 우리가 봐야할 것은 컴파일 과정이다.
컴파일 과정
먼저 컴공개론때 배웠던 지식으로 보자면, 아래와 같은 사진과같이 c언어는 컴파일 과정을 가진다고 했다.
위의 사진을 보면 알 수 있다싶히 c언어를 기준으로 컴파일 과정은 4가지 단계를 거쳐서 실행된다고 할 수 있다.
이제 이 4가지 단계에 대해 알아볼것이다.
1. 전처리(Pre-processing) 과정
- 전처리기(preprocessor)를 통해 소스코드 파일(파일이름.c)에서 전처리된 파일(파일이름.i)로 변환하는 과정.
여기서 이뤄지는 작업
- 주석 제거
- 헤더 파일 삽입
- 여기서 #include와 같은 전처리 지시문을 만나면 해당하는 헤더 파일을 찾아 헤더 파일에 있는 모든 내용을 복사 해서 소스코드에 삽입하게 된다고 한다.
- 헤더 파일에 선언된 함수 원형은 후에 링킹 과정을 통해 실제로 함수가 정의되어있는 오브젝트 파일과 결합된다 고 한다.
- 매크로 치환 및 적용
- #define과 같은 지시문에 정의된 매크로를 저장하고 같은 문자열을 만나면 #define된 내용으로 치환한다고 한 다.
2. 컴파일(Compilation) 과정
- 컴파일러(Compiler)를 통해 전처리된 파일(파일이름.i)에서 어셈블리어 파일(파일이름.s)로 변환하는 과정.
여기서 컴파일러는 프론트엔드 - 미들엔드 - 백엔드 단계로 구성되어있다고 한다.
1. 프론트엔드(Front-end)
- 언어의 종속적인 부분을 처리하는 곳.
- 소스코드가 해당 언어로 올바르게 작성되어었는지 확인하는 곳.
2. 미들엔드(Middle-end)
- 미들엔드는 아키텍텨에서의 비종속적인 최적화를 수행한다고 한다.
- CPU 아키텍처가 무엇이든간에 상관없이 할 수 있는 최적화라고 한다.
여기서 비 종속적인 최적화는 어떤게 있는지 나중에 알아볼 예정..
3. 백엔드(Back-end)
- 아키텍쳐의 종속적인 최적화를 수행한다.
- 아키텍쳐 특성에 따라 최적화를 수행한다.
= 아무리 같은 기능을 수행하는 명령이어도 CPU 아키텍처별로 더욱 효율적인 명령어로 대체해서 성능을 높이 는 작업을 하는게 종속적인 최적화...
3. 어셈블리(Assembly) 과정
- 어셈블러(Assembler)를 통해 어셈블리어 파일(파일이름.s)을 오브젝트 파일(파일이름.o)로 변환하는 과정.
오브젝트 파일(Object File)?
- 사람들이 알아볼 수 없는 기계어로 작성된 코드.
++ 오브젝트 코드로 구성된 파일.
이 오브젝트 파일은 특정한 파일 포맷을 가진다고 한다.
- Windows : PE(Portable Excutable)
- Linux : ELF(Executable and Linkin Format)
4. 링킹(Linking) 과정
- 링커(Linker)를 통해 오브젝트 파일(파일이름.o or.obj)을 싸그리 싺싺 묶어서 실행파일(.exe)로 만드는 과정.
이 과정에서 오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크해서 하나의 파일로 만든다고 한다.
정리.
- 컴파일 과정은 총 4단계로 이뤄진다.
- 전처리과정 -> 컴파일과정 -> 어셈블리 과정 -> 링킹과정
여기서 많은 파일의 포맷을 볼 수 있다.
그러면 GCC 컴파일러는 뭘까?
저 컴파일 과정에서 쓰는 컴파일러중 하나인데, GNU 프로젝트의 일환으로 개발되서 널리 쓰이고 있는 컴파일러다.
GCC 컴파일러의 수행 구조.
출처 및 참고 -
https://80000coding.oopy.io/d5fa7c87-192f-4c68-95eb-aa4af5b9dbf5
[GCC] GCC 컴파일러 개념 정리
목차
80000coding.oopy.io
https://velog.io/@dhwltnoooh/gcc-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC
gcc 컴파일
프로그래밍 언어 = 고급언어(high-level language) e.g. JAVA, C, Python, etc.컴퓨터 언어 = 기계 언어(machin language) e.g. 0, 1 개발자가 작성한 프로그래밍 언어를 컴퓨터가 해석 할 수 있도
velog.io
--> 정말 많은 참고와 출처가 담긴 엄청나게 정리를 잘한 블로그.... 저도 한번에 이해가 되었네요..
'System & Reversing' 카테고리의 다른 글
BoF(buffer overflow)에 대한 고찰 (0) | 2023.03.26 |
---|---|
x86 / x64 레지스터에 대한 고찰. (0) | 2023.03.20 |
dll파일에 대한 간단한? 고찰. (0) | 2023.03.13 |
어셈블리 핸드레이에 관한 고찰. (0) | 2023.03.13 |
함수 프롤로그, 에필로그에 대한 간단한 고찰. (0) | 2023.03.13 |