ELF 란 용어를 많이 들어보셨을텐데요, ELF는 Executable and Linking Format의 약어입니다. UNIX / LINUX 기반에서 사용되는 실행 및 링킹 파일 포맷입니다. 지난 글에 이어 이번 글에서는 ELF 파일 포맷에서 Program Header에 대해 알아보겠습니다.
[이전 글]
2018/08/27 - [Linux/Debugging & Testing] - [ELF] Executable and Linking Format - ELF Header
- Program Header
Program Header의 시작위치와 각 Program Header의 사이즈와 개수가 ELF Header 정보에 나와있네요. 그럼 ELF Header 정보를 확인하여 Program Header를 분석할 수 있을 것 같습니다. Program Header에는 어떤 정보들이 있는지 먼저 구조체로 확인해보죠.
Program Header에는 어떤 내용들이 있는지 옆에 주석을 보면 조금 파악이 됩니다. Segment 타입, 플래그, 오프셋 정보부터 가상 주소, 물리 주소 등이 있네요. 그럼 readelf로 이 정보들이 어떻게 표시되는지 한번 보시죠.
구조체에서 본 내용들이 보기 좋죠 정리되어 있습니다. Type에는 PHDR, INTERP, LOAD, DYNAMIC 등이 있고 Offset과 VirtAddr 등이 16진수로 나타나네요. 각 정보에 대해 하나씩 살펴보기전에 아래쪽을 살펴보니 Section to Segment Mapping이라고 표기된 정보들이 있습니다. 섹션들이 세그먼트 내에 위치하고 있습니다. 세그먼트와 섹션에 대한 내용은 앞 글에서 다뤘으니 살펴보시기 바랍니다. 하나만 살펴보면 GNU_EH_FRAME Segment에는 .note.ABI-tag, .note.gnu.build-id 란 섹션이 존재하네요!
그럼 이제 각 Segment의 각 타입에 대해 정의하고 넘어가겠습니다.
PHDR
INTERP
위의 정보를 보면 알 수 있듯이 INTERP의 Offset은 파일 시작으로 부터 0x238위치였습니다. 그럼 그 위치에 정보를 살펴보면 정말 문자열로 이름이 저장되어 있네요.
LOAD
NOTE
DYNAMIC
GNU_EH_FRAME / GNU_STACK / GNU_RELRO
마지막으로 하나 더 말씀드리면, Object 파일들은 Program Header 정보가 없습니다.
Object는 Section만을 가지고 있으며 Linking 과정 중 Section 정보들이 ELF파일 내 Segment들에 위치하게 되기 때문입니다. 아래 처럼 Object 파일은 ELF Header를 살펴보면 Program Header 정보들이 모두 0으로 존재하지 않음을 알 수 있습니다 :D
다음 글에서 Section Header와 관련된 정보들을 살펴보겠습니다. 감사합니다.
[참고자료]
Tool Interface Standards – Portable Formats Specification, Version 1.1
Self-Service Linux , MarkWilding and Dan Behman
How To Write Shared Libraries, Ulrich DrepperLinking, Randy Bryant and Dave O’Hallaron
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
http://man7.org/linux/man-pages/man5/elf.5.html
http://egloos.zum.com/recipes/v/5010841
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
https://en.wikipedia.org/wiki/Weak_symbol
'Linux > Debugging & Testing' 카테고리의 다른 글
[ELF] Stripping an ELF object (0) | 2018.09.09 |
---|---|
[ELF] Sections and the Section header table (0) | 2018.09.07 |
[ELF] ELF Header (0) | 2018.08.27 |
[커널분석] Architecture 별 분석을 위한 설정 (ctags & cscope) (0) | 2018.08.21 |
[gdb] The GNU Debugger : 3. Stack 정보 분석하기 (0) | 2018.08.15 |