컴파일 과정에 대해 알아보겠습니다. (참고 https://www.it-note.kr/263)
1. 전처리(PreProcessing): 전처리 단계(main.c => main.i)
이 과정은 전처리 과정으로 컴파일 이전에 헤더("#include")에서 필요한 부분을 가져오거나 "#define"을 치환하는 작업을 수행합니다. 소스코드는 ".c"에서 ".i"로 파일을 생성합니다.
내부 내용은 아래와 같이 바뀌며 키워드에 따른 해석은 아래와 같습니다.
"#": 컴파일러에서 무시하는 주석이며 참조되는 자료의 위치를 표기합니다.
명령여: gcc -E ./main.c
2. Compile(컴파일) 단계: 어셈블리 코드 생성(main.i=>main.s)
전처리가 끝난 코드를 기반으로 어셈블리 소스코드를 생성합니다. 여기서 생성되는 어셈블리어들은 CPU 또는 OS에 맞는 문법으로 생성됩니다.
* 어셈블리 종류
- GAS(GNU Assembler), MASM(Microsoft Macro Assembler), NASM(Netwide Assembler)
명령어: gcc -S main.c
3. Assemble 단계: 기계어 코드 생성(main.s->main.o)
생성된 어셈블리 파일을 기계어로 변경한 오프젝트 파일로 생성합니다. 오브젝트 파일을 봤더니 벌써 ELF(?) 링크 단계에서 실행파일(ELF)을 만들줄 알았는데…??
명령어: gcc -O main.c
그래서 파서로 Import 테이블을 확인해보았더니 비어 있는 것을 볼 수 있었다. 그래서 어셈블단계는 단순히 어셈블리를 기계어로 바꾸는 과정이 아니라 실행파일(ELF)의 껍데기도 함께 만들어주는 과정으로 확인하였다.
4. Linking 단계(최종): 라이브러리 코드 연결(main.o->a.out)
- 이 단계에서 오브젝트 파일은 프로그래머가 작성한 코드에 대한 어셈블리만 존재할뿐 "printf"나 "scanf"와 같은 코드는 존재하지 않습니다. 따라서 이단계는 앞 과정에서 만들어진 오브젝트 파일에서 라이브러리 함수코드를 연결(임포트)하는 단계라는 것을 확인할 수 있었습니다.
'Programming > C++' 카테고리의 다른 글
[C++] 상황에 따른 cast 방법 정리 (0) | 2023.01.14 |
---|---|
[C++] 스마트포인터와 사용법(unique_ptr, shared_ptr, weak_ptr, auto_pt) (0) | 2023.01.14 |
[C++] std::string 클래스 사용법 (0) | 2023.01.12 |
[C++] static 메소드 (0) | 2023.01.03 |
_CRT_SECURE_NO_WARNINGS(C4996)원인 해결 방법 (0) | 2022.12.28 |
댓글