Bare metal C Ch03 빌드과정 GNU툴체인 - Hongjayeong-02/Basic_SoC_implementation GitHub Wiki
목표
STM32CubeIDE의Build버튼 뒤에서 실제로 일어나는 과정을
전처리 → 컴파일 → 어셈블 → 링킹 → 이미지 생성 순서로 직접 이해한다.
현재 자료 기준 안내
Notion에는 Ch03을build.sh로 단계별 실행한 학습 기록이 정리되어 있다.
다만 현재 첨부한bare-metal 실습코드.zip에는 별도의Ch03폴더나build.sh파일은 포함되어 있지 않다.
따라서 이 페이지의 명령어와 결과는 Notion 학습 기록을 기준으로 정리하고, 실습 소스는 Ch02의 실제main.c를 사용한다.
IDE에서 Build 버튼을 누르면 한 번에 끝나는 것처럼 보이지만, 실제 내부 과정은 여러 단계로 나뉜다.
main.c
│
├─ 1. Preprocessing
▼
main.i
│
├─ 2. Compilation
▼
main.s
│
├─ 3. Assembly
▼
main.o
│
├─ 4. Linking
▼
firmware.elf
│
├─ 5. Image conversion
▼
firmware.hex / firmware.bin
이 흐름을 알면 다음과 같은 오류가 어느 단계의 문제인지 구분하기 쉬워진다.
#define,#include관련 문제 → 전처리 단계C 문법/타입 오류 → 컴파일 단계
어셈블리 문법 오류 → 어셈블 단계
undefined reference→ 링킹 단계region ... overflowed→ 메모리 배치/링커스크립트 문제
단계 | 입력 | 출력 | 대표 명령 | 역할 -- | -- | -- | -- | -- Preprocessing | .c | .i | gcc -E | #include, #define 전개 Compilation | .i | .s | gcc -S | C → ARM Assembly Assembly | .s | .o | gcc -c | Assembly → Object code Linking | .o | .elf | gcc -T linker.ld | Object 파일 결합 + 주소 배치 Image conversion | .elf | .hex, .bin | objcopy | Flash에 쓸 이미지 추출
IDE의 Build 버튼은 하나의 마법 버튼이 아니라 GNU Toolchain의 여러 단계를 연속으로 실행한 결과다.
Build 과정이 단계별로 어떤 파일을 만드는지 이해했다.
C 코드가 Assembly와 machine code로 변환되는 흐름을 확인했다.
.o,.elf,.hex의 역할 차이를 구분했다.Linker가 단순 파일 결합이 아니라 실제 메모리 주소 배치까지 담당한다는 것을 확인했다.
다음 Ch04에서 Linker Script와 Startup code를 직접 작성하기 위한 기반을 만들었다.