본문 바로가기
기타

map 파일과 ld(Linker) 파일 쉽게 이해하기 — ROM/RAM 영역 보는 방법

by Autosar 2026. 5. 19.
반응형

임베디드 개발을 처음 시작하면 빌드 후 생성되는 여러 파일들 때문에 당황하는 경우가 많다.

특히 AUTOSAR + Mobilgene 환경에서는 빌드 결과물로 아래와 같은 파일들이 생성된다.

 

처음에는 이런 파일들이 무엇을 의미하는지 감이 잘 오지 않는다.

특히 .map 파일을 열어보면:

 

위 처럼 알 수 없는 Section 이름들과 주소들이 매우 많이 나온다.

하지만 실제로 이 파일들은 "코드와 변수들이 MCU 메모리 어디에 저장되는지"를 보여주는 매우 중요한 파일이다.

 

실무에서는 아래와 같은 상황에서 거의 매일 보게 된다.

  • Flash Overflow 발생
  • RAM Overflow 발생
  • Stack 부족 문제
  • 전역변수 증가 분석
  • Bootloader/Application 메모리 분리 확인
  • CANape Calibration 영역 확인
  • 멀티코어 메모리 구조 확인

이번 글에서는 초보자들도 이해할 수 있도록

  • MAP 파일이 무엇인지
  • ld(Linker) 파일이 무엇인지
  • ROM과 RAM 영역은 어떻게 구분하는지
  • .text, .bss, .data 는 무엇인지
  • 실무에서는 어떤 상황에서 보는지

를 하나씩 쉽게 설명해보려고 한다.

 

MAP 파일과 ld 파일의 관계

 

먼저 가장 중요한 개념부터 이해해야 한다.

많은 초보자들이 "map 파일 = 메모리 설정 파일"이라고 생각하는데 실제로는 아니다.

두 파일의 역할은 완전히 다르다.

 

ld 파일은 메모리 배치 규칙을 정의하고,

map 파일은 실제 배치 결과를 출력한다.

 

쉽게 비유하면 ld 파일이 설계도라면, map 파일은 완성 결과물이라고 생각하면 된다.

 

즉, ld 파일에서 Flash 시작 주소. RAM 시작 주소. Stack 크기. Section 배치 위치 등을 정의하고,

빌드가 끝나면 Linker가 실제 결과를 계산해서 .map 파일로 출력한다.

 

그래서 개발자들은 ld파일과 map파일을 본다.

"메모리를 어떻게 배치할지" 볼 때는 ld 파일
"실제로 어떻게 배치되었는지" 볼 때는 map 파일

 

 

ROM과 RAM은 무엇인가?

 

MAP 파일을 보기 전에 먼저 MCU 메모리 구조를 이해해야 한다.

임베디드에서 가장 중요한 메모리는 크게 두 가지다.

 

- ROM(Flash)

- RAM(SRAM)

 

ROM은 전원이 꺼져도 데이터가 유지되는 메모리다.

여기에는 주로 함수 코드, const 데이터, Bootloader, Calibration 데이터 등이 저장된다.

 

예를 들어 아래 함수의 실행 코드는 Flash(ROM)에 저장된다.

void Motor_Run(void)
{
    MotorDrv();
}

 

반대로 RAM은 프로그램 실행 중 사용하는 메모리다.

여기에는 전역 변수, static 변수, Stack, Heap 등이 저장된다.

 

예를 들어 아래와 같은 변수는 RAM에 저장된다.

uint32 Counter;

 

실무에서는 주소만 보고도 ROM과 RAM을 구분한다.

 

예를 들면 내가 사용하고 있는 프로젝트에서는 아래와 같은 구조를 사용하고 있다.

주소 대역
0x100xxxxx Flash(ROM)
0x280xxxxx SRAM(RAM)

 

구조를 사용하고 있다.

 

그래서 MAP 파일에서 아래 이미지를 보면 0x100xxxxx이므로 Flash 영역(ROM)이라는 것을 바로 알 수 있다.


반대로 .bss는 0x280xxxxx이므로 SRAM 영역(RAM)이라는 것을 알 수 있다.

 

ld(Linker) 파일에서는 무엇을 볼까?

 

ld 파일은 메모리 배치 규칙을 정의하는 파일이다.

실제로 네 프로젝트의 ld 파일에는 아래와 같은 내용이 있었다.

MEMORY
{
  CODE_FLASH : ORIGIN = 0x10058000
  SRAM       : ORIGIN = 0x2800B000
}

 

여기서 가장 중요한 것은 ORIGIN은 시작 주소, LENGTH는 메모리 크기를 의미한다.

CODE_FLASH = ROM 시작 주소
SRAM               = RAM 시작 주소

 

그리고 아래처럼 Section을 어디에 넣을지도 정의한다.

.text : > CODE_FLASH
.bss  : > SRAM
.data : > SRAM

 

그래서 ld 파일은 "어떤 데이터를 어떤 메모리에 저장할 것인가" 를 정의하는 파일이라고 이해하면 된다.

 

MAP 파일에서 가장 중요하게 보는 Section

실제로 개발자들이 MAP 파일에서 가장 많이 보는 것은 아래 네 가지다.

.text
.rodata
.bss
.data

 

이 네 개만 이해해도 MAP 파일의 대부분을 이해한 것이다.

 

.text 영역

 

.text 는 함수 코드 영역이다.

 

예를 들어

void Main(void)
{
}

 

같은 함수들이 .text 에 저장된다.

 

MAP 파일에서는 .text 10068f40 000bc922 였다.

즉, 시작 주소는 0x10068f40 이며, 크기는 0xBC922 라는 뜻이다.

주소가 0x100xxxxx 이므로 Flash 영역에 저장된 것이다.

 

실무에서는 .text 크기가 계속 증가하면 Flash Overflow 위험을 의심한다.

 

.rodata 영역

 

.rodata 는 Read Only Data 영역이다.

즉, const 데이터가 저장되는 영역이다.

 

예를 들어

const uint8 Version[4] = {1,2,3,4};

 

같은 데이터가 들어간다.

이 역시 수정되면 안 되는 데이터이므로 Flash에 저장된다.

 

.bss 영역

 

.bss 는 초기값 없는 전역 변수 영역이다.

 

예를 들어

uint32 Counter;
static uint8 Flag;

 

이런 변수들이 저장된다.

위의 .bss 이미지를 보면 .bss 28021000 0007f6e8였는데,

크기를 계산해보면 약 522KB 정도 된다.

 

즉, 현재 프로젝트가 RAM을 상당히 많이 사용하고 있다는 의미다.

실무에서는 RAM 부족 문제가 발생하면 가장 먼저 .bss 를 본다.

 

왜냐하면 대부분의 RAM 사용량은 전역변수 때문이기 때문이다.

 

.data 영역

 

.data 는 초기값 있는 전역 변수 영역이다.

 

예를 들어

uint32 Speed = 100;

 

같은 변수다.

 

이 변수는 실행 중에는 RAM에 존재해야 하지만, 초기값 100 은 Flash에도 저장되어야 한다.

그래서 .data 는 특이하게 .ROM.data 영역에는 Flash에 초기값 저장, .data영역에는 실제 RAM 변수 구조로 동작한다.

 

부팅 시 Startup 코드가 Flash의 초기값을 RAM으로 복사한다.

초보자들이 가장 많이 헷갈리는 부분 중 하나다.

 

실무에서는 언제 MAP 파일을 볼까?

 

실제로 개발하면서 MAP 파일을 가장 많이 보는 순간은 메모리 에러가 발생했을 때다.

예를 들어 빌드 중

region SRAM overflowed

 

같은 에러가 발생하면 RAM 부족이라는 의미다.

이 경우 개발자는 MAP 파일에서 .bss영역과 .data영역의 크기를 확인한다.

 

반대로

region CODE_FLASH overflowed

 

가 발생하면 Flash 부족이다.

이때는 .text영역과 .rodata영역의 크기를 확인한다.

 

또 Stack Overflow 문제가 의심될 때는 ld 파일에서

stack_reserve = 1K

 

같은 설정을 확인한다.

 

즉, MAP 파일과 ld 파일은 단순한 빌드 결과 파일이 아니라

메모리 문제를 분석하는 핵심 파일이다.

 

정리

 

처음 MAP 파일과 ld 파일을 보면 굉장히 복잡해 보인다.

하지만 실제로는 "코드와 변수들이 MCU 메모리 어디에 저장되는가"를 보여주는 파일일 뿐이다.

 

초보자라면 우선 아래 네 개만 이해해도 충분하다.

.text
.rodata
.bss
.data

 

그리고 주소를 보고:

0x100xxxxx → ROM
0x280xxxxx → RAM

 

만 구분할 수 있어도 MAP 파일을 읽기 시작한 것이다.

 

임베디드 실무에서는 메모리 분석이 매우 중요하다.

특히 AUTOSAR 프로젝트에서는

  • RAM 사용량 증가
  • Flash Overflow
  • Stack 부족
  • Calibration 영역 분석

등을 위해 MAP 파일과 ld 파일을 자주 보게 된다.

 

처음에는 어렵게 느껴지지만, Section 의미와 주소 대역만 이해해도 훨씬 쉽게 보이기 시작한다.

반응형