Bare metal C Ch03 빌드과정 GNU툴체인 - Hongjayeong-02/Basic_SoC_implementation GitHub Wiki

Ch03. 빌드 과정과 GNU ARM Toolchain

목표
STM32CubeIDE의 Build 버튼 뒤에서 실제로 일어나는 과정을
전처리 → 컴파일 → 어셈블 → 링킹 → 이미지 생성 순서로 직접 이해한다.

현재 자료 기준 안내
Notion에는 Ch03을 build.sh로 단계별 실행한 학습 기록이 정리되어 있다.
다만 현재 첨부한 bare-metal 실습코드.zip에는 별도의 Ch03 폴더나 build.sh 파일은 포함되어 있지 않다.
따라서 이 페이지의 명령어와 결과는 Notion 학습 기록을 기준으로 정리하고, 실습 소스는 Ch02의 실제 main.c를 사용한다.


1. 왜 Build 과정을 나눠서 봐야 하는가

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 → 메모리 배치/링커스크립트 문제


2. 단계별 정리

단계 | 입력 | 출력 | 대표 명령 | 역할 -- | -- | -- | -- | -- 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의 여러 단계를 연속으로 실행한 결과다.


14. 이 챕터에서 배운 점

  • Build 과정이 단계별로 어떤 파일을 만드는지 이해했다.

  • C 코드가 Assembly와 machine code로 변환되는 흐름을 확인했다.

  • .o, .elf, .hex의 역할 차이를 구분했다.

  • Linker가 단순 파일 결합이 아니라 실제 메모리 주소 배치까지 담당한다는 것을 확인했다.

  • 다음 Ch04에서 Linker Script와 Startup code를 직접 작성하기 위한 기반을 만들었다.

⚠️ **GitHub.com Fallback** ⚠️