Linker and Libraries Guide

ELF Header

Some object file control structures can grow, because the ELF header contains their actual sizes. If the object file format changes, a program can encounter control structures that are larger or smaller than expected. Programs might therefore ignore extra information. The treatment of missing information depends on context and will be specified if and when extensions are defined.

The ELF header has the following structure (defined in sys/elf.h):


#define EI_NIDENT       16
 
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_Half      e_type;
        Elf64_Half      e_machine;
        Elf64_Word      e_version;
        Elf64_Addr      e_entry;
        Elf64_Off       e_phoff;
        Elf64_Off       e_shoff;
        Elf64_Word      e_flags;
        Elf64_Half      e_ehsize;
        Elf64_Half      e_phentsize;
        Elf64_Half      e_phnum;
        Elf64_Half      e_shentsize;
        Elf64_Half      e_shnum;
        Elf64_Half      e_shstrndx;
} Elf64_Ehdr;
e_ident

The initial bytes mark the file as an object file and provide machine-independent data with which to decode and interpret the file's contents. Complete descriptions appear in "ELF Identification".

e_type

This member identifies the object file type.

Table 7-3 ELF File Identifiers

Name 

Value 

Meaning 

ET_NONE

0

No file type 

ET_REL

1

Relocatable file 

ET_EXEC

2

Executable file 

ET_DYN

3

Shared object file 

ET_CORE

4

Core file 

ET_LOPROC

0xff00

Processor-specific 

ET_HIPROC

0xffff

Processor-specific 

Although the core file contents are unspecified, type ET_CORE is reserved to mark the file. Values from ET_LOPROC through ET_HIPROC (inclusive) are reserved for processor-specific semantics. Other values are reserved and will be assigned to new object file types as necessary.

e_machine

This member's value specifies the required architecture for an individual file.

Table 7-4 ELF Machines

Name 

Value 

Meaning  

EM_NONE

0

No machine  

EM_M32

1

AT&T WE 32100  

EM_SPARC

2

SPARC  

EM_386

3

Intel 80386  

EM_68K

4

Motorola 68000  

EM_88K

5

Motorola 88000  

EM_486

6

Intel 80486 

EM_860

7

Intel 80860 

EM_MIPS

8

MIPS RS3000 Big-Endian 

EM_MIPS_RS3_LE

10

MIPS RS3000 Little-Endian 

EM_RS6000

11

RS6000 

EM_PA_RISC

15

PA-RISC 

EM_nCUBE

16

nCUBE 

EM_VPP500

17

Fujitsu VPP500 

EM_SPARC32PLUS

18

Sun SPARC 32+ 

EM_PPC

20

PowerPC 

EM_SPARCV9

43

SPARC V9 

Other values are reserved and will be assigned to new machines as necessary. Processor-specific ELF names use the machine name to distinguish them. For example, the flags mentioned below use the prefix EF_; a flag named WIDGET for the EM_XYZ machine would be called EF_XYZ_WIDGET.

e_version

This member identifies the object file version.

Table 7-5 ELF Versions

Name 

Value 

Meaning  

EV_NONE

0

Invalid version  

EV_CURRENT

>=1

Current version  

The value 1 signifies the original file format; extensions will create new versions with higher numbers. The value of EV_CURRENT changes as necessary to reflect the current version number.

e_entry

This member gives the virtual address to which the system first transfers control, thus starting the process. If the file has no associated entry point, this member holds zero.

e_phoff

This member holds the program header table's file offset in bytes. If the file has no program header table, this member holds zero.

e_shoff

This member holds the section header table's file offset in bytes. If the file has no section header table, this member holds zero.

e_flags

This member holds processor-specific flags associated with the file. Flag names take the form EF_machine_flag. This member is presently zero for SPARC and x86.

Table 7-6 ELF Flags for SPARCV9

Name 

Value 

Meaning  

EF_SPARCV9_MM

0x3

Mask for Memory Model 

EF_SPARCV9_TSO

0x0

Total Store Ordering 

EF_SPARCV9_PSO

0x1

Partial Store Ordering 

EF_SPARCV9_RMO

0x2

Relaxed Memory Ordering 

EF_SPARC_EXT_MASK

0xffff00

Vendor Extension mask 

EF_SPARC_SUN_US1

0x000200

Sun UltraSPARC 1 Extensions 

EF_SPARC_HAL_R1

0x000400

HAL R1 Extensions 

EF_SPARC_SUN_US3

0x000800

Sun UltraSPARC 3 Extensions 

e_ehsize

This member holds the ELF header's size in bytes.

e_phentsize

This member holds the size in bytes of one entry in the file's program header table; all entries are the same size.

e_phnum

This member holds the number of entries in the program header table. Thus the product of e_phentsize and e_phnum gives the table's size in bytes. If a file has no program header table, e_phnum holds the value zero.

e_shentsize

This member holds a section header's size in bytes. A section header is one entry in the section header table; all entries are the same size.

e_shnum

This member holds the number of entries in the section header table. Thus the product of e_shentsize and e_shnum gives the section header table's size in bytes. If a file has no section header table, e_shnum holds the value zero.

e_shstrndx

This member holds the section header table index of the entry associated with the section name string table. If the file has no section name string table, this member holds the value SHN_UNDEF. See "Sections" and "String Table" for more information.