TIL/2025

링커 스크립트 분석 5단계

고무 오리 2025. 4. 24. 00:43
728x90
📢 linker script, 어떻게 분석해야하나 막막해서 방법을 알아봤어요

 

 

링커 스크립트는 프로그램의 각 코드와 데이터를 메모리 어디에 어떻게 배치할지 지휘하는 설계도에요

아래 5단계를 토대로 링커 스크립트를 분석해봐요

 

 

1단계: “ 이 MCU의 메모리 지도를 보자”

MEMORY {} 블록을 먼저 봐요

MEMORY {
  ROM (rx)  : ORIGIN = 0x00000000, LENGTH = 512K
  RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}

 

이게 바로 칩의 메모리 지도

 

  • ROM은 읽기 전용
  • RAM은 자유롭게 읽고 쓸 수 있는 공간

여기서 각 영역의 주소와 크기를 먼저 이해해야, 섹션 배치가 어디로 가는지 따라갈 수 있어요.

 

 

2단계: “무엇을 어디에 둘 것인가?”

그 다음 SECTIONS {} 블록을 봐요

블록 내용은 아래와 같이 채워요

.text : { *(.text) } > ROM
.data : { *(.data) } > RAM AT > ROM
.bss  : { *(.bss) }  > RAM
  • .text는 코드 데이터를 의미하며 ROM에 로드
  • .data는 초기값 있는 전역 변수를 의미하며 최초에는 ROM에 존재하나 RAM에서 실행
  • .bss는 0으로 초기화되는 변수이며 RAM에 로딩하여 실행

 

 

3단계: “중요한 위치는 기록해둬야지”

심볼(_sdata_edata)들을 체크해봐요

SECTIONS {
  ...
  
  .data : {
    _sdata = .;
    *(.data)
    _edata = .;
  } > RAM AT > ROM

  ...
}

 

부트 코드가 이 정보를 기반으로 memcpy, memset을 실행해요

즉, "초기화해야 할 범위가 어디부터 어디까지냐"는 걸 알려주는 북마크 역할을 하죠

 

 

4단계: “짐은 한 곳에 있지만, 사용할 때는 다른 데서”

AT > ROM 구조를 주의 깊게 살펴 봐요

.data : { *(.data) } > RAM AT > ROM

 

초기값은 ROM에, 실제 실행은 RAM에서 해요

"복사해서 쓰는 거구나" 한 번 깨닫고 나면 심플해져요.

 

 

5단계: “어디서부터 실행될까?”

ENTRY(_start) 를 확인해요

ENTRY(_start)

 

프로그램이 시작할 정확한 지점을 링커에게 알려줘요

 

 

 

 

링커 스크립트는 "물리 메모리 위에 프로그램이라는 퍼즐을 맞추는 작업"이에요.

지도를 보고, 퍼즐 조각을 읽고, 위치를 계산하고, 진입점을 지정하는 순서로 분석하죠

728x90