Linuxias
Developer's Delight
Linuxias
  • Category
    • AI
      • Deep Learning
      • Machine Learning
      • Data Science
      • Framework
      • MLOps
      • Paper-Review
      • Tips
    • Android
      • Kotlin
      • Component
      • Compose
      • Compose UI
      • Material
      • Testing
    • Software Architecture
      • Architecture Pattern
      • Design Pattern
      • Requirement Engineering
    • Linux
      • Compile & Link
      • Command & Tool
      • Container
      • Debugging & Testing
      • Profiling
      • Kernel Analysis
      • Server
      • Shell Script
      • System Programming
    • Language
      • Carbon
      • C,C++
      • C#
      • Java
      • Python
    • ETC
      • Data Struct | Algorithm
      • git
      • Security
    • Book
    • 경제공부
      • 세금
      • 부동산
hELLO · Designed By 정상우.
Linuxias

Developer's Delight

[ELF] Segment와 Program Header
Linux/Debugging & Testing

[ELF] Segment와 Program Header

2018. 8. 29. 22:53
반응형

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 Table은 ELF내의 Segment들에 대한 정보와 그 Segment들을 메모리에 어떻게 로드해야 하는지에 대한 정보가 포함되어 있습니다. Segment란 앞 선 글에서도 설명하였지만 다시 한번 말씀드리면 동일한 메모리 속성(read-only, writable, ...)을 가진 하나 또는 그 이상의 섹션의 집합입니다. 여러 개의 Segment들이 존재할테고 각 Segment들에 대한 정보를 가지고 있는 녀석이 있을텐데요, 그 정보가 명시된 곳이 Program Header입니다. readelf로 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

Programe Header 정보 자기 자신에 대한 Segment입니다. Offset과 Siz 등을 살펴보면 ELF Header정보에 들어있던 내용과 같음을 알 수 있습니다.

  • INTERP

INTERP Segment는 프로그램 인터프리터의 이름만을 가지고 있는 Segment입니다. 
아래 /lib64/ld-linux-x86-64.so.2라고 인터프리터 이름이 문자열로 나타나는 것 보이시나요? 정말 저 메모리 위치에 저렇게 저장되어 있는지 살펴보면 아래와 같습니다. 

위의 정보를 보면 알 수 있듯이 INTERP의 Offset은 파일 시작으로 부터 0x238위치였습니다. 그럼 그 위치에 정보를 살펴보면 정말 문자열로 이름이 저장되어 있네요. 


  • LOAD

LOAD Segment는 로드할 수 있는 프로그램 Segment 입니다. 섹션을 다시 살펴보면 .intrp, .dynsym, .dynstr 등 다양한 섹션들이 존재하는데요. 메모리에 로드될 수 있는 섹션들이 모여있습니다. 그런데 왜 LOAD란 이름이 두개일까요? 2개의 Segment는 같은 이름을 가지고 있지만 다른 메모리 속성을 가지고 있습니다. Segment는 각각의 메모리 속성을 가진 Section들의 그룹이라고 앞 글에서 설명했던 것 기억나시나요? 자세히 Flags 정보를 보시면 RE와 RW로 속성이 다릅니다. 그 말은 읽고 실행할 수 있는 영역과 읽고 쓸수만 있는 영역이란 것을 의미합니다.

  • NOTE

Array 요소들은 보조적인 정보들의 위치와 크기가 저장되어 있습니다.

  • DYNAMIC

DYNAMIC Segment는 동적 링킹에 사용되는 세그먼트입니다. 자세한 내용은 나중에 다시 다루기로 하겠습니다. 지금은 말 그대로 프로그램 실행 중에 동적으로 링크되는 녀석들, 공유라이브러리 같은 놈들에 관련된(?) 것인가 추측만 하고 지나가셔도 됩니다.

  • GNU_EH_FRAME / GNU_STACK / GNU_RELRO

Vendor-specific한 정보들을 위한 매우 특별한 세그먼트들입니다.

여기까지 간단히 각 세그먼트들에 대해 알아보았는데요, 세그먼트는 다시 말씀드리지만 동일한 메모리 속성을 가진 섹션들의 집합입니다. 좀 더 자세히 이해하려면 섹션들에 대한 내용을 살펴봐야겠네요. 섹션에 관련된 내용은 다음 글에서 다룰 예정입니다.


마지막으로 하나 더 말씀드리면, 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
    'Linux/Debugging & Testing' 카테고리의 다른 글
    • [ELF] Stripping an ELF object
    • [ELF] Sections and the Section header table
    • [ELF] ELF Header
    • [커널분석] Architecture 별 분석을 위한 설정 (ctags & cscope)
    Linuxias
    Linuxias
    I want to be a S/W developer who benefits people.

    티스토리툴바