개요
리눅스 기반 OS의 기본 바이너리 파일은 ELF(Executable and Linkable Format) 형식이다.
ELF 파일이 어떻게 구성되어 있는지, 어떻게 매핑되고 실행될 수 있는지 알아보자
이 포스트는 검색과 실습으로 제작되었다.
구조
ELF 파일 구조는 ELF 헤더영역, ELF 프로그램 헤더 테이블, ELF 섹션 영역, ELF 섹션 헤더 테이블로 구성된다.
- Segment : 동일한 메모리 속성(read-only, writeable 등)을 가진 하나 또는 그 이상의 섹션의 집합
- Section : 특정 정보(machine instructions, symbol table 등)를 포함하고 있는 ELF file의 작은 조각
- Symbol : ELF 파일 내 저장된 함수 또는 변수의 설명으로, 간단한 함수 또는 변수의 정보를 포함
ELF 파일 헤더 구조체 및 용도
- 명령어 :
readelf -h
또는objdump -f
- ELF 파일 헤더는 파일의 시작부분에 위치하며, 파일에 대한 전반적인 정보를 제공한다.
- 파일의 구조를 정의하는 역할을 함
주요 구조체
- e_ident(16byte): ELF 매직 넘버, 클래스(32비트/64비트), 엔디안 정보 등.
- e_type(2byte): 파일 타입 (e.g., 실행 파일, 객체 파일, 공유 라이브러리).
- e_machine(2byte): 실행 대상 아키텍처 (e.g., x86, ARM).
- e_version(4byte): ELF 형식의 버전.
- e_entry(8byte): 실행 시작 주소 (진입점).
- e_phoff(8byte): 프로그램 헤더 테이블의 오프셋.
- e_shoff(8byte): 섹션 헤더 테이블의 오프셋.
- e_flags(4byte): 프로세서 관련 플래그.
- e_ehsize(2byte): ELF 헤더의 크기.
- e_phentsize(2byte): 프로그램 헤더 엔트리 크기.
- e_phnum(2byte): 프로그램 헤더 엔트리 개수.
- e_shentsize(2byte): 섹션 헤더 엔트리 크기.
- e_shnum(2byte): 섹션 헤더 엔트리 개수.
- e_shstrndx(2byte): 섹션 이름 문자열 테이블의 섹션 인덱스.
ELF 파일 프로그램 헤더 구조체 및 용도
- 명령어 :
readelf -l
- 프로그램 헤더는 실행 시 ELF 파일이 메모리에 어떻게 매핑될지 정의한다.
- 프로그램 헤더는 실행 시 운영체제가 메모리에 파일을 로드하는데 필요한 정보를 제공, 특히 실행파일이나 동적라이브러리의 세그먼트를 정의하며, 로더가 이 정보를 참조하여 ELF 파일을 실행 준비 상태로 만듦
주요 구조체
p_type: 세그먼트 타입 (e.g., PT_LOAD, PT_DYNAMIC).
p_offset: 파일 내 세그먼트 시작 위치.
p_vaddr: 세그먼트가 메모리에 매핑될 가상 주소.
p_paddr: 물리 주소 (일반적으로 무시됨).
p_filesz: 파일에서 세그먼트의 크기.
p_memsz: 메모리에서 세그먼트의 크기.
p_flags: 접근 권한 (읽기/쓰기/실행).
p_align: 메모리 정렬 요구 사항.
ELF 파일 섹션 헤더 구조체 및 용도
- 명령어 :
readelf -S
또는objdump -h
- ELF 파일 섹션 헤더는 각 섹션에 대한 메타데이터를 담고 있다.
- ELF 파일을 구성하는 각 섹션에 대한 정보를 제공하며, 디버깅 심볼 ,문자열 테이블, 실행 코드 등 다양한 데이터를 구분하는데 사용
주요 구조체
sh_name: 섹션 이름의 오프셋.
sh_type: 섹션의 타입 (e.g., SHT_PROGBITS, SHT_SYMTAB).
sh_flags: 섹션의 속성 (읽기/쓰기/실행).
sh_addr: 섹션이 메모리에 로드되는 주소.
sh_offset: 파일 내에서 섹션 데이터가 시작되는 오프셋.
sh_size: 섹션의 크기.
sh_link: 섹션 간의 연관 정보를 나타냄.
sh_info: 추가 정보를 제공.
sh_addralign: 섹션의 정렬 요구 사항.
sh_entsize: 고정 크기 엔트리의 크기.
실습
<추가할 예정...>
꿀팁
xxd 명령어로 HxD처럼 파일을 16진수 변환해서 볼 수 있다.
objdump -d : disassemble
objdump -h : 섹션 헤더를 출력
objdump -f : 파일 헤더를 출력
objdump -x : 모든 헤더를 출력
objdump -s : 모든 콘텐츠 다 출력
objdump -S : disassemble 다 출력
끝.
'STUDY' 카테고리의 다른 글
[3주차 TIL] KnockOn Bootcamp Pre.Rev : 포켓몬 게임 제작 Project (0) | 2024.12.22 |
---|---|
[3주차 TIL] KnockOn Bootcamp Pre.Rev : 메모리 구조와 매핑 (0) | 2024.12.21 |
[3주차 TIL] KnockOn Bootcamp Pre.Rev : 링커와 로더 (0) | 2024.12.21 |
[3주차 TIL] KnockOn Bootcamp Pre.Rev : 컴파일러 (0) | 2024.12.21 |
[3주차 TIL] KnockOn Bootcamp Pre.Rev : 아키텍쳐 (0) | 2024.12.21 |