본문 바로가기
IT 일반, 컴퓨터

[컴퓨터 구조] ELF 파일 포맷 및 구성요소에 대해 알아보자

by jjongday 2024. 4. 6.
반응형

ELF (Executable and Linking Format) 에 대해 알아보자.

 

ELF는 실행 파일, 목적 파일, 공유 라이브러리 그리고 코어 덤프를 위한 표준 파일 형식이다. ELF 형식은 주로 유닉스 및 유닉스 계열 운영체제에서 사용되며, ELF 파일은 여러 섹션으로 구성되어 있다. 각 섹션은 프로그램의 코드, 데이터, 심볼 테이블, 디버그 정보 등을 포함하며, 실행 가능한 프로그램 또는 공유 라이브러리에 대한 링크 정보도 포함하고 있어, 실행 파일과 라이브러리가 서로 상호작용하고 정상적으로 실행될 수 있도록 한다. ELF 파일 형식은 프로그램 개발 및 실행에 중요한 역할을 한다.

 

ELF 포맷의 Section 구성

 

 

 

1. Text Segment (Code Segment)

Text Segment 계층에는 ELF Header, .init, .text, .rodata 섹션의 유형이 있다. 이들은 수정이 불가능한 코드이며, 변하지 않아야 하는 데이터이므로, 시스템의 상태에 관계없이 데이터가 유지될 수 있도록 ROM 메모리에 직접 접근하여 데이터를 읽고, 저장된다. 


ELF Header : Zero Offset (0x00) 에서 시작하며 파일에 대한 정보를 포함한다. 프로그램 메모리 레이아웃을 정의하지 않는다. 즉, 프로그램 실행에 필수 요구 정보는 아니다. -> 섹션 헤더 테이블이 없어도 정상 동작이 가능하다.

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

.text : 기계어로 변환된 프로그램 코드가 존재하는 공간이다. 코드 섹션으로 프로그램 코드 명령어가 저장된다.

.rodata : Read-Only 데이터를 의미하며, const, printf, switch case 문에 의한 Jump Table 등이 존재한다. 읽기 전용 데이터 섹션으로 문자열 등이 저장된다. 

 

.plt : Procedure Linkage Table 의 약자이며, 동적 링커가 공유 라이브러리에서 import한 함수를 호출하기 위한 정보가 담긴다. 이 정보에는 코드가 포함되어 있다. 
 

2. Data Segment

Data Segment 계층에는 주로 .data, .bss 섹션의 유형이 있다. 프로그램 실행시에 수행되는 스타트업 코드(Startup Code)에서 RAM 메모리로 불러와 사용한다.​ 

 

.data : 초기값이 있는 전역변수와 static 변수들이 있는 공간이다. 초기화된 전역 변수 등의 데이터를 저장한다.

.bss : 초기값이 없는 전역변수와 static 변수들이 있는 공간이다. 초기화 되지 않은 전역 대이터를 저장한다. 디스크 상에서는 섹션의 존재를 나타내기 위해 4바이트만 크기를 차지하지만, 프로그램이 로드될 때 원래의 크기를 갖고 0으로 초기화된 값으로 채워져 할당/정렬되어 실행된다.

 

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에서 사용하는 코드 데이터가 포함된다.

 

 

 

모빌진에서 .map 파일을 열어보면 아래와 같이 요약되어 보여주기도 한다.

.map파일 내 Image Summary

반응형