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
'TIL > 2025' 카테고리의 다른 글
| assembly 파일 분석 방법 (1) | 2025.04.24 |
|---|---|
| 멀티코어 환경 section offset 기반 복사 & 재매핑 패턴 (0) | 2025.04.24 |
| 주요 Compile Extension & Builtin Function 예시를 알아보자 (1) | 2025.04.23 |
| Compiler Extension & Builtin Function (0) | 2025.04.22 |
| 티스토리 기본 에디터에 inline code 추가 하기 (0) | 2025.04.21 |