ELF(5)

명칭
elf - ELF 실행 형식 바이노리필드의 포맷

서식
<elf.h>

해설
헤더 파일 <elf.h> (은)는, ELF 실행 형식 바이노리필드의 포맷을 정의하고 있습니다. ELF 에는 보통 실행 가능 파일, 재배치 가능한 오브젝트 파일, 코어 파일, 공유 프로그램 라이브러리가 있습니다.

ELF 파일 포맷을 사용하고 있다 실행 가능 파일은 ELF 헤더를 가집니다. 그리고, 프로그램 헤더 테이블인가, 섹션 헤더 테이블, 혹은 그 양쪽 모두가 계속됩니다. ELF 헤더는, 항상 파일의 오프셋(offset) 0 에 있습니다. 프로그램 헤더 테이블과 섹션 헤더 테이블의 파일중의 오프셋(offset)는, ELF 헤더로 정의되고 있습니다. 2 개의 테이블은, 파일의 특징의 나머지의 부분을 기술합니다.

네이티브 아키텍쳐의 ELF 바이노리필드를 처리하는 어플리케이션은, 그 원시 코드에 elf.h (을)를 인클루드 할 뿐입니다 봅니다. 이러한 어플리케이션은, 총칭명 “Elf_xxx” 에 의한 전타입과 구조체에의 참조를 포함할 필요가 있어, “ELF_xxx” 에 의한 매크로에의 참조를 포함할 필요가 있겠지요. 이와 같이 해 기술된 어플리케이션은, 어떠한 아키텍쳐여도, 호스트가 32 비트인가, 혹은 64 비트인가 그렇다고 하는 것을 신경쓰지 말고, 컴파일 가능합니다.

미지의 아키텍쳐의 ELF 파일을 처리할 필요가 있는 어플리케이션은, elf.h (이)가 아니고, sys/elf32.h (와)과 sys/elf64.h 의 양쪽 모두를 인클루드 할 필요가 있습니다. 게다가 모든 타입과 구조체는, “Elf32_xxx” 인가 “Elf64_xxx” 에 의해 구별할 필요가 있습니다. 매크로는, “ELF32_xxx” 또는 “ELF64_xxx” 에 의해 구별할 필요가 있습니다.

시스템의 아키텍쳐가 비록 무엇으로 있어도, 항상 sys/elf_generic.h 뿐만이 아니고, sys/elf_common.h 도 인클루드 합니다.

이러한 헤더 파일에서는, 위에서 언급한 헤더를 C 구조체로서 기술해, 이것에 가세해 동적 섹션과 재배치 섹션과 심볼 테이블을 위한 구조체를 포함하고 있습니다.

이하의 타입이, 32 비트 아키텍쳐를 위해서(때문에) 사용되고 있습니다:

    Elf32_Addr	부호 없음 프로그램 주소
    Elf32_Half	부호 없음 하프 워드 필드
    Elf32_Off	부호 없음 파일 오프셋(offset)
    Elf32_Sword	부호 첨부대정수
    Elf32_Word	필드 또는 부호 없음대정수
    Elf32_Size	부호 없음 오브젝트 사이즈

64 비트 아키텍쳐용으로 이하의 타입이 준비되어 있습니다:

    Elf64_Addr	부호 없음 프로그램 주소
    Elf64_Half	부호 없음 하프 워드 필드
    Elf64_Off	부호 없음 파일 오프셋(offset)
    Elf64_Sword	부호 첨부대정수
    Elf64_Word	필드 또는 부호 없음대정수
    Elf64_Size	부호 없음 오브젝트 사이즈
    Elf64_Quarter	부호 없음 쿼터워드 필드

ELF 파일 포맷이 정의하는 모든 데이터 구조는, 관련하는 클래스를 위해서(때문에) “자연스러운” 사이즈와 경계 조정의 가이드 라인에 따르고 있습니다. 필요하면, 데이터 구조는, 4 바이트 오브젝트가 4 바이트 경계가 되는 것을 프로텍션하기 위해서, 구조체의 사이즈를 강제적으로 4 의 배수로 한다든가 말한 수단으로, 명시적인 패딩을 포함합니다.

ELF 헤더는, Elf32_Ehdr 형 또는 Elf64_Ehdr 형에 의해 기술되고 있습니다:

    typedef struct {
            unsigned char   e_ident[EI_NIDENT];
            Elf32_Half      e_type;
            Elf32_Half      e_machine;
            Elf32_Word      e_version;
            Elf32_Addr      e_entry;
            Elf32_Off       e_phoff;
            Elf32_Off       e_shoff;
            Elf32_Word      e_flags;
            Elf32_Half      e_ehsize;
            Elf32_Half      e_phentsize;
            Elf32_Half      e_phnum;
            Elf32_Half      e_shentsize;
            Elf32_Half      e_shnum;
            Elf32_Half      e_shstrndx;
    } Elf32_Ehdr;

    typedef struct {
    	unsigned char   e_ident[EI_NIDENT];
    	Elf64_Quarter   e_type;
    	Elf64_Quarter   e_machine;
    	Elf64_Half      e_version;
    	Elf64_Addr      e_entry;
    	Elf64_Off       e_phoff;
    	Elf64_Off       e_shoff;
    	Elf64_Half      e_flags;
    	Elf64_Quarter   e_ehsize;
    	Elf64_Quarter   e_phentsize;
    	Elf64_Quarter   e_phnum;
    	Elf64_Quarter   e_shentsize;
    	Elf64_Quarter   e_shnum;
    	Elf64_Quarter   e_shstrndx;
    } Elf64_Ehdr;

필드는, 이하의 의미를 가지고 있습니다:

e_ident
    이 바이트 배열은 파일을 어떻게 해석해야할 것인가를 지정합니다. 이것은, 프로세서 또는 파일의 나머지의 내용으로부터 독립하고 있습니다. 이 배열중의 전요소는, EI_ 그리고 개시하는 매크로에 의해 이름이 붙여져 또 선두에 ELF 하지만 붙은 값을 가질 수 있습니다. 이하의 매크로가 정의되고 있습니다:

    EI_MAG0
        매직 번호의 제 1 의 바이트. ELFMAG0 인 것이 필요합니다.
    EI_MAG1
        매직 번호의 제 2 의 바이트. ELFMAG1 인 것이 필요합니다.
    EI_MAG2
        매직 번호의 제 3 의 바이트. ELFMAG2 인 것이 필요합니다.
    EI_MAG3
        매직 번호의 제 4 의 바이트. ELFMAG3 인 것이 필요합니다.
    EI_CLASS
        제 5 의 바이트는, 해당의 바이노리필드의 아키텍쳐를 식별합니다:

        ELFCLASSNONE
            이 클래스는, 부당합니다.
        ELFCLASS32
            이것은, 32 비트 아키텍쳐를 정의합니다. 파일 공간과 가상 address 공간이 4 기가바이트까지 안정된다 머신에 대응합니다.
        ELFCLASS64
            이것은, 64 비트 아키텍쳐를 정의합니다.
    EI_DATA
        제 6 의 바이트는, 파일의 프로세서 고유 데이터의 인코딩을 지정합니다. 현재, 다음의 인코딩이 서포트되고 있습니다:

        ELFDATANONE
            미지의 데이터 포맷.
        ELFDATA2LSB
            2 의 보수, little endian.
        ELFDATA2MSB
            2 의 보수, 빅 endian.
    EI_VERSION
        ELF 시방서의 버젼 넘:

        EV_NONE
            부당한 버젼.
        EV_CURRENT
            현재의 버젼.
    EI_OSABI
        이 바이트는, 오브젝트의 대상인, operating system와 ABI 를 식별합니다. 다른 ELF 구조중의 필드에는, 플랫폼 의존의 의미의 것이 있습니다. 그러한 필드의 해석은, 이 바이트의 값으로 결정됩니다. 다음의 값이 현재 정의되고 있습니다:

        ELFOSABI_SYSV
            UNIX System V ABI.
        ELFOSABI_HPUX
            HP-UX operating system ABI.
        ELFOSABI_NETBSD
            NetBSD operating system ABI.
        ELFOSABI_LINUX
            GNU/Linux operating system ABI.
        ELFOSABI_HURD
            GNU/Hurd operating system ABI.
        ELFOSABI_86OPEN
            86Open Common IA32 ABI.
        ELFOSABI_SOLARIS
            Solaris operating system ABI.
        ELFOSABI_MONTEREY
            Monterey 프로젝트 ABI.
        ELFOSABI_IRIX
            IRIX operating system ABI.
        ELFOSABI_FREEBSD
            FreeBSD operating system ABI.
        ELFOSABI_TRU64
            TRU64 UNIX operating system ABI.
        ELFOSABI_ARM
            ARM 아키텍쳐 ABI.
        ELFOSABI_STANDALONE
            Standalone (편입) ABI.
    EI_ABIVERSION
        이 바이트는, 오브젝트의 대상인 ABI 의 버젼을 식별합니다. 이 필드는, 같은 ABI 에서도, 호환성이 없는 것 같은 종류를 구별하기 위해서 사용됩니다. 버젼 번호의 해석은, EI_OSABI 필드에서 식별되는 ABI 에 의존합니다. 이 사양에 준거하는 어플리케이션은, 값 0 을 사용합니다.
    EI_PAD
        패딩의 초. 이러한 바이트는, 예약되고 있어 0 에 세트 됩니다. 여기를 읽는 프로그램은, 이것을 무시할 필요가 있습니다. 장래, 현재 사용하지 않은 바이트에 의미가 주어졌을 때에는, EI_PAD 의 값은 바뀝니다.
    EI_BRAND
        아키텍쳐 식별자의 초.
    EI_NIDENTT
        e_ident 배열의 크기.

e_type
    구조체의 이 멤버는, 오브젝트 파일 타입을 식별합니다:

    ET_NONE
        미지의 타입.
    ET_REL
        재배치 가능한 파일.
    ET_EXEC
        실행 가능 파일.
    ET_DYN
        공유 오브젝트.
    ET_CORE
        코어 파일.

e_machine
    이 멤버는, 개개의 파일에 필요한 아키텍쳐를 지정합니다:

    EM_NONE
        미지의 머신.
    EM_M32
        AT&T WE 32100
    EM_SPARC
        Sun Microsystems SPARC.
    EM_386
        Intel 80386.
    EM_68K
        Motorola 68000
    EM_88K
        Motorola 88000
    EM_486
        Intel 80486
    EM_860
        Intel 80860
    EM_MIPS
        MIPS RS3000 (빅 endian만)
    EM_MIPS_RS4_BE
        MIPS RS4000 (빅 endian만)
    EM_SPARC64
        SPARC v9 64-bit 비공식
    EM_PARISC
        HPPA
    EM_PPC
        PowerPC
    EM_ALPHA
        Compaq [DEC] Alpha

e_version
    이 멤버는, 파일 버젼을 식별합니다:

    EV_NONE
        부당한 버젼.
    EV_CURRENT
        현재의 버젼.
e_entry
    이 멤버는, 시스템이 최초로 제어를 옮기는, 즉 프로세스를 개시하는 가상 주소를 나타냅니다. 파일에 엔트리 포인트가 없다면, 이 멤버는 0 이 됩니다.
e_phoff
    이 멤버는, 프로그램 헤더 테이블의 바이트 단위의 파일 오프셋(offset)를 가집니다.
e_shoff
    이 멤버는, 섹션 헤더 테이블의 바이트 단위의 파일 오프셋(offset)를 가집니다. 파일에 섹션 헤더 테이블이 없다면, 이 멤버는 0 이 됩니다.
e_flags
    이 멤버는, 파일에 관련하는, 프로세서에 고유한 플래그를 가집니다. 플래그명은, EF_`machine_flag'라고 하는 형식이 됩니다. 현재, 정의된 플래그는 없습니다.
e_ehsize
    이 멤버는, ELF 헤더의 바이트 단위의 크기를 가집니다.
e_phentsize
    이 멤버는, 파일의 프로그램 헤더 테이블에 있는 엔트리 1 개 분의 사이즈를 가집니다. 모든 엔트리는, 같은 크기입니다.
e_phnum
    이 멤버는, 프로그램 헤더 테이블중의 엔트리의 개수를 가집니다. 즉, e_phentsize (와)과 e_phnum 의 적은, 테이블의 바이트 단위의 크기를 줍니다. 파일에 프로그램 헤더가 없다면, e_phnum 의 값은 0 이 됩니다.
e_shentsize
    이 멤버는, 섹션 헤더의 바이트 단위의 크기를 가집니다. 섹션 헤더는, 섹션 헤더 테이블안의 1 개의 엔트리입니다; 모든 엔트리는, 같은 크기입니다.
e_shnum
    이 멤버는, 섹션 헤더 테이블중의 엔트리의 개수를 가집니다. 즉, e_shentsize (와)과 e_shnum 의 적은, 섹션 헤더 테이블의 바이트 단위의 크기를 줍니다. 파일에 섹션 헤더 테이블이 없다면, e_shnum 의 값은 0 이 됩니다.
e_shstrndx
    이 멤버는, 섹션 헤더 테이블의, 섹션 명문자열테이블에 묶을 수 있었던 엔트리에의 인덱스를 가집니다. 파일에 섹션 명문자열테이블이 없다면, 이 멤버는 값 SHN_UNDEF (을)를 가집니다.

    SHN_UNDEF
        이 값은, 미정도리인가, 존재하지 않는지, 무관계한가, 의미가 없는 섹션 참조를 나타냅니다. 예를 들면, 섹션 번호 SHN_UNDEF (으)로부터의 상대로 “정의” 되는 심볼은, 미정도리 심볼입니다.
    SHN_LORESERVE
        이 값은, 예약의 인덱스의 범위의 하한을 지정합니다.
    SHN_LOPROC
        이 값으로부터 SHN_HIPROC 이하는, 프로세서 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.
    SHN_HIPROC
        이 값으로부터 SHN_LOPROC 이상은, 프로세서 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.
    SHN_ABS
        이 값은, 대응하는 참조를 위해서(때문에) 절대적인 값을 지정합니다. 예를 들면, SHN_ABS (으)로부터의 상대로 정의되는 심볼은, 절대적인 값을 가져, 재배치에 의한 영향을 받지 않습니다.
    SHN_COMMON
        이 섹션으로부터의 상대로 정의되는 심볼은, 공통 심볼이며, Fortran 의 COMMON 나 area가 확보되어 있지 않은 C 의 외부 변수가 해당합니다.
    SHN_HIRESERVE
        이 값은, 예약 인덱스 범위의 상한을 지정합니다. 이 범위는, SHN_LORESERVE (와)과 SHN_HIRESERVE 의 사이이며, 양단을 포함합니다. 이러한 값은, 섹션 헤더 테이블을 참조하지 않습니다. 섹션 헤더 테이블은 예약의 인덱스를 위해서(때문에) 엔트리를 포함하지 않습니다.

실행 가능 파일 또는 공유 오브젝트 파일의 프로그램 헤더 테이블은, 구조체의 배열입니다. 각 구조체는, 프로그램 실행에 시스템이 필요로 한다, 세그먼트(segment)등의 정보를 기술합니다. 오브젝트 파일의 세그먼트(segment) (은)는, 1 개(살) 이상의 섹션 (을)를 포함합니다. 프로그램 헤더는, 실행 가능 파일과 공유 오브젝트 파일만으로 의미가 있습니다. 파일은, ELF 헤더의 e_phentsize (와)과 e_phnum 멤버로 그것 자신의 프로그램 헤더 사이즈를 지정합니다. ELF 실행 형식의 헤더와 같게, 프로그램 헤더도 아키텍쳐에 따라 다른 버젼을 가집니다:

    typedef struct {
            Elf32_Word      p_type;
            Elf32_Off       p_offset;
            Elf32_Addr      p_vaddr;
            Elf32_Addr      p_paddr;
            Elf32_Size      p_filesz;
            Elf32_Size      p_memsz;
            Elf32_Word      p_flags;
            Elf32_Size      p_align;
    } Elf32_Phdr;

    typedef struct {
            Elf64_Half      p_type;
            Elf64_Half      p_flags;
            Elf64_Off       p_offset;
            Elf64_Addr      p_vaddr;
            Elf64_Addr      p_paddr;
            Elf64_Size      p_filesz;
            Elf64_Size      p_memsz;
            Elf64_Size      p_align;
    } Elf64_Phdr;

32 비트와 64 비트의 프로그램 헤더의 사이의 주된 차이는, 구조 체내의 p_flags 멤버의 위치 뿐입니다.

p_type
    구조체 Phdr 의 이 멤버는, 이 배열 요소가 기술하고 있는 세그먼트(segment)의 종류를 나타내, 어떻게 배열 요소를 해석해야할 것인가를 나타냅니다.

    PT_NULL
        이 배열 요소는 사용하고 있지 않습니다. 또, 다른 멤버의 값은 미정도리입니다. 이것에 의해, 프로그램 헤더중에 무시되는 엔트리를 가질 수 있습니다.
    PT_LOAD
        이 배열 요소는, 로드 가능한 세그먼트(segment)를 지정합니다. 이것은 p_filesz (와)과 p_memsz 그리고 기술됩니다. 파일로부터의 바이트는, 메모리세그먼트의 선두에 MAP 됩니다. 세그먼트(segment)의 메모 리사이즈 (p_memsz) 하지만 파일 사이즈 (p_filesz) 보다 크다면, “여분의” 바이트는, 값 0 을 가져, 세그먼트(segment)의 초기화된 area에 계속되는 것이라고 정의됩니다. 파일 사이즈는, 메모 리사이즈를 넘어 되지 않습니다. 프로그램 헤더 테이블안의 로드 가능한 세그먼트(segment) 엔트리는, 승순으로 나타납니다. 그리고, p_vaddr 멤버로 정렬 됩니다.
    PT_DYNAMIC
        이 배열 요소는, 동적 링크 정보를 지정합니다.
    PT_INTERP
        이 배열 요소는, 인터프리터로서 기동하는 널 캐릭터로 끝나는 패스명의 장소와 크기를 지정합니다. 이 세그먼트(segment) 타입은, 실행 가능 파일만으로 의미가 있습니다 (본세그먼트(segment) 타입은, 공유 오브젝트중에 있을지도 모릅니다). 본세그먼트(segment)는, 파일중에서 복수개 존재해 되지 않습니다. 존재하는 경우, 전로드 가능 세그먼트(segment) 엔트리에 선행할 필요가 있습니다.
    PT_NOTE
        이 배열 요소는, 보조 정보를 위해서(때문에) 장소와 크기를 지정합니다.
    PT_SHLIB
        이 세그먼트(segment) 타입은, 예약되고 있어 명기되어 있지 않은 시멘틱스를 가집니다. 이 타입의 배열 요소를 포함한 프로그램은, ABI 에 따르지 않습니다.
    PT_PHDR
        이 배열 요소가 존재하는 경우, 파일중과 메모리 이미지중에 있어서의, 프로그램 헤더 테이블 자신의 위치와 크기를 지정합니다. 본세그먼트(segment) 타입은, 파일중에서 복수개 존재해 되지 않습니다. 게다가 프로그램 헤더 테이블이 프로그램의 메모리 이미지에 포함되는 경우만, 존재가 용서됩니다. 존재하는 경우, 전로드 가능 세그먼트(segment) 엔트리에 선행할 필요가 있습니다.
    PT_LOPROC
        이 값으로부터 PT_HIPROC 이하는, 프로세서 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.
    PT_HIPROC
        이 값으로부터 PT_LOPROC 이상은, 프로세서 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.

p_offset
    이 멤버는, 세그먼트(segment)의 최초의 바이트에의, 파일 선두로부터의 오프셋(offset)를 가집니다.
p_vaddr
    이 멤버는, 세그먼트(segment)의 최초의 바이트가 메모리로 존재하는 가상 주소를 가집니다.
p_paddr
    물리 애드레싱의 시스템상에서는, 이 멤버는, 세그먼트(segment)의 물리 주소를 위해서(때문에) 예약되고 있습니다. BSD 그럼, 본멤버는 사 되지 않고, 0 일 필요가 있습니다.
p_filesz
    이 멤버는, 세그먼트(segment)의 파일 이미지의 바이트수를 가집니다. 0 일지도 모릅니다.
p_memsz
    이 멤버는, 세그먼트(segment)의 메모리 이미지의 바이트수를 가집니다. 0 일지도 모릅니다.
p_flags
    이 멤버는, 세그먼트(segment)에 관계된 플래그를 가집니다.

    PF_X
        실행 가능 세그먼트(segment).
    PF_W
        기입해 가능한 세그먼트(segment).
    PF_R
        읽어내 가능한 세그먼트(segment).

    텍스트 세그먼트(segment)는, 일반적으로 플래그 PF_X (와)과 PF_R (을)를 가집니다. 데이터 세그먼트는, 일반적으로 PF_X, PF_W (와)과 PF_R (을)를 가집니다.
p_align
    이 멤버는, 메모리중 및 파일중에서 세그먼트(segment)가 정렬해야 할 치를 가집니다. 로드 가능한 프로세스는, p_vaddr (와)과 p_offset (을)를 페이지 사이즈로 나눈 너무 적합하는 값을 가질 필요가 있습니다. 0 으로 1 의 값은, 경계 조정이 불필요한 것을 의미합니다. 그렇지 않은 경우, p_align (은)는, 정 (2 의 정수승)일 필요가 있습니다. 그리고, p_vaddr 하 p_offset (을)를 p_align 그리고 나눈 나머지와 동일할 필요가 있습니다.

파일의 섹션 헤더 테이블은, 모든 파일의 섹션의 위치 결정을 가능으로 합니다. 섹션 헤더 테이블은, Elf32_Shdr 또는 Elf64_Shdr 구조체의 배열입니다. ELF 헤더의 e_shoff 멤버는, 섹션 헤더 테이블의, 파일 선두로부터의 바이트 오프셋(offset)를 줍니다. e_shnum (은)는, 섹션 헤더 테이블의 엔트리수를 가집니다. e_shentsize (은)는, 각 엔트리의 크기를 바이트로 가집니다.

섹션 헤더 테이블 인덱스는, 이 배열의 첨자입니다. 섹션 헤더 테이블 인덱스에는, 예약의 것이 있습니다. 오브젝트 파일에는, 다음의 특별한 인덱스에는 섹션이 없습니다:

SHN_UNDEF
    이 값은, 미정도리인가, 존재하지 않는지, 무관계한가, 의미가 없는 섹션 참조를 나타냅니다.
SHN_LORESERVE
    이 값은, 예약의 인덱스의 범위의 하한을 지정합니다.
SHN_LOPROC
    이 값으로부터 SHN_HIPROC 이하는, 프로세서 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.
SHN_HIPROC
    이 값으로부터 SHN_LOPROC 이상은, 프로세서 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.
SHN_ABS
    이 값은, 대응하는 참조가 절대치인 것을 지정합니다. 예를 들면, 섹션 번호 SHN_ABS (으)로부터의 상대로 정의되고 있는 심볼은, 절대적인 수치를 가져, 재배치에 의해 영향을 받지 않습니다.
SHN_COMMON
    이 섹션으로부터의 상대로 정의되는 심볼은, 공통 심볼이며, Fortran 의 COMMON 나 area가 확보되어 있지 않은 C 의 외부 변수가 해당합니다.
SHN_HIRESERVE
    이 값은, 예약 인덱스 범위의 상한을 지정합니다. 이 범위는, SHN_LORESERVE (와)과 SHN_HIRESERVE 의 사이이며, 양단을 포함합니다. 섹션 헤더 테이블은, 예약의 인덱스를 위해서(때문에) 엔트리를 포함하지 않습니다.

섹션 헤더는, 이하의 구조체를 가집니다:

    typedef struct {
    	Elf32_Word      sh_name;
    	Elf32_Word      sh_type;
    	Elf32_Word      sh_flags;
    	Elf32_Addr      sh_addr;
    	Elf32_Off       sh_offset;
    	Elf32_Size      sh_size;
    	Elf32_Word      sh_link;
    	Elf32_Word      sh_info;
    	Elf32_Size      sh_addralign;
    	Elf32_Size      sh_entsize;
    } Elf32_Shdr;

    typedef struct {
    	Elf64_Half      sh_name;
    	Elf64_Half      sh_type;
    	Elf64_Size      sh_flags;
    	Elf64_Addr      sh_addr;
    	Elf64_Off       sh_offset;
    	Elf64_Size      sh_size;
    	Elf64_Half      sh_link;
    	Elf64_Half      sh_info;
    	Elf64_Size      sh_addralign;
    	Elf64_Size      sh_entsize;
    } Elf64_Shdr;

sh_name
    이 멤버는, 섹션의 이름을 지정합니다. 그 값은, 섹션 헤더 캐릭터 라인 테이블 섹션에의 인덱스이며, 널 캐릭터로 끝나는 캐릭터 라인의 장소를 줍니다.
sh_type
    이 멤버는, 섹션의 내용과 시멘틱스를 분류합니다.

    SHT_NULL
        이 값은, 섹션 헤더가 불활성인 것을 나타냅니다. 관련 지을 수 있었던 섹션을 가지지 않습니다. 섹션 헤더의 다른 멤버는, 미정의치를 가집니다.
    SHT_PROGBITS
        이 섹션은, 프로그램에 의해 정의되는 정보를 가집니다. 포맷과 의미는, 프로그램인 만큼 따라서만 결정됩니다.
    SHT_SYMTAB
        이 섹션은, 심볼 테이블을 가집니다. 일반적으로, SHT_SYMTAB (은)는 링크 에디트를 위한 심볼을 제공합니다. 이것은 또, 동적 링크에도 사용 가능합니다. 이것은 완전한 심볼 테이블이기 (위해)때문에, 동적 링크를 위해서(때문에)는 불필요한 많은 심볼을 포함한 경우가 있습니다. 오브젝트 파일은, SHN_DYNSYM 섹션도 포함할 수가 있습니다.
    SHT_STRTAB
        이 섹션은, 캐릭터 라인 테이블을 가집니다. 오브젝트 파일은, 복수의 캐릭터 라인 테이블 섹션을 가질 수 있습니다.
    SHT_RELA
        이 섹션은, 명시적인 가수를 가지는, 재배치 엔트리를 가집니다. 예를 들면, 오브젝트 파일의 32 비트 클래스의 타입 Elf32_Rela 하지만 해당합니다. 오브젝트는, 복수의 재배치 섹션을 가질 수 있습니다.
    SHT_HASH
        이 섹션은, 심볼 해시 테이블을 가집니다. 동적 링크에 관련하는 전오브젝트는, 심볼 해시 테이블을 포함할 필요가 있습니다. 오브젝트 파일은, 단일의 해시 테이블만을 가질 수 있습니다.
    SHT_DYNAMIC
        이 섹션은, 동적 링크를 위해서(때문에) 정보를 가집니다. 오브젝트 파일은, 단일의 동적 섹션만을 가질 수 있습니다.
    SHT_NOTE
        이 섹션은, 약간의 방법으로 파일에 표를 하는 정보를 가집니다.
    SHT_NOBITS
        이 타입의 섹션은, 파일중의 공간을 점유 하지 않습니다만, SHN_PROGBITS (을)를 닮아 있습니다. 이 섹션은 바이트를 포함하지 않습니다만, sh_offset 멤버는 개념상의 파일 오프셋(offset)를 포함합니다.
    SHT_REL
        이 섹션은, 명시적인 가수 없음의 재배치 오프셋(offset)를 가집니다. 예를 들면, 오브젝트 파일의 32 비트 클래스의 타입 Elf32_Rel 하지만 해당합니다. 오브젝트 파일은, 복수의 재배치 섹션을 가질 수 있습니다.
    SHT_SHLIB
        이 섹션은, 예약되고 있어 명기되어 있지 않은 시멘틱스를 가집니다.
    SHT_DYNSYM
        이 섹션은, 동적 링크 심볼의 최소세트를 가집니다. 오브젝트 파일은, SHN_SYMTAB 섹션도 포함할 수가 있습니다.
    SHT_LOPROC
        이 값으로부터 SHT_HIPROC 이하는, 프로세서 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.
    SHT_HIPROC
        이 값으로부터 SHT_LOPROC 이상은, 프로세서 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.
    SHT_LOUSER
        이 값은, 응용 프로그램을 위해서(때문에) 예약되고 있다 인덱스 범위의 하한을 지정합니다.
    SHT_HIUSER
        이 값은, 응용 프로그램을 위해서(때문에) 예약되고 있다 인덱스 범위의 상한을 지정합니다. SHT_LOUSER (와)과 SHT_HIUSER 의 사이의 섹션 타입은, 어플리케이션에 의해 사용 가능하고, 현재 또는 장래의 시스템 정의 섹션 타입과 충돌하지 않습니다.

sh_flags
    섹션은, 잡다한 속성을 기술하는 1 비트 플래그를 서포트합니다. flag bit가 sh_flags 그리고 세트 된다면, 그 섹션의 속성은 “온” (이)가 됩니다. 그렇지 않으면, 속성은 “오프” 인지, 들어맞지 않습니다. 미정도리 속성은, 0 에 세트 됩니다.

    SHF_WRITE
        섹션은, 프로세스 실행동안, 기입 가능이어야 할 데이터를 포함합니다.
    SHF_ALLOC
        섹션은, 프로세스 실행동안, 메모리를 점유 합니다. 제어 섹션에는, 오브젝트 파일의 메모리 이미지로 존재하지 않는 것이 있습니다. 그러한 섹션에서는, 이 속성은 오프입니다.
    SHF_EXECINSTR
        섹션은, 실행 가능한 기계어 인스트럭션을 포함합니다.
    SHF_MASKPROC
        이 마스크로 포함되는 모든 비트는, 프로세서 고유의 시멘틱스를 위해서(때문에) 확보됩니다.

sh_addr
    섹션이 프로세스의 메모리 이미지에 나타나는 경우, 이 멤버는, 섹션의 최초의 바이트가 존재하는 주소를 가집니다. 그렇지 않은 경우, 이 멤버는 0 을 포함합니다.
sh_offset
    이 멤버치는, 이 섹션의, 파일 선두로부터의 바이트 오프셋(offset)를 줍니다. 1 개의 섹션 타입, 즉 SHT_NOBITS (은)는, 파일중의 공간을 점유 하지 않고, 그 sh_offset 멤버는, 파일중의 개념상의 위치를 지정합니다.
sh_size
    이 멤버는, 섹션의 바이트에서의 크기를 가집니다. 섹션 타입이 SHT_NOBITS (이)가 아닌 한, 섹션은 파일중의 sh_size 바이트를 점유 합니다. 타입 SHT_NOBITS 의 섹션은 0 이외의 크기를 가질 수 있습니다만, 파일중의 공간을 점유 하지 않습니다.
sh_link
    이 멤버는, 섹션 헤더 테이블 인덱스 링크를 가집니다. 이 해석은, 섹션 타입 의존입니다.
sh_info
    이 멤버는, 추가 정보를 가집니다. 이 해석은, 섹션 타입 의존입니다.
sh_addralign
    약간의 섹션에는, 주소 경계의 제약이 있습니다. 섹션이 더블 워드를 가진다면, 시스템은 더블 워드 경계를 섹션 전체에 프로텍션할 필요가 있습니다. sh_addr 의 값은, sh_addralign 그리고 나눈 값이 0 이 되는 것이 필요합니다. 0 으로 정의 2 의 멱승만이 용서됩니다. 0 또는 1 의 값은, 섹션에는 경계의 제약이 없는 것을 의미합니다.
sh_entsize
    약간의 섹션은, 고정장 엔트리의 테이블을 가집니다. 예를 들면 심볼 테이블이 이것에 해당합니다. 그러한 섹션을 위해서(때문에), 이 멤버는, 각 엔트리의 바이트에서의 크기를 줍니다. 섹션이 고정 사이즈의 엔트리의 테이블을 가지지 않는다면, 이 멤버는 0 을 포함합니다.

여러가지 섹션이, 프로그램과 제어 정보를 가집니다:
.bss
    이 섹션은 초기화되지 않는 데이터를 가져, 프로그램의 메모리 이미지가 됩니다. 정의에서는, 프로그램 개시시에 시스템이 데이터를 0 초기화합니다. 이 섹션은, 타입 SHT_NOBITS 입니다. 속성 타입은, SHF_ALLOC (와)과 SHF_WRITE 입니다.
.comment
    이 섹션은, 버젼 제어 정보를 가집니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 속성 타입은 사용되지 않습니다.
.data
    이 섹션은 초기화된 데이터를 가져, 프로그램의 메모리 이미지가 됩니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 속성 타입은, SHF_ALLOC (와)과 SHF_WRITE 입니다.
.data1
    이 섹션은 초기화된 데이터를 가져, 프로그램의 메모리 이미지가 됩니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 속성 타입은, SHF_ALLOC (와)과 SHF_WRITE 입니다.
.debug
    이 섹션은, 신보릭크데밧깅을 위한 정보를 가집니다. 내용은, 명기되어 있지 않습니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 속성 타입은 사용되지 않습니다.
.dynamic
    이 섹션은, 동적 링크 정보를 가집니다. 섹션의 속성은, SHF_ALLOC 비트를 포함합니다. SHF_WRITE 비트가 세트 되는지 아닌지는, 프로세서 의존입니다. 이 섹션은, 타입 SHT_DYNAMIC 입니다. 위의 속성을 봐 주세요.
.dynstr
    이 섹션은, 동적 링크를 위해서(때문에) 필요하게 되는 캐릭터 라인을 가집니다. 그리고 일반적으로는, 이름을 표현하는 캐릭터 라인이며, 심볼 테이블 엔트리와 연결시킬 수 있고 있습니다. 이 섹션은, 타입 SHT_STRTAB 입니다. 사용되는 속성 타입은, SHF_ALLOC 입니다.
.dynsym
    이 섹션은, 동적 링크 심볼 테이블을 가집니다. 이 섹션은, 타입 SHT_DYNSYM 입니다. 사용되는 속성은, SHF_ALLOC 입니다.
.fini
    이 섹션은, 프로세스 종료 코드의 실행 가능 인스트럭션을 가집니다. 프로그램의 정상 종료시에, 시스템은 이 섹션의 코드를 실행합니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 사용되는 속성은, SHF_ALLOC (와)과 SHF_EXECINSTR 입니다.
.got
    이 섹션은, 글로벌 오프셋(offset) 테이블을 가집니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 속성은, 프로세서 의존입니다.
.hash
    이 섹션은, 심볼 해시 테이블을 가집니다. 이 섹션은, 타입 SHT_HASH 입니다. 사용되는 속성은, SHF_ALLOC 입니다.
.init
    이 섹션은, 프로세스 초기화 코드의 실행 가능 인스트럭션을 가집니다. 프로그램 실행 개시시에, 메인 프로그램 엔트리 포인트를 호출하기 전에, 시스템은 이 섹션의 코드를 실행합니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 사용되는 속성은, SHF_ALLOC (와)과 SHF_EXECINSTR 입니다.
.interp
    이 섹션은, 프로그램 인터프리터의 패스명을 가집니다. 파일이 이 섹션을 포함한 로드 가능한 세그먼트(segment)를 가진다면, 섹션의 속성은 SHF_ALLOC 비트를 포함합니다. 그렇지 않은 경우, 이 비트는 오프입니다. 이 섹션은, 타입 SHT_PROGBITS 입니다.
.line
    이 섹션은 신보릭크데밧깅을 위해서(때문에) 행 번호 정보를 가집니다. 이것은, 프로그램 소스와 머신 코드의 사이의 관계를 기술합니다. 내용은, 명기되어 있지 않습니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 속성 타입은 사용되지 않습니다.
.note
    이 섹션은, 아래에서 기술된다 “Note Section” 포맷으로, 정보를 가집니다. 이 섹션은, 타입 SHT_NOTE 입니다. 속성 타입은 사용되지 않습니다.
.plt
    이 섹션은, 프로시저 링키지 테이블을 가집니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 속성은 프로세서 의존입니다.
.relNAME
    이 섹션은, 아래와 같이 재배치 정보를 가집니다. 파일이 재배치를 포함한 로드 가능한 세그먼트(segment)를 가진다면, 섹션의 속성은 SHF_ALLOC 비트를 포함합니다. 그렇지 않은 경우, 이 비트는 오프입니다. 규약에 의해, 재배치되는 섹션으로부터 “NAME” 하지만 주어집니다. .text (을)를 위한 재배치 섹션은, 통상 이름 .rel.text (을)를 가집니다. 이 섹션은, 타입 SHT_REL 입니다.
.relaNAME
    이 섹션은, 아래와 같이 재배치 정보를 가집니다. 파일이 재배치를 포함한 로드 가능한 세그먼트(segment)를 가진다면, 섹션의 속성은 SHF_ALLOC 비트를 포함합니다. 그렇지 않은 경우, 이 비트는 오프입니다. 규약에 의해, 재배치되는 섹션으로부터 “NAME” 하지만 주어집니다. .text (을)를 위한 재배치 섹션은, 통상 이름 .rela.text (을)를 가집니다. 이 섹션은, 타입 SHT_RELA 입니다.
.rodata
    이 섹션은 읽어내 전용 데이터를 가져, 전형적으로는 프로세스 이미지의 기입 불가 세그먼트(segment)가 됩니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 사용되는 속성은, SHF_ALLOC 입니다.
.rodata1
    이 섹션은 읽어내 전용 데이터를 가져, 전형적으로는 프로세스 이미지의 기입 불가 세그먼트(segment)가 됩니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 사용되는 속성은, SHF_ALLOC 입니다.
.shstrtab
    이 섹션은 섹션명을 가집니다. 이 섹션은, 타입 SHT_STRTAB 입니다. 속성 타입은 사용되지 않습니다.
.strtab
    이 섹션은 캐릭터 라인을 가집니다. 일반적으로는 이름을 표시하는 캐릭터 라인이며, 심볼 테이블 엔트리와 연결시킬 수 있고 있습니다. 파일이 심볼 캐릭터 라인 테이블을 포함한 로드 가능한 세그먼트(segment)를 가진다면, 섹션의 속성은 SHF_ALLOC 비트를 포함합니다. 그렇지 않은 경우, 이 비트는 오프입니다. 이 섹션은, 타입 SHT_STRTAB 입니다.
.symtab
    이 섹션은, 심볼 테이블을 가집니다. 파일이 심볼 테이블을 포함한 로드 가능한 세그먼트(segment)를 가진다면, 섹션의 속성은 SHF_ALLOC 비트를 포함합니다. 그렇지 않은 경우, 이 비트는 오프입니다. 이 섹션은, 타입 SHT_SYMTAB 입니다.
.text
    이 섹션은, 프로그램의 “텍스트” , 즉 실행 가능 인스트럭션을 가집니다. 이 섹션은, 타입 SHT_PROGBITS 입니다. 사용되는 속성은, SHF_ALLOC (와)과 SHF_EXECINSTR 입니다.

캐릭터 라인 테이블 섹션은, 널 캐릭터로 끝나는 캐릭터 순차 순서군을 가집니다. 이것들은, 일반적으로 캐릭터 라인으로 불립니다. 오브젝트 파일은, 심볼과 섹션명을 표현하기 위해서 이러한 캐릭터 라인을 사용합니다. 캐릭터 라인 테이블 섹션의 인덱스로서 캐릭터 라인을 참조합니다. 최초의 바이트 (인덱스 0)는, 단일의 널 캐릭터를 가진다고 정의됩니다. 같이 캐릭터 라인 테이블의 최종 바이트는 널 캐릭터이다고 정의되고 것으로, 캐릭터 라인 전체가 널 종단 되고 있는 것을 프로텍션합니다.

오브젝트 파일의 심볼 테이블은, 프로그램의 심볼 정의와 참조의 위치 결정에 필요한 정보를 보관 유지합니다. 심볼 테이블 인덱스는, 이 배열의 첨자입니다.

    typedef struct {
    	Elf32_Word      st_name;
    	Elf32_Addr      st_value;
    	Elf32_Size      st_size;
    	unsigned char   st_info;
    	unsigned char   st_other;
    	Elf32_Half      st_shndx;
    } Elf32_Sym;

    typedef struct {
    	Elf64_Half      st_name;
    	unsigned char   st_info;
    	unsigned char   st_other;
    	Elf64_Quarter   st_shndx;
    	Elf64_Addr      st_value;
    	Elf64_Size      st_size;
    } Elf64_Sym;

st_name
    이 멤버는, 오브젝트 파일의 심볼 캐릭터 라인 테이블에의 인덱스를 가집니다. 심볼 캐릭터 라인 테이블은, 심볼명의 캐릭터 표현을 가집니다. 값이 0 이외이다면, 그것은 심볼명을 주는 캐릭터 라인 테이블 인덱스를 나타냅니다. 그렇지 않은 경우, 심볼 테이블에는 이름이 없습니다.
st_value
    이 멤버는, 관련한 심볼의 값을 줍니다.
st_size
    많은 심볼은, 관련한 크기를 가집니다. 심볼에는 크기가 없는가 미지인 경우, 이 멤버는 0 입니다.
st_info
    이 멤버는, 심볼의 타입과 속박 속성을 지정합니다:

    STT_NOTYPE
        심볼의 타입은, 정의되지 않습니다.
    STT_OBJECT
        심볼은, 데이터 오브젝트와 연결시킬 수 있고 있습니다.
    STT_FUNC
        심볼은, 함수 또는 다른 실행 가능 코드와 연결시킬 수 있고 있습니다.
    STT_SECTION
        심볼은, 섹션과 연결시킬 수 있고 있습니다. 이 타입의 심볼 테이블 엔트리는, 주로 재배치를 위해서(때문에) 존재해, 통상 STB_LOCAL 속박을 가집니다.
    STT_FILE
        규약에 의해, 심볼의 이름은, 오브젝트 파일과 관련하는 원시 파일의 이름을 줍니다. 존재하는 경우, 파일 심볼은 STB_LOCAL 속박을 가져, 그 섹션 인덱스는 SHN_ABS (이어)여, 그것은 파일의 다른 STB_LOCAL 심볼에 선행합니다.
    STT_LOPROC
        이 값으로부터 STT_HIPROC 이하는, 프로세서에 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.
    STT_HIPROC
        이 값으로부터 STT_LOPROC 이상은, 프로세서에 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.

    STB_LOCAL
        로컬인 심볼은, 그러한 정의를 포함하고 있는 오브젝트 파일의 외측에는, 보이지 않습니다. 같은 이름의 로컬인 심볼은, 서로의 방해를 하는 일 없이 복수 파일로 존재 할 수 있습니다.
    STB_GLOBAL
        글로벌 심볼은, 결합되고 있는 모든 오브젝트 파일로부터 보입니다. 어느 파일에 의한 글로벌 심볼의 정의는, 별파일의 같은 심볼의 미정도리 참조를 만족시킵니다.
    STB_WEAK
        약한 심볼은 글로벌 심볼을 닮아 있습니다. 그러나, 그들의 정의는 낮은 우선 순위를 가집니다.
    STB_LOPROC
        이 값으로부터 STB_HIPROC 이하는, 프로세서에 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.
    STB_HIPROC
        이 값으로부터 STB_LOPROC 이상은, 프로세서에 고유의 시멘틱스를 위해서(때문에) 예약되고 있습니다.

        속박과 타입 필드의 팩 및 unpack용의 매크로가 있습니다:

            ELF32_ST_BIND(info) 또는 ELF64_ST_BIND(info) (은)는, 속박을 st_info 치로부터 서랍.
            ELF64_ST_TYPE(info) 또는 ELF32_ST_TYPE(info) (은)는, 타입을 st_info 치로부터 서랍.
            ELF32_ST_INFO(bind, type) 또는 ELF64_ST_INFO(bind, type) (은)는, 속박과 타입을 st_info 치에 변환합니다.

st_other
    이 멤버는, 현재 0 을 가져, 정의된 의미를 가지지 않습니다.
st_shndx
    모든 심볼 테이블 엔트리는, 하등의 동작에 관해서 “정의되고 있습니다” 이 멤버는, 관련하는 섹션 헤더 테이블 인덱스를 가집니다.

재배치는, 심볼 참조와 심볼 정의를 접속하는 처리입니다. 재배치 가능한 파일은, 그러한 섹션 내용의 수정 방법을 기술하는 정보를 가질 필요가 있습니다. 이와 같이 해, 실행 가능 파일과 공유 오브젝트 파일이, 프로세스의 프로그램 이미지를 위한 올바른 정보를 가질 수 있습니다. 재배치 엔트리는, 이러한 데이터입니다.

가수를 필요로 하지 않는 재배치 구조체:

    typedef struct {
    	Elf32_Addr      r_offset;
    	Elf32_Word      r_info;
    } Elf32_Rel;

    typedef struct {
    	Elf64_Addr      r_offset;
    	Elf64_Size      r_info;
    } Elf64_Rel;

가수를 필요로 하는 재배치 구조체:

    typedef struct {
    	Elf32_Addr      r_offset;
    	Elf32_Word      r_info;
    	Elf32_Sword     r_addend;
    } Elf32_Rela;

    typedef struct {
    	Elf64_Addr      r_offset;
    	Elf64_Size      r_info;
    	Elf64_Off       r_addend;
    } Elf64_Rela;

r_offset
    이 멤버는, 재배치 동작을 적용하는 장소를 줍니다. 재배치 가능한 파일에서는, 값은, 재배치에 의해 영향을 받는 기억 단위의 섹션 선두로부터의 바이트 오프셋(offset)입니다. 실행 가능 파일 또는 공용 오브젝트에서는, 값은, 재배치에 의해 영향을 받는 기억 단위의 가상 주소입니다.
r_info
    이 멤버는, 재배치되는 심볼 테이블 인덱스와 사용하는 재배치의 타입을 줍니다. 재배치 타입은, 프로세서 의존입니다. 텍스트가 재배치 엔트리의 재배치 타입 또는 심볼 테이블 인덱스를 참조할 때, 엔트리의 r_info 멤버에 대해, 각각 ELF_[32|64]_R_TYPE 또는 ELF[32|64]_R_SYM (을)를 적용하는 결과를 의미하고 있습니다.
r_addend
    이 멤버는, 정수의 가수를 지정합니다. 이것은, 재배치 가능한 필드에 격납되는 값을 계산하기 위해서 사용됩니다.

관련 항목
as(1), gdb(1), ld(1), objdump(1), execve(2), core(5) Hewlett Packard, Elf-64 Object File Format. Santa Cruz Operation, System V Application Binary Interface. Unix System Laboratories, Object Files, Executable and Linking Format (ELF).

역사
ELF 헤더 파일은, FreeBSD 2.2.6 그리고 등장했습니다. ELF 자신은, 최초로 AT&T UNIX 그리고 등장했습니다. ELF 포맷은, 표준으로서 채용되고 있습니다.

저자
이 메뉴얼 페이지는, BSDi 의 BSD/OS elf(5) 의 메뉴얼 페이지에 촉발 되어, Jeroen Ruigrok van der Werven <asmodai@FreeBSD.org> 하지만 썼습니다.