그라운드 임베디드 유튜브 구독

노트 / 기계어와 어셈블리

링커 스크립트와 섹션

.text, .rodata, .data, .bss가 Flash와 RAM의 어디에 놓이는지 정하는 파일. 맵 파일과 함께 읽는 법.

GROUND EMBEDDED · 정리 노트기계어 06링커 스크립트와 섹션 1MEMORY { 2 FLASH (rx) : ORIGIN = 0x08000000, LE… 3 RAM (rwx) : ORIGIN = 0x20000000, LE… 4}

섹션

섹션 내용 위치
.isr_vector 벡터 테이블 Flash 맨 앞
.text 코드 Flash
.rodata const 데이터, 문자열 Flash
.data 초기값 있는 전역 변수 RAM (초기값은 Flash)
.bss 초기값 없는 전역 변수 RAM
스택, 힙 RAM

링커 스크립트 (.ld)

MEMORY {
  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 512K
  RAM   (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}
SECTIONS {
  .text : { *(.isr_vector) *(.text*) *(.rodata*) } > FLASH
  .data : { *(.data*) } > RAM AT > FLASH
  .bss  : { *(.bss*) } > RAM
}

> RAM AT > FLASH가 ".data는 RAM에서 실행되지만 초기값은 Flash에 저장"이라는 뜻입니다.

쓰는 경우

  • 부트로더와 앱을 나눌 때 앱의 FLASH ORIGIN을 옮김
  • 빠른 함수를 RAM이나 CCM에 배치: __attribute__((section(".ramfunc")))
  • 설정값 저장용 Flash 섹터를 코드 영역에서 빼 둠

맵 파일

빌드 결과의 .map 파일에서 각 함수와 변수의 주소와 크기를 볼 수 있습니다. Flash가 부족하면 맵 파일에서 큰 것부터 찾습니다. printf의 부동소수점 지원이 수십 KB를 차지하는 경우가 흔합니다.