2018. 11. 7. 00:48ㆍARM
ELF(Executable and Linking Format)
Object File에는 주요한 3 타입이 있다.
- Re-locatable file
: executable file 또는 shared object file을 생성하기 위해서 다른 object file 들과 linking하기 위한 유용한 code와 data를 가지고 있다.
- Executable file
: 실행을 위한 유용한 program을 가지고 있다.
- Shared object file
: 두 context들에서 linking을 위한 유용한 code와 data를 가지고 있다. 첫째, link editor가 다른 object 파일을 생성하기 위해서 다른 re-locatable와 shared object file들과 함께 이것을 처리한다. 두번째, dynamic linker는 process image를 생성하기 위해서 executable file과 다른 shared object file을 함께 이것을 조합한다.
assembler 또는 compiler 그리고 link editor에 의해 생성될때, object file은 processor에서 직접 실행하기위한 목적의 program들의 binary이다. 다른 abstract machine들을 필요로 하는 program들은 제외되어진다.
File Format
Object file은 program linking(프로그램을 빌드할때)과 program execution(프로그램을 실행할때)에 관여한다. 편의와 효율성을 위해서 object file format은 file의 content들의 병렬 보기를 제공한다. 아래 그램은 object file의 구성을 보여준다.
Linking view
ELF Header |
Program Header Table optional |
Section 1 |
... |
Section n |
... |
... |
Section Header Table |
Execution view
ELF Header |
Program Header Table |
Segment 1 |
Segment 2 |
... |
Section Header Table optional |
ELF header는 시작에 존재하고 file의 구성을 설명하기 위한 road map을 가지고 있다. section은 linking view를 위한 object file 정보의 bulk를 가지고 있다.(instructions, data, symbol table, relocation information, 기타 등등)
Program header table(만약 존재한다면)은 process image가 어떻게 생성되는지를 시스템에게 알려준다. Process image(프로그램을 실행)를 빌드하기위해 사용되는 파일들은 Program header table을 가져야한다. re-locatable file들은 이것을 필요로 하지 않는다.
모든 section은 table에서 entry를 가지며, 각 entry는 section name, section size, 등등과 같은 정보가 주어진다. linking동안 사용되는 파일들은 section header 파일들을 가져야하고 다른 object 파일들은 이것을 가지거나 가지지 않을 것이다.
*위 그림에서 ELF header 이후에 바로 program header table, section들에 따르는 section header table을 나타내고 있을지라도 실제 파일들은 다르다. 더욱이 section들과 segment들은 특정한 순서가 없으며, 오직 ELF 파일만이 파일에 고정된 위치를 가진다.
----------------------------------------------------------------------------------------------------------------
Special Sections.
ELF에서 여러 Section들은 이미 정의 되어져있고 프로그램과 제어 정보를 가지고 있다. 이러한 Section들은 OS(Operating system)에서 사용되어지고, 다른 OS를 위해서 다른 형태와 속성를 가진다.
Executable file들은 Linking 단계를 통해 개개의 Object file과 Library들로 부터 생성되어진다. Linker는 다른 Object file들 사이에 Reference들을 분석하고 Object file들에서 완전한 Reference들을 조정한다. 그리고 instruction들을 재배치한다.
Linking과 Loading 단계는 Object file들에 정의된 정보를 필요로하며, .dynamic과 같은 특정 Section에 이 정보를 저장한다.
각 OS는 일련의 Linking 모델들을 지원한다. 이것은 두 카테고리로 분류된다.
- Static. 일련의 Object file들, System Library들 그리고 Library archive들은 정적으로 묶여진다. Reference들은 분석되어지고 완전히 필요한 것을 완비한 Executable file은 생성되어진다.
- Dynamic. 일련의 Object file, library, system shared resource 그리고 shared library들은 executable을 생성하기 위해서 함께 연결되어진다. 이 Executable이 load되어 질 때, 다른 shared resource와 dynamic library들은 성공적으로 동작하기위해서 프로그램을 위한 시스템에서 이용가능하게 만들어져야만 한다.
동적으로 Link된 Executable file을 위한 실행 시간에서 Reference들을 분석하기 위해서 사용되는 일반적인 방법은 OS에 의해서 사용되어지는 Linkage 모델에 설명되어진다. 그리고 이 Linkage 모델의 실제 구현은 Processor-specific component들을 포함 할 것이다.
여기에는 또한 .debug와 .line 그리고 .bss, .data, .data1, .rodata 그리고 .rodata1을 포함하는 Program control을 지원하는 Section이 있다.
.bss - 이 Section은 프로그램의 메모리 이미지에 배포하는 초기화되지 않은 데이터를 가지고 있다. 정의에 따라서 시스템은 프로그램이 동작을 시작할때 0과 함께 데이터를 초기화한다. 이 Section은 SHT_NOBITS Section Type에 의해서 나타나는 것과 같이 File공간을 차지하지 않는다.
.comment - 이 Section은 버전 제어 정보를 가지고 있다.
.data와 .data1 - 이러한 Section들은 프로그램의 메모리 이미지에 배포하는 초기화된 데이터를 가지고 있다.
.debug - 이 Section은 Symbolic debugging을 위한 정보를 가지고 있다. 이러한 컨텐츠들은 상세화 되어있지 않다. 접두사 .debug를 가진 모든 Section name들은 나중에 사용하기 위해서 예약되어있다.
.dynamic - 이 Section은 dynamic linking information를 가지고 있으며, SHF_ALLOC와 SHF_WRITE와 같은 속성을 가진다.
OS와 프로세서는 SHF_WRITE가 설정되었는지를 결정한다.
.hash - 이 Section은 Symbol hash table을 가지고 있다.
.line - 이 Section은 Symbolic debugging을 위한 라인 번호 정보를 가지고 있다. 이것은 소스 프로그램과 머신 코드 사이간의 일치를 표시한다. 컨텐츠들은 상세화되어 있지 않다.
.note - 이 Section은 format에서 정보를 가지고 있다.
.rodata와 .rodata1 - 이러한 Section은 프로세스 이미지에서 쓸수없는 세그먼트세 일반적으로 배포되는 읽기 전용 데이터를 가지고 있다.
.shstrtab - 이 Section은 Section name을 가지고 있다.
.strtab - 이 Section은 거의 공통적으로 오직 symbol table entry와 관련된 name을 표현하는 문자열을 가지고 있다. 만약 파일이 Symbol string table을 포함하는 load가능한 세그먼트를 가진다면, 이 Section의 속성은 SHF_ALLOC bit를 포함할 것이다. 반대라면 이 bit는 off 일 것이다.
.symtab - 이 Section은 Symbol table을 가진다. 만약 이 파일이 Symbol table을 포함하는 load 가능한 세그먼트를 가진다면, 이 Section의 속성은 SHF_ALLOC bit를 포함할 것이다. 아니라면 이 bit는 Off 일 것이다.
.text - 이 Section은 프로그램의 text 또는 Executable instruction들을 가진다.
dot(.)을 가진 Section name은 System을 위해서 예약되어 있다. 어플리케이션은 System section과 충돌을 피하기 위해서 접두사 없이 name을 사용한다. Object file은 같은 이름을 가진 section이 하나 이상을 가질 것이다.