#!if 넘어옴1 != null
''''''{{{#!if 넘어옴2 != null
, ''''''}}}{{{#!if 넘어옴3 != null
, ''''''}}}{{{#!if 넘어옴4 != null
, ''''''}}}{{{#!if 넘어옴5 != null
, ''''''}}}{{{#!if 넘어옴6 != null
, ''''''}}}{{{#!if 넘어옴7 != null
, ''''''}}}{{{#!if 넘어옴8 != null
, ''''''}}}{{{#!if 넘어옴9 != null
, ''''''}}}{{{#!if 넘어옴10 != null
, ''''''}}}은(는) 여기로 연결됩니다.
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.
#!if 리스트 != null
{{{#!if 문서명1 != null
* {{{#!if 설명1 != null
: }}}[[]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명2 != null
* {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
* {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
* {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
* {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
* {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
* {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
* {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
* {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
* {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}
- 판타지의 엘프와 관련된 정보: 엘프 문서로.
- 금융 상품과 관련된 정보: 주가연계증권(ELS) 문서로.
- 그룹 슈퍼주니어의 팬덤: E.L.F. 문서로.
- 유럽의 미식축구 리그: 유러피언 리그 오브 풋볼 문서로.
1. 개요
Executable and Linkable Format, ELFELF는 많은 유닉스 계열 운영체제의 실행 파일, 오브젝트 파일, 공유 라이브러리, 코어 덤프 등에 사용되는 바이너리 파일의 규격이다. 이것은 AT&T UNIX System V에서 처음 도입되었다.
ELF 파일의 예를 들면, 아래와 같은 것들이 있다.
- Executable Files
- 운영체제의 표준 실행 바이너리
ls
,cd
,mv
,cp
등등- Shared object files
libc-2.23.so
- Relocatable files
- 컴파일 된 오브젝트 파일
hello_world.o
- Core dump files
사용하는 운영체제는 BSD, 솔라리스, 그리고 리눅스가 있다. 다만 이것이 ELF 규격을 사용하는 특정 OS의 바이너리가 다른 ELF 규격 사용 OS에서 구동된다는 뜻은 아닌데, 바이너리 규격이 같을 뿐 ABI 등은 전혀 다르기 때문이다. 예를 들어 리눅스용 프로그램을 솔라리스에서 돌리려고 하면 에러가 나온다.
한편 모든 유닉스 운영체제가 ELF를 사용하는 것은 아니다. 구버전의 UNIX에서는 COFF를 사용했으며, Apple의 XNU 커널(macOS, iOS 등)은 Mach-O를, IBM의 AIX에서는 XCOFF를 사용한다.
2. 구조
ELF 파일은 이런 구조를 가지고 있다.ELF Header |
Program header table |
.text |
.rodata |
.data |
Section header table |
2.1. ELF header
먼저, ELF 헤더 같은 경우는 실행 파일에 대한 정보를 가지고 있다. 매직넘버는 .ELF (0x7F 0x45 0x4C 0x46).파일이 오브젝트 파일인지, 실행 파일인지, 아니면 공유 라이브러리 알려주는 데이터나, 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 | 어떤 운영체제를 위하여 제작되었는지를 결정한다. 리눅스는 0x03, FreeBSD는 0x09 이다. 자주 0x00으로 설정되는데, 문제 없다. |
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
이곳에 코드가 들어간다. 주로, push rax, mov[esp - 4]
, rdi, int 0x80같은 명령이 있다.물론, 바이너리이다 (...)
2.4. .rodata
Read-only Data segment. 읽기만 가능한 데이터 부분이다.char s[] = "hello world";
주로, 이런 코드가 이 부분에 들어간다.주로, static이나, const 값들이 이곳으로 온다.
2.5. .data
이곳에는 데이터들이 있다.예를 들어, Hello, World! 프로그램이라면, Hello, World! 하는 문자열이 저장되어 있다.
보통 .text의 명령어가 이 문자열을 불러 온다.
.rodata와의 차이점은, 이 부분은 읽고 쓸수있다.
2.6. Section Header Table
[1] 32 비트일경우 4이고, 64비트이면 8이다.