| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- asynchronous fifo
- keynote 사용법
- booth algorithm
- keynote 도형 복사
- ISR
- Cortex-M3
- SPI mode
- i2c
- LEC
- LinkedList
- Sync FIFO
- booth multiplier 설계
- 비동기 FIFO 구조
- keynote 도형 회전
- Keynote 표
- 자료구조
- cadence conformal eco
- Async FIFO
- c
- C언어
- ARM
- booth multiplier
- 연산 가속기 설계
- malloc
- BSS
- keynote
- 곱셈기 설계
- FIFO 설계
- lec check
- ACK Polling
- Today
- Total
JINTBEAT Design Life
ELF(Executable and Linkable Format) 이란? 본문
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 |