ELF
최근 수정 시각: (5년 전)
분류
1. 개요 [편집]
2. 구조 [편집]
ELF 파일은 이런 구조를 가지고 있다.
ELF Header |
Program header table |
.text |
.rodata |
.data |
Section header table |
2.1. ELF header [편집]
먼저, ELF 해더 같은 경우는 실행 파일에 대한 정보를 가지고 있다. 매직넘버는 .ELF (0x7F 0x45 0x4C 0x46).
파일이 오브젝트 파일인지, 실행 파일인지, 아니면 공유 라이브러리 알려주는 데이터나, ELF 버전, 어떤 운영체제와 비트를 위해 컴파일된건지에 관해 정보가 있다.
파일이 오브젝트 파일인지, 실행 파일인지, 아니면 공유 라이브러리 알려주는 데이터나, ELF 버전, 어떤 운영체제와 비트를 위해 컴파일된건지에 관해 정보가 있다.
오프셋 | 길이 | 뜻 |
0x00 | 4 | 헤더이다. 0x7F 다음에 ELF라고 적혀있다. 틀리면 실행 안된다. |
0x04 | 1 | 비트 정보이다. 64 비트(0x02)를 위한건지, 아니면 32비트 (0x01)를 위한건지에 관한 바이트다. |
0x05 | 1 | Endianness 관한것이다. Little Endian (0x01)이거나, Big Endian (0x02) 이여야 한다. |
0x06 | 1 | 버전이다. 항상 0x01이다. |
0x07 | 1 | |
0x08 | 1 | ABI 버전. 리눅스 에서는 특별한 뜻은 없는듯 하다. |
0x09 | 7 | 사용 되고 있지 않다. |
0x10 | 2 | 현 파일이 실행 (1), 오브젝트 (2), 공유 라이브러리 (3), 아니면 코어 (4) 인지 결정한다. |
0x12 | 2 | 아키텍쳐. x86은 0x03, x86-64는 0x3E, SPARC은 0x02이다. |
0x14 | 4 | ELF 버전. 0x01으로 설정되어 있다. |
0x18 | 4, 8 [1] | 어디서 부터 실행되어야 하는지에 관한 메모리 주소 포인트. |
0x1C, 0x20 | 4, 8 | 프로그램 헤더가 어디서 시작해야하는지에 관한 메모리 주소 포인트. |
0x20, 0x28 | 4, 8 | 섹션 해더가 어디서 시작해야하는지에 관한 메모리 주소 포인트. |
0x24, 0x30 | 4 | 이 부분은 어떤 아키텍쳐이냐에 따라 다르다. |
0x28, 0x34 | 2 | 현 해더의 크기. 32 비트이면 52, 64비트이면 64 (16진수가 아니다.) |
0x2A, 0x36 | 2 | 프로그램 해더 크기. |
0x2C, 0x38 | 2 | 프로그램 해더 테이블 엔트리 수. |
0x2E, 0x3A | 2 | 섹션 해더 테이블 크기. |
0x30, 0x3C | 2 | 섹션 해더 테이블 엔트리 수. |
0x32, 0x3E | 2 | 섹션 이름들이 있는 섹션 해더 테이블 엔트리 인덱스. |
2.2. Program Header Table [편집]
프로그램 해더 테이블이다.
2.3. .text [편집]
2.4. .rodata [편집]
Read-only Data segment. 읽기만 가능한 데이터 부분이다.
주로, static이나, const 값들이 이곳으로 온다.
char s[] = "hello world"; 주로, 이런 코드가 이 부분에 들어간다.주로, static이나, const 값들이 이곳으로 온다.
2.5. .data [편집]
이곳에는 데이터들이 있다.
예를 들어, Hello, World! 프로그램이라면, Hello, World! 하는 문자열이 저장되어 있다.
보통 .text의 명령어가 이 문자열을 불러 온다.
.rodata와의 차이점은, 이 부분은 읽고 쓸수있다.
예를 들어, Hello, World! 프로그램이라면, Hello, World! 하는 문자열이 저장되어 있다.
보통 .text의 명령어가 이 문자열을 불러 온다.
.rodata와의 차이점은, 이 부분은 읽고 쓸수있다.
2.6. Section Header Table [편집]
[1] 32 비트일경우 4이고, 64비트이면 8이다.
라이선스를 별도로 명시하지 않은 문서는 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다.
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.
문서의 기여자는 역사 탭에서 확인할 수 있습니다.
접두어의 N: - 나무위키 사용자, R: - 리그베다 위키의 사용자를 뜻합니다.
자세한 사항은 나무위키에서 동일한 문서의 역사를 참고하시기 바랍니다.