Linux

ELF 바이너리 파일 포맷 구조

chbae 2023. 4. 18. 18:33
728x90
반응형

ELF(Executable and Linkable Format) 바이너리 포맷은 유닉스/리눅스에서 가장 흔히 사용하는 파일 포맷이다.

1. ELF 바이너리 포맷 구조

 

  • Program header table: 재배치 불가능한 ELF object (ex, 실행 바이너리)
  • Section header table: 재배치(relocation) 가능한 object (object 파일)

2. ELF 헤더

ELF 헤더에는 어디서부터 어디까지가 program/section header인지에 대한 정보가 들어있다. readelf -h [ELF object] 명령을 실행하면 아래와 같이 헤더 정보를 읽을 수 있다.

 

위는 so 파일이고 object 파일일 경우 program header가 0으로 설정이 된다.

3. program header table

최종 실행 바이너리에는 반드시 program header table이 존재해야 한다. 여기에는 시스템 로더(exec system call)에 제공할 정보를 담고 있다. 즉 이 table의 어느 부분을 메모리로 로드해 프로세스를 만들 것인가에 대한 정보를 담고 있는 것이다.

 

 

위의 그림 처럼 readelf -l [ELF binary] 명령을 보면 type 부분에 LOAD라고 적혀 있는 곳이 메모리에 로드될 segment(시스템 로더 프로그램을 보는 단위)이다.

4. section header table

이 곳은 section & segment 영역이 어디서부터 어디까지 이며 특징은 어떤지에 대한 정보를 담고 있다. 이 table은 object (*.o) 파일 같이 relocation 가능한 ELF object에는 반드시 있어야 한다.

위의 그림 처럼 readelf -S [ELF object]를 보면 각 section에 대한 정보가 들어 있다. Type에 PROGBITS는 프로그램에서 정의된 section임을 의미한다. 각 section의 내용은 objdump -s [ELF object]의 명령을 보면 알 수 있다.

Reference

728x90