ELF 파일 형식
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
ELF(Executable and Linkable Format) 파일 형식은 유닉스 계열 운영체제에서 실행 파일, 공유 라이브러리, 오브젝트 파일 등을 표현하는 데 사용되는 바이너리 파일 형식이다. 각 ELF 파일은 ELF 헤더, 프로그램 헤더 테이블, 섹션 헤더 테이블, 그리고 데이터로 구성된다. ELF 헤더는 파일의 기본 정보를 담고 있으며, 프로그램 헤더는 실행에 필요한 정보를, 섹션 헤더는 링킹과 디버깅에 필요한 정보를 제공한다.
ELF는 다양한 운영체제와 아키텍처에서 널리 사용되며, 리눅스를 비롯한 유닉스 계열 시스템에서 a.out과 COFF 형식을 대체했다. 또한, OpenVMS, BeOS, 하이쿠, RISC OS, 몇몇 게임 콘솔(플레이스테이션, 닌텐도 등) 및 모바일 운영체제에서도 사용된다. 86open 프로젝트를 통해 ELF가 x86 기반 유닉스 시스템의 표준 바이너리 형식으로 채택되었으며, FatELF와 같은 확장도 존재한다. 디버깅 정보는 주로 DWARF 형식을 사용한다.
더 읽어볼만한 페이지
ELF 파일 형식 - [IT 관련 정보]에 관한 문서 | |
---|---|
개요 | |
종류 | 실행 파일, 오브젝트 파일, 공유 라이브러리, 코어 덤프 |
확장자 | 없음, .axf, .bin, .elf, .o, .out, .prx, .puff, .ko, .mod, .so |
MIME 형식 | 해당사항 없음 |
매직 넘버 | 0x7F 'E' 'L' 'F' |
개발 | Unix System Laboratories |
상세 정보 | |
종류 | 바이너리 파일, 실행 파일, 오브젝트 코드, 공유 라이브러리, 코어 덤프 |
컨테이너 형식 | 여러 실행 바이너리 형식 |
2. 파일 레이아웃
ELF 파일은 하나의 ELF 헤더와 여러 개의 세그먼트 및 섹션으로 구성된다. 세그먼트는 파일의 실행에 필요한 정보를 포함하고, 섹션은 링킹 및 재배치에 필요한 데이터를 포함한다.[32]
ELF 파일의 데이터는 다음을 포함할 수 있다.
- 프로그램 헤더 테이블: 하나 이상의 메모리 세그먼트를 설명한다.
- 섹션 헤더 테이블: 하나 이상의 섹션을 설명한다.
- 프로그램 헤더 테이블 또는 섹션 헤더 테이블의 항목에서 참조하는 데이터
전체 파일의 모든 바이트는 최대 하나의 섹션에 속할 수 있으며, 어떤 섹션에도 속하지 않는 고아 바이트가 발생할 수 있다.
ELF에는 다음과 같은 세 종류의 헤더가 있다.
- ELF 헤더: 파일의 처음에 위치하며, ELF 식별자, 아키텍처 정보 및 다른 두 헤더에 대한 정보를 가지고 있다.
- 프로그램 헤더: 파일의 어떤 부분(세그먼트)이 어떤 속성으로 어디에 로드될지를 보관하는 헤더이며, 파일 로더에 의해 처리된다. 실행 시 ELF 헤더 다음에 디스크에서 어떤 형태로든 읽혀지는 세그먼트 수만큼 존재한다. 직접 읽히지 않는 오브젝트 파일에는 존재하지 않을 수도 있다.
- 섹션 헤더: 오브젝트 파일의 논리적인 구조를 기술하는 부분이다. 링커나 디버거 등 바이너리 실행 이외의 목적으로 ELF 파일에 접근하는 도구가 주로 사용한다. 바이너리 실행 시에는 반드시 필요하지 않은 정보가 많기 때문에, 헤더라는 이름과 달리 파일의 마지막 부분에 위치하는 경우가 많다.
2. 1. ELF 헤더
ELF 헤더는 ELF 파일의 맨 앞에 위치하며, 파일의 전반적인 구조와 속성을 정의하는 중요한 정보를 담고 있다. 이 정보는 운영체제가 프로그램을 어떻게 실행할지 결정하는 데 사용된다.[33][4]ELF 헤더는 파일 형식(32비트 또는 64비트), 엔디언(리틀 또는 빅), 대상 운영 체제 및 ABI, 명령어 집합 등을 정의한다.
필드 | 크기 | 설명 |
---|---|---|
`e_ident` | 16바이트 | ELF 파일을 식별하고, 파일 형식, 엔디언, 운영체제, ABI 등 기본적인 정보를 담고 있다. (자세한 내용은 하위 섹션 참고) |
`e_type` | 2바이트 | 파일의 종류를 나타낸다. (예: 재배치 가능, 실행 가능, 공유 객체, 코어 파일 등) (자세한 내용은 하위 섹션 참고) |
`e_machine` | 2바이트 | 대상 아키텍처를 나타낸다. (예: x86, x86-64, ARM 등) (자세한 내용은 하위 섹션 참고) |
`e_version` | 4바이트 | ELF 파일 형식의 버전을 나타낸다. |
`e_entry` | 4바이트 (32비트) 또는 8바이트 (64비트) | 프로그램의 시작 주소를 나타낸다. |
`e_phoff` | 4바이트 (32비트) 또는 8바이트 (64비트) | 프로그램 헤더 테이블의 오프셋(파일 시작으로부터의 거리)을 나타낸다. |
`e_shoff` | 4바이트 (32비트) 또는 8바이트 (64비트) | 섹션 헤더 테이블의 오프셋을 나타낸다. |
`e_flags` | 4바이트 | 프로세서에 특정한 플래그를 나타낸다. |
`e_ehsize` | 2바이트 | ELF 헤더 자체의 크기를 나타낸다. |
`e_phentsize` | 2바이트 | 프로그램 헤더 테이블 항목 하나의 크기를 나타낸다. |
`e_phnum` | 2바이트 | 프로그램 헤더 테이블 항목의 개수를 나타낸다. |
`e_shentsize` | 2바이트 | 섹션 헤더 테이블 항목 하나의 크기를 나타낸다. |
`e_shnum` | 2바이트 | 섹션 헤더 테이블 항목의 개수를 나타낸다. |
`e_shstrndx` | 2바이트 | 섹션 이름 문자열 테이블의 인덱스를 나타낸다. |
2. 1. 1. e_ident[]
ELF 파일 헤더에서 `e_ident[]`는 파일의 형식, 엔디언, 운영 체제 ABI 등을 나타내는 식별자 역할을 한다. 이 배열은 다음과 같은 정보들을 담고 있다.[33][4]오프셋 | 크기 (바이트) | 필드 | 목적 |
---|---|---|---|
0x00 ~ 0x03 | 4 | `e_ident[EI_MAG0]` ~ `e_ident[EI_MAG3]` | 파일이 ELF 파일임을 나타내는 매직 넘버. 값은 `0x7F`와 ASCII 코드 `ELF` (`45 4c 46`)로 구성된다. |
0x04 | 1 | `e_ident[EI_CLASS]` | 파일 형식 (32비트 또는 64비트)을 나타낸다. `1`은 32비트, `2`는 64비트를 의미한다. |
0x05 | 1 | `e_ident[EI_DATA]` | 엔디언 (리틀 엔디언 또는 빅 엔디언)을 나타낸다. `1`은 리틀 엔디언, `2`는 빅 엔디언을 의미한다. |
0x06 | 1 | `e_ident[EI_VERSION]` | ELF 버전을 나타낸다. 오리지널 및 현재 버전은 `1`로 설정된다. |
0x07 | 1 | `e_ident[EI_OSABI]` | 대상 운영 체제 ABI를 식별한다. |
0x08 | 1 | `e_ident[EI_ABIVERSION]` | ABI 버전을 추가로 지정한다. 리눅스 커널에서는 2.6 이후 버전부터는 정의되지 않는다.[34] |
0x09 | 7 | `e_ident[EI_PAD]` | 현재 사용되지 않는 예약된 패딩 바이트. |
`e_ident[EI_OSABI]`는 대상 운영 체제 ABI를 구별하며, 일반적으로 `0`으로 설정되어 특정 플랫폼에 종속되지 않음을 나타낸다. 그러나 다음과 같은 특정 ABI 값을 가질 수 있다.[33][4]
값 | ABI |
---|---|
0x00 | System V |
0x01 | HP-UX |
0x02 | NetBSD |
0x03 | 리눅스 |
0x04 | GNU Hurd |
0x06 | 솔라리스 |
0x07 | AIX |
0x08 | IRIX |
0x09 | FreeBSD |
0x0A | Tru64 |
0x0C | OpenBSD |
0x0D | OpenVMS |
0x0F | AROS |
0x11 | Nuxi CloudABI |
0x12 | Stratus Technologies OpenVOS |
2. 1. 2. 기타 필드
{| class="wikitable"|+ ELF 헤더의 기타 필드[33]
|-
! 필드
! 크기 (바이트)
! 목적
|-
| `e_type`
| 2
| 객체 파일 유형을 식별한다. 자세한 내용은 아래 표와 같다.
|-
| colspan="3" |
값 | 유형 | 의미 |
---|---|---|
0x00 | ET_NONE | 알 수 없음. |
0x01 | ET_REL | 재배치 가능 파일. |
0x02 | ET_EXEC | 실행 파일. |
0x03 | ET_DYN | 공유 객체. |
0x04 | ET_CORE | 코어 파일. |
0xFE00 | ET_LOOS | 운영 체제별 예약된 포괄적 범위. |
0xFEFF | ET_HIOS | |
0xFF00 | ET_LOPROC | 프로세서별 예약된 포괄적 범위. |
0xFFFF | ET_HIPROC |
|-
| `e_machine`
| 2
| 대상 명령어 집합 아키텍처를 지정한다. 자세한 내용은 아래 표와 같다.
|-
| colspan="3" |
값 | ISA |
---|---|
0x00 | 특정 명령어 집합 없음 |
0x02 | SPARC |
0x03 | x86 |
0x08 | MIPS |
0x14 | 파워PC |
0x28 | Arm (Armv7/AArch32까지) |
0x2A | SuperH |
0x32 | IA-64 |
0x3E | x86-64 |
0xB7 | Arm 64비트 (Armv8/AArch64) |
0xF3 | RISC-V |
|-
| `e_version`
| 4
| ELF의 버전을 나타낸다. 일반적으로 1이다.
|-
| `e_entry`
| 4 (32비트) 또는 8 (64비트)
| 프로그램의 엔트리 포인트 메모리 주소를 나타낸다. 프로세스가 실행을 시작하는 지점이다. 파일에 관련 진입점이 없으면 0이다.
|-
| `e_phoff`
| 4 (32비트) 또는 8 (64비트)
| 프로그램 헤더 테이블의 시작 위치를 가리킨다.
|-
| `e_shoff`
| 4 (32비트) 또는 8 (64비트)
| 섹션 헤더 테이블의 시작 위치를 가리킨다.
|-
| `e_flags`
| 4
| 대상 아키텍처에 따라 다르게 해석되는 플래그를 포함한다.
|-
| `e_ehsize`
| 2
| ELF 헤더의 크기 (바이트)를 나타낸다. 64비트의 경우 보통 64바이트, 32비트의 경우 보통 52바이트이다.
|-
| `e_phentsize`
| 2
| 프로그램 헤더 테이블 엔트리 하나의 크기 (바이트)를 나타낸다.
|-
| `e_phnum`
| 2
| 프로그램 헤더 테이블의 엔트리 개수를 나타낸다.
|-
| `e_shentsize`
| 2
| 섹션 헤더 테이블 엔트리 하나의 크기 (바이트)를 나타낸다.
|-
| `e_shnum`
| 2
| 섹션 헤더 테이블의 엔트리 개수를 나타낸다.
|-
| `e_shstrndx`
| 2
| 섹션 이름 문자열 테이블의 인덱스를 나타낸다.
|}
2. 2. 프로그램 헤더
프로그램 헤더 테이블은 시스템에 프로세스 이미지를 생성하는 방법을 알려준다.[10] 파일 오프셋 `e_phoff`에 있으며, 각각 크기가 `e_phentsize`인 `e_phnum`개의 항목으로 구성된다. 32비트 ELF와 64비트 ELF는 `p_flags`가 정렬 문제로 인해 다른 구조 위치에 있기 때문에 레이아웃이 약간 다르다. 각 항목은 다음과 같이 구성된다.값 | 이름 | 의미 |
---|---|---|
0x00000000 | PT_NULL | 프로그램 헤더 테이블 항목을 사용하지 않는다. |
0x00000001 | PT_LOAD | 로드 가능한 세그먼트. |
0x00000002 | PT_DYNAMIC | 동적 연결 정보. |
0x00000003 | PT_INTERP | 인터프리터 정보. |
0x00000004 | PT_NOTE | 보조 정보. |
0x00000005 | PT_SHLIB | 예약됨. |
0x00000006 | PT_PHDR | 프로그램 헤더 테이블 자체를 포함하는 세그먼트. |
0x00000007 | PT_TLS | 스레드-지역 저장소 템플릿. |
0x60000000 | PT_LOOS | 예약된 포함 범위. 운영 체제 관련. |
0x6FFFFFFF | PT_HIOS | |
0x70000000 | PT_LOPROC | 예약된 포함 범위. 프로세서 관련. |
0x7FFFFFFF | PT_HIPROC |
오프셋 | 크기 (바이트) | 필드 | 목적 | ||
---|---|---|---|---|---|
32비트 | 64비트 | 32비트 | 64비트 | ||
0x04 | 4 | p_flags | 세그먼트 종속 플래그 (64비트 구조의 위치). |
값 | 이름 | 의미 |
---|---|---|
0x1 | PF_X | 실행 가능 세그먼트. |
0x2 | PF_W | 쓰기 가능 세그먼트. |
0x4 | PF_R | 읽기 가능 세그먼트. |
오프셋 | 크기 (바이트) | 필드 | 목적 | ||
---|---|---|---|---|---|
32비트 | 64비트 | 32비트 | 64비트 | ||
0x04 | 0x08 | 4 | 8 | p_offset | 파일 이미지 내 세그먼트의 오프셋. |
0x08 | 0x10 | 4 | 8 | p_vaddr | 메모리 내 세그먼트의 가상 주소. |
0x0C | 0x18 | 4 | 8 | p_paddr | 물리 주소가 관련된 시스템의 경우 세그먼트의 물리 주소에 예약됨. |
0x10 | 0x20 | 4 | 8 | p_filesz | 파일 이미지 내 세그먼트의 크기(바이트). 0일 수 있다. |
0x14 | 0x28 | 4 | 8 | p_memsz | 메모리 내 세그먼트의 크기(바이트). 0일 수 있다. |
0x18 | 4 | p_flags | 세그먼트 종속 플래그 (32비트 구조의 위치). 플래그 정의는 위의 p_flags 필드를 참조. | ||
0x1C | 0x30 | 4 | 8 | p_align | `0`과 `1`은 정렬 없음 지정. 그렇지 않으면 `p_vaddr`가 `p_offset` 모듈러스 `p_align`과 동일한 양의 2의 양의 정수 거듭제곱이어야 한다. |
0x20 | 0x38 | colspan="3" | | 프로그램 헤더의 끝(크기). |
프로그램 헤더는 파일의 어떤 부분(세그먼트)이 어떤 속성으로 어디에 로드될지를 보관하는 헤더이며, 파일 로더에 의해 처리된다. 실행 시 ELF 헤더 다음에 디스크에서 어떤 형태로든 읽혀지는 세그먼트 수만큼 존재한다. 직접 읽히지 않는 오브젝트 파일에는 존재하지 않을 수도 있다.
2. 3. 섹션 헤더
섹션 헤더는 링킹 및 재배치에 필요한 중요한 정보를 담고 있는 ELF 파일의 구성 요소이다. 각 섹션 헤더는 다음과 같은 필드들로 구성된다.{| class="wikitable"
|-
! 필드 !! 설명
|-
| `sh_name` || 섹션의 이름을 나타내는 문자열 오프셋이다. 이 오프셋은 `.shstrtab` 섹션에 있는 널 종료 문자열을 가리킨다.[32]
|-
| `sh_type` || 섹션의 유형을 나타낸다. 주요 유형은 다음과 같다.
값 | 이름 | 의미 |
---|---|---|
0x0 | `SHT_NULL` | 사용하지 않는 섹션 헤더 테이블 항목 |
0x1 | `SHT_PROGBITS` | 프로그램 데이터 |
0x2 | `SHT_SYMTAB` | 심볼 테이블 |
0x3 | `SHT_STRTAB` | 문자열 테이블 |
0x4 | `SHT_RELA` | 추가 항목이 있는 재배치 항목 |
0x5 | `SHT_HASH` | 심볼 해시 테이블 |
0x6 | `SHT_DYNAMIC` | 동적 연결 정보 |
0x7 | `SHT_NOTE` | 노트 |
0x8 | `SHT_NOBITS` | 데이터가 없는 프로그램 공간 (bss) |
0x9 | `SHT_REL` | 재배치 항목, 추가 항목 없음 |
0x0A | `SHT_SHLIB` | 예약됨 |
0x0B | `SHT_DYNSYM` | 동적 링커 심볼 테이블 |
0x0E | `SHT_INIT_ARRAY` | 생성자 배열 |
0x0F | `SHT_FINI_ARRAY` | 소멸자 배열 |
0x10 | `SHT_PREINIT_ARRAY` | 사전 생성자 배열 |
0x11 | `SHT_GROUP` | 섹션 그룹 |
0x12 | `SHT_SYMTAB_SHNDX` | 확장 섹션 인덱스 |
0x13 | `SHT_NUM` | 정의된 유형의 수 |
0x60000000 | `SHT_LOOS` | OS별 시작 |
|-
| `sh_flags` || 섹션의 속성을 나타내는 플래그이다. 주요 플래그는 다음과 같다.
값 | 이름 | 의미 |
---|---|---|
0x1 | `SHF_WRITE` | 쓰기 가능 |
0x2 | `SHF_ALLOC` | 실행 중에 메모리를 차지함 |
0x4 | `SHF_EXECINSTR` | 실행 가능 |
0x10 | `SHF_MERGE` | 병합될 수 있음 |
0x20 | `SHF_STRINGS` | 널 종료 문자열을 포함함 |
0x40 | `SHF_INFO_LINK` | sh_info는 SHT 인덱스를 포함함 |
0x80 | `SHF_LINK_ORDER` | 결합 후 순서 유지 |
0x100 | `SHF_OS_NONCONFORMING` | 비표준 OS별 처리가 필요함 |
0x200 | `SHF_GROUP` | 섹션은 그룹의 멤버임 |
0x400 | `SHF_TLS` | 섹션은 스레드 로컬 데이터를 보유함 |
0x0FF00000 | `SHF_MASKOS` | OS별 |
0xF0000000 | `SHF_MASKPROC` | 프로세서별 |
0x4000000 | `SHF_ORDERED` | 특수 정렬 요구 사항 (Solaris) |
0x8000000 | `SHF_EXCLUDE` | 섹션이 참조되거나 할당되지 않으면 제외됨 (Solaris) |
ELF 파일을 분석하고 조작하는 데 사용되는 다양한 도구는 다음과 같다.
|-
| `sh_addr` || 섹션이 메모리에 로드될 경우, 해당 섹션의 가상 주소를 나타낸다.
|-
| `sh_offset` || 파일 내에서 섹션의 시작 위치를 나타내는 오프셋이다.
|-
| `sh_size` || 섹션의 크기(바이트)를 나타낸다.
|-
| `sh_link` || 섹션 유형에 따라 의미가 달라지는 필드로, 관련된 섹션의 섹션 헤더 테이블 인덱스를 포함한다.
|-
| `sh_info` || 섹션 유형에 따라 의미가 달라지는 필드로, 섹션에 대한 추가 정보를 포함한다.
|-
| `sh_addralign` || 섹션에 필요한 메모리 정렬을 나타낸다. (2의 거듭제곱)
|-
| `sh_entsize` || 고정 크기 항목을 갖는 섹션(예: 심볼 테이블)의 경우, 각 항목의 크기(바이트)를 나타낸다.
|}
각 섹션에는 일반적으로 섹션 이름이 있으며, 이 이름은 ELF 헤더에서 지정된 문자열 전용 섹션(`.shstrtab`)에 널 종료 문자열로 저장된다. `sh_name` 필드는 이 문자열 전용 섹션의 시작점으로부터의 오프셋을 통해 해당 섹션 이름을 가리킨다.[32]
3. 도구
4. 적용
ELF 형식은 다양한 운영 체제에서 널리 사용되고 있다. ELF는 유닉스 계열 운영 체제에서 a.out과 COFF 포맷을 대체했으며, 리눅스, 솔라리스, IRIX 등에서 사용된다.
ELF는 OpenVMS, BeOS, 하이쿠, RISC OS[37] 등 유닉스 계열이 아닌 운영 체제에서도 채택되었다. 또한, 플레이스테이션 포터블[38], 플레이스테이션 비타, 플레이스테이션 2, 플레이스테이션 3, 플레이스테이션 4, GP2X, 드림캐스트, 닌텐도 게임큐브, Wii, Wii U 등 여러 게임 콘솔에서도 사용된다.
4. 1. 유닉스 계열 시스템
ELF 형식은 유닉스 계열 운영 체제에서 a.out과 COFF 포맷을 대체하여 사용되고 있다.- 리눅스
- 솔라리스
- IRIX
- FreeBSD[12]
- NetBSD
- OpenBSD
- DragonFly BSD
- Syllable
- HP-UX (32비트 PA-RISC 프로그램은 SOM을 계속 사용)
- QNX Neutrino
- MINIX[13]
4. 2. 비 유닉스 계열 시스템
OpenVMS, BeOS Revision 4 이후의 x86 기반 컴퓨터, 하이쿠, RISC OS[37] 등 일부 유닉스 계열이 아닌 운영 체제에서도 ELF 형식이 채택되었다.4. 3. 게임 콘솔
플레이스테이션 포터블, 플레이스테이션 비타, 플레이스테이션 2, 플레이스테이션 3, 플레이스테이션 4를 포함한 플레이스테이션 시리즈, GP2X, 드림캐스트, 닌텐도 게임큐브, Wii, Wii U 등 일부 게임 콘솔에서 ELF 형식이 사용된다.[38][18]4. 4. 모바일 기기
안드로이드, 심비안, 바다 등 일부 모바일 운영 체제에서 ELF 형식이 사용된다.- 심비안 OS v9는 ELF 파일 형식을 기반으로 하는 E32Image[19] 형식을 사용한다.
- 소니 에릭슨(Sony Ericsson) W800i, W610, W300 등.
- 지멘스(Siemens) SGOLD 및 SGOLD2 플랫폼: 지멘스 C65에서 S75 및 BenQ-Siemens E71/EL71까지.
- 모토로라(Motorola) E398, SLVR L7, v360, v3i (및 패치가 적용된 모든 LTE2 폰).
- 바다 삼성 웨이브 S8500.
- 노키아 N900과 같이 Maemo 또는 Meego OS를 실행하는 노키아 폰 또는 태블릿.
- 안드로이드는 자바 네이티브 인터페이스(Java Native Interface)에 .so(공유 객체[20]) 라이브러리를 사용한다. 안드로이드 런타임(ART)을 사용하면 안드로이드 5.0 "롤리팝"부터 기본적으로 모든 애플리케이션이 설치 시 기본 ELF 바이너리로 컴파일된다.[21]
4. 5. 기타
ELF 형식은 다양한 환경에서 오래된 실행 파일 포맷을 대체해왔다. 유닉스 계열 운영 체제에서 a.out과 COFF 포맷을 대체했다.- 리눅스
- 솔라리스
- IRIX
- FreeBSD
- NetBSD
- OpenBSD
- DragonFly BSD
- Syllable
- HP-UX
- QNX Neutrino
- 미닉스[36]
ELF는 또한 유닉스 계열이 아닌 운영체제에서도 채택되었다.
몇몇 게임 콘솔들도 또한 ELF를 사용한다.
PowerPC에서 ELF를 사용하는 다른 운영 체제는 다음과 같다.
5. 86open
86open은 x86 아키텍처 기반 PC 호환 유닉스 및 유닉스 계열 운영 체제에서 사용할 공통 바이너리 파일 형식을 결정하기 위한 프로젝트였다.[24] 이 프로젝트의 목표는 소프트웨어 개발자들이 해당 아키텍처로 프로그램을 쉽게 포팅할 수 있도록 하는 것이었다. 초기에는 단일 유닉스 명세(Spec 1170)의 일부분과 GNU C 라이브러리(glibc)를 표준화하여, 수정되지 않은 바이너리 파일이 x86 유닉스 계열 운영 체제에서 실행될 수 있도록 하는 것이 목표였다.
최종적으로 선택된 형식은 ELF였으며, 특히 리눅스의 ELF 구현이 관련 벤더와 운영 체제 모두에게 지원받는 사실상의 표준으로 채택되었다.
이 그룹은 1997년 이메일 토론으로 시작되었으며, 1997년 8월 22일 Santa Cruz Operation 사무실에서 첫 회의를 가졌다.
운영 위원회는 마크 잉, 다이온 존슨, 에반 레이보비치, 브루스 페렌스, 앤드루 로치, 브라이언 웨인 스팍스, 리누스 토르발스였다. 이 프로젝트에는 키스 보스틱, 척 크래너, 마이클 데이비슨, 크리스 G. 데메트리우, 울리히 드레퍼, 돈 더거, 스티브 긴즈버그, 존 "매드독" 홀, 론 홀트, 조던 허바드, 데이브 젠슨, 킨 존스턴, 앤드루 조시, 로버트 라입, 벨라 럽킨, 팀 마스랜드, 그레그 페이지, 로널드 조 레코드, 팀 러클, 조엘 실버스틴, 치아-피 티엔, 에릭 트론 등 많은 사람들이 참여하였다. 참여한 운영 체제 및 회사는 BeOS, BSDI, FreeBSD, 인텔, 리눅스, NetBSD, SCO, SunSoft였다.
프로젝트가 진행되면서, 1998년 중반에 SCO는 OpenServer, UnixWare 및 Solaris에서 리눅스 바이너리를 실행할 수 있게 해주는 오픈 소스 호환성 계층인 lxrun 개발을 시작했다. SCO는 1999년 3월 LinuxWorld에서 lxrun에 대한 공식 지원을 발표했다. 썬 마이크로시스템즈는 1999년 초에 Solaris용 lxrun 지원을 시작했으며,[25] 이후 Linux 애플리케이션용 Solaris 컨테이너를 통해 Linux 바이너리 형식에 대한 통합 지원으로 전환했다.
BSD가 오랫동안 Linux 바이너리를 지원해 왔고(호환성 계층을 통해), 주요 x86 유닉스 벤더들이 ELF 형식에 대한 지원을 추가하면서, 86open 프로젝트는 Linux ELF가 업계에서 선택한 형식이라고 판단하고 1999년 7월 25일에 해산을 선언했다.[26]
6. FatELF
FatELF는 팻 바이너리 기능을 추가하는 ELF 바이너리 형식 확장이다.[27] 이는 리눅스 및 기타 유닉스 계열 운영 체제를 대상으로 한다. CPU 아키텍처 추상화(바이트 순서, 워드 크기, CPU 명령어 집합 등) 외에도 여러 커널 ABI 버전을 지원하는 바이너리와 같은 소프트웨어 플랫폼 추상화의 잠재적 이점이 있다. 2021년 기준으로 FatELF는 주류 리눅스 커널에 통합되지 않았다.[28][29][30]
7. 디버그 정보
ELF는 디버그 정보 형식을 명시적으로 정의하지 않지만, 일반적으로 DWARF(小人, 소인)라고 불리는 형식의 포맷이 자주 사용된다. DWARF는 ELF(妖精, 요정)를 본뜬 Debug With Arbitrary Record Format의 약자이다.
참조
[1]
간행물
Portable Formats Specification
https://refspecs.lin[...]
Tool Interface Standard (TIS)
1993-10
[2]
간행물
System V Application Binary Interface
https://www.sco.com/[...]
Tool Interface Standard (TIS)
1997-03-18
[3]
간행물
Executable and Linking Format (ELF) Specification
https://refspecs.lin[...]
Tool Interface Standard (TIS)
1995-05
[4]
웹사이트
ELF Header
https://www.sco.com/[...]
Sco.com
2014-02-07
[5]
웹사이트
LXR linux/include/linux/elf.h
http://lxr.linux.no/[...]
2015-04-27
[6]
웹사이트
glibc 2.12 announce
https://sourceware.o[...]
[7]
웹사이트
sourceware.org Git - glibc.git/blob - libc-abis
https://sourceware.o[...]
[8]
웹사이트
sourceware.org Git - glibc.git/blob - sysdeps/gnu/ldsodefs.h
https://web.archive.[...]
2019-10-28
[9]
웹사이트
Available lexers — Pygments
https://pygments.org[...]
2024-12-19
[10]
웹사이트
Program Header
http://www.sco.com/d[...]
Sco.com
2017-04-05
[11]
웹사이트
elfutils
https://sourceware.o[...]
2017-04-30
[12]
웹사이트
Binary Formats
https://web.archive.[...]
2019-03-31
[13]
웹사이트
MinixReleases – Minix Wiki
https://web.archive.[...]
Wiki.minix3.org
2014-01-19
[14]
웹사이트
Archived copy
https://web.archive.[...]
2016-10-19
[15]
웹사이트
GCCSDK – RISC OS
https://web.archive.[...]
Riscos.info
2014-01-19
[16]
웹사이트
Guardian Programmer's Guide
https://web.archive.[...]
Hewlett Packard Enterprise
2018-05-30
[17]
웹사이트
Under the hood of Microsoft's Windows Subsystem for Linux
https://www.zdnet.co[...]
2016-08-19
[18]
문서
PlayStation Portable use encrypted & relocated ELF : PSP
[19]
문서
Symbian OS executable file format
https://web.archive.[...]
[20]
서적
UNIX: The Complete Reference
https://books.google[...]
McGraw Hill Professional
2017-06-08
[21]
웹사이트
Android formats
https://lief-project[...]
2023-01-17
[22]
간행물
System V Application Binary Interface
2009-10-26
[23]
웹사이트
Solana Programs
https://solana.com/d[...]
Solana Foundation
2024-11-11
[24]
웹사이트
86Open Frequently-Asked Questions
http://www.telly.org[...]
1997-12-23
[25]
웹사이트
Bulletin on status of 86open at SCO
https://web.archive.[...]
1998-05-21
[26]
웹사이트
The86open Project – Final Update
https://www.telly.or[...]
1999-07-25
[27]
웹사이트
fatelf-specification v1
http://hg.icculus.or[...]
icculus.org
2010-07-25
[28]
웹사이트
FatELF: Turns out I liked the uncertainty better
https://icculus.org/[...]
icculus.org
2010-07-13
[29]
웹사이트
Ryan Gordon Halts FatELF Project
https://www.osnews.c[...]
osnews.com
2010-07-05
[30]
웹사이트
SELF: Anatomy of an (alleged) failure
https://lwn.net/Arti[...]
Linux Weekly News
2011-02-06
[31]
문서
no
[32]
문서
正確には、文字列専用セクションの先頭から、各文字列のサイズをカウントしたときのオフセットである。文字列専用セクションにて2バイト以上のアラインメントが指定されている場合、文字列同士の間にパディングが入るため単純に文字列専用セクション先頭にオフセットを加えただけでは対象文字列の先頭にならないことがある。
[33]
웹인용
ELF Header
http://www.sco.com/d[...]
Sco.com
2016-02-11
[34]
웹인용
LXR linux/include/linux/elf.h
http://lxr.linux.no/[...]
2015-04-27
[35]
웹인용
elfutils
http://fedorahosted.[...]
2015-04-27
[36]
웹인용
MinixReleases - Minix Wiki
http://wiki.minix3.o[...]
Wiki.minix3.org
[37]
웹인용
GCCSDK - RISC OS
http://www.riscos.in[...]
Riscos.info
2012-04-22
[38]
문서
PlayStation Portable use encrypted & relocated ELF: PSP
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com