JINTBEAT Design Life

ELF(Executable and Linkable Format) 이란? 본문

🖥️ - ARM

ELF(Executable and Linkable Format) 이란?

jintbeat_design 2026. 4. 12. 01:19
반응형
ELF란 ?

 

ELF = 실행파일 포맷 (프로그램이 메모리에 올라가기 위한 설계도)

Executable and Linkable Format이다.

 

왜 ELF가 필요하나 ?

 

우리가 C 코드를 작성하면 흐름은 다음과 같다.

 

.c → (compile) → .o → (Link) → ELF

 

여기서 ELF는 단순히 코드가 아니라, 이 코드를 메모리에 어떻게 배치해서 실행할 지의 정보까지 포함한 파일이다.

 

ELF 내부 구조

 

ELF는 크게 3가지로 나뉜다.

 

1. ELF Header

2. Program Header

3. Section들

 

ELF Header

 

"이 파일이 뭔지 설명"

- 32bit / 64bit

- ARM / x86

- entry point(시작 주소)

 

Section (실제 데이터)
Section 의미
.text 코드
.rodata 읽기 전용 데이터
.data 초기값 있는 변수
.bss 초기값 없는 변수

 

.text = 실행 코드

.rodata = const (printf 문자열 등)

.data = RAM에 올라갈 초기 값

.bss = 0으로 초기화

 

Program Header

> 부트할 때 실제로 쓰는 정보

OS나 Bootloader가 이걸 보고 이 Section을 어디 메모리에 올릴까?를 결정함.

 

실제 동작 흐름 (임베디드 기준)

 

1. ELF 생성

main.c → main.elf

 

2. 부트 과정

EX) Flash에 ELF있음, CPU Reset

 

3. 로딩

Bootloader or FSBL이 ELF를 보고 

.text → 실행 메모리

.data → RAM 복사

.bss → 0으로 초기화

 

4. 실행

ELF Header에 있는 entry point로 jump

 

보통 : 

_reset → startup code → main()

 

내 디버깅 경험과 연결

 

왜 .rodata를 DDR로 보내면 printf 깨질 까?

이유는 ELF 구조 때문이다.

1) printf 문자열 → .rodata

2) linker에서 .rodata → DDR

 

근데, DDR init전에 접근하면 → 쓰레기 값을 읽음 → printf 깨진다

그래서, .rodata → OCM / SRAM or DDR Init 후에 사용해야한다!

 

Section vs Segment (많이 헷갈리는 부분)
개념 용도
Section 컴파일/링크용
Segment 실행용

 

Section = 개발자 관점

Segment = CPU / 부트 관점

 

ELF에서 가장 중요한 3가지

 

1. Entry Point → 어디서 실행을 시작할까?

2. Section 배치 → .text, .data, .bss

3. Memory mapping (Linker Script) → Flash / RAM / DDR 어디로 ?

실제 파일 확인 방법 

 

리눅스나 툴에서 :

readelf -h main.elf
readelf -S main.elf
readelf -l main.elf

-h : 헤더

-s : Section

-l : Segment

 

ELF는 "코드 + 데이터 + 메모리 배치 정보 + 실행 시작 주소"를 모두 포함한 완성된 실행 파일

 

*************************************************************

이 글은 ChatGPT 질의 응답을 바탕으로 작성되었습니다.

*************************************************************

반응형

'🖥️ - ARM' 카테고리의 다른 글

SPI - 기본 개념 (CPOL / CPHA)  (0) 2026.05.16
Barrel Shifter란?  (0) 2026.04.15
Linker - (2)  (2) 2026.04.09
Linker - (1)  (0) 2026.04.09
ARM I2C 응용 - EEPROM(ATmel) 동작 분석  (1) 2025.08.13