본문 바로가기
임베디드 개발/펌웨어

ELF 파일 포맷

by eteo 2022. 12. 2.

ELF 포맷의 Section 구성

 

1. Text Segment(=Code Segment)

ELF Header : Zero Offset에서 시작하며 파일에 대한 정보를 포함한다.

.init : 프로그램 진입 포인트(Entry Point) 실행 이전에 먼저 실행되는 코드가 있는 섹션. main 함수 이전에 프로세스 초기화를 진행하는 코드가 있는 공간이다.

.text : 기계어로 변환된 프로그램 코드가 존재하는 공간이다.

.rodata : Read-Only 데이터를 의미하며, const, printf, switch case 문에 의한 Jump Table 등이 존재한다.

 

2. Data Segment

.data : 초기값이 있는 전역변수와 static 변수들이 있는 공간이다.

.bss : 초기값이 없는 전역변수와 static 변수들이 있는 공간이다.

 

3. Symbol Table

.symtab : Symbol Table Section, 소스코드에서 참조되는 심볼들의 이름과 주소가 정의되어 있다. 다른 파일에서 참조되는 심볼의 경우에는 심볼 테이블 내에 심볼이 존재하지 않는다.

.rel.text : Relocatable Text Section, 불완전한 데이터의 주소나 코드의 메모리 참조주소가 위치한다. 링커가 실행가능한 오브젝트 파일을 만들기 위해 여러 소스파일들을 묶을 때 필요하다.

.rel.data : Relocatable data Section, 불완전한 심볼들의 메모리 참조주소가 위치한다. 마찬가지로 링커가 실행가능한 오브젝트 파일을 만들기 위해 여러 소스파일들을 묶을 때 필요하다.

  

4. Debug Info

.debug : 컴파일러 -g 옵션에 의해 생성되는 Debug Symbol Table이며, 디버깅 심볼들이 포함된다.

.line : .text에 들어있는 기계어 코드와 실제 C코드 라인넘버에 대한 매핑 정보이며디버거 프로그램이 이 정보를 참조한다.

.strtab : .debug에서 사용하는 코드 데이터가 포함된다.

 

 

컴파일러에 따라서는 데이터를 RW, ZI, RO 세가지 형태로도 구분한다.

 

RW : Read-Write, 초기값이 설정되어 있는 전역변수, static 변수. .data 섹션과 유형의 속성이 같다.

 

ZI : Zero-Initialized, 초기값이 0인 전역변수 또는 프로그램 실행시에 0으로 초기화되는 전역변수그리고 프로그램에 의해 Stack, Heap 메모리에 공간을 할당받는 지역변수. .bss 섹션과 유형의 속성이 같다.

 

RO : Read-Only, 수정이 불가능한 코드, const 전역변수. .text, .rodata 섹션과 유형의 속성이 같다

 

 

RW '초기값'을 가지고 있는 데이터이므로 ROM 메모리에 저장하되, '변수'로써 사용하기 위해서 프로그램 실행시에 수행되는 스타트업 코드(Startup Code)에서 RAM 메모리로 불러와 사용한다.

 

ZI는 초기값으로 0을 가지고 있는 변수들이므로 굳이 ROM에 저장하지 않아도 된다. 스타트업 코드를 수행하면서 0으로 초기화하여 RAM 메모리로 불러와 사용한다.

 

RO는 변하지 않아야 하는 데이터이므로, 시스템의 상태에 관계없이 데이터가 유지될 수 있도록 ROM 메모리에 저장한다. ROM에 직접 접근하여 데이터를 읽거나, RAM으로 복사하여 사용한다.

 

 

출처 : https://blog.naver.com/techref/222221877148

'임베디드 개발 > 펌웨어' 카테고리의 다른 글

CAN 통신 ] PCAN 사용하기  (2) 2022.12.22
정수 리터럴 뒤에 접미사 UL을 붙이는 이유  (0) 2022.12.14
심볼  (0) 2022.12.02
오브젝트 파일 .o .obj  (0) 2022.12.02
컴파일 과정  (0) 2022.12.02