Search notes:

elf.h

This file defines standard ELF types, structures and macros.

Some interesting portions of the file

Typedefs

/* Type for a 16-bit quantity.  */
typedef uint16_t Elf64_Half;

/* Types for signed and unsigned 32-bit quantities.  */
typedef uint32_t Elf64_Word;
typedef int32_t  Elf64_Sword;

/* Types for signed and unsigned 64-bit quantities.  */
typedef uint64_t Elf64_Xword;
typedef int64_t  Elf64_Sxword;

/* Type of addresses.  */
typedef uint64_t Elf64_Addr;

/* Type of file offsets.  */
typedef uint64_t Elf64_Off;

/* Type for section indices, which are 16-bit quantities.  */
typedef uint16_t Elf64_Section;

/* Type for version symbol information.  */
typedef Elf64_Half Elf64_Versym;

Elf64_Ehdr (File header)

Elf64_Ehdr represents the ELF file header which appears at the start of every ELF file.
#define EI_NIDENT (16)

typedef struct
{
  unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */
  Elf64_Half    e_type;                 /* Object file type                  see ET_ macros */
  Elf64_Half    e_machine;              /* Architecture                     */
  Elf64_Word    e_version;              /* Object file version              */
  Elf64_Addr    e_entry;                /* Entry point virtual address      */
  Elf64_Off     e_phoff;                /* Program header table file offset */
  Elf64_Off     e_shoff;                /* Section header table file offset */
  Elf64_Word    e_flags;                /* Processor-specific flags         */
  Elf64_Half    e_ehsize;               /* ELF header size in bytes         */
  Elf64_Half    e_phentsize;            /* Program header table entry size */
  Elf64_Half    e_phnum;                /* Program header table entry count */
  Elf64_Half    e_shentsize;            /* Section header table entry size */
  Elf64_Half    e_shnum;                /* Section header table entry count */
  Elf64_Half    e_shstrndx;             /* Section header string table index */
} Elf64_Ehdr;

Legal values for e_type

#define ET_NONE         0               /* No file type                   */
#define ET_REL          1               /* Relocatable file               */
#define ET_EXEC         2               /* Executable file                */
#define ET_DYN          3               /* Shared object file             */
#define ET_CORE         4               /* Core file                      */
#define ET_NUM          5               /* Number of defined types        */
#define ET_LOOS         0xfe00          /* OS-specific range start        */
#define ET_HIOS         0xfeff          /* OS-specific range end          */
#define ET_LOPROC       0xff00          /* Processor-specific range start */
#define ET_HIPROC       0xffff          /* Processor-specific range end   */

Legal values for e_machine

Some interesting values for e_machine:
#define EM_NONE          0      /* No machine */
  …
#define EM_386           3      /* Intel 80386 */
  …
#define EM_X86_64       62      /* AMD x86-64 architecture */
  …
#define EM_MMIX         80      /* Donald Knuth's educational 64-bit proc */
  …
#define EM_AARCH64      183     /* ARM AARCH64 */
  …
#define EM_CUDA         190     /* NVIDIA CUDA */
  …
#define EM_BPF          247     /* Linux BPF -- in-kernel virtual machine */
#define EM_CSKY         252     /* C-SKY */
#define EM_NUM          253

Legal values for e_version

#define EV_NONE         0               /* Invalid ELF version                                  */
#define EV_CURRENT      1               /* Current version, will be increased if versin changes */
#define EV_NUM          2

Displaying the ELF header

An ELF object file's header can be displayed with readelf -h
$ readelf -h unit.o
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          648 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           64 (bytes)
  Number of section headers:         12
  Section header string table index: 11

EI_…

#define EI_OSABI                7            /* OS ABI identification */

#define ELFOSABI_SYSV           0            /* Alias.  */
  …
#define ELFOSABI_GNU            3            /* Object uses GNU ELF extensions.  */
#define ELFOSABI_LINUX          ELFOSABI_GNU /* Compatibility alias.  */
  …
#define ELFOSABI_STANDALONE     255          /* Standalone (embedded) application */

Elf64_Shdr (Section header)

typedef struct
{
  Elf64_Word    sh_name;                /* Section name (string tbl index) */
  Elf64_Word    sh_type;                /* Section type */
  Elf64_Xword   sh_flags;               /* Section flags */
  Elf64_Addr    sh_addr;                /* Section virtual addr at execution */
  Elf64_Off     sh_offset;              /* Section file offset */
  Elf64_Xword   sh_size;                /* Section size in bytes */
  Elf64_Word    sh_link;                /* Link to another section */
  Elf64_Word    sh_info;                /* Additional section information */
  Elf64_Xword   sh_addralign;           /* Section alignment */
  Elf64_Xword   sh_entsize;             /* Entry size if section holds table */
} Elf64_Shdr;

Legel values for sh_type

#define SHT_NULL           0             /* Section header table entry unused */
#define SHT_PROGBITS       1             /* Program data                      */
#define SHT_SYMTAB         2             /* Symbol table, se also SHT_DYNSYM  */
#define SHT_STRTAB         3             /* String table                      */
#define SHT_RELA           4             /* Relocation entries with addends  */
#define SHT_HASH           5             /* Symbol hash table */
#define SHT_DYNAMIC        6             /* Dynamic linking information */
#define SHT_NOTE           7             /* Notes */
#define SHT_NOBITS         8             /* Program space with no data (bss) */
#define SHT_REL            9             /* Relocation entries, no addends   */
#define SHT_SHLIB          10            /* Reserved                         */
#define SHT_DYNSYM         11            /* Dynamic linker symbol table, see also SHT_SYMTAB */
#define SHT_INIT_ARRAY     14            /* Array of constructors                            */
#define SHT_FINI_ARRAY     15            /* Array of destructors                             */
#define SHT_PREINIT_ARRAY  16            /* Array of pre-constructors */
#define SHT_GROUP          17            /* Section group */
#define SHT_SYMTAB_SHNDX   18            /* Extended section indeces */
#define SHT_NUM            19            /* Number of defined types.  */
#define SHT_LOOS           0x60000000    /* Start OS-specific.  */
#define SHT_GNU_ATTRIBUTES 0x6ffffff5    /* Object attributes.  */
#define SHT_GNU_HASH       0x6ffffff6    /* GNU-style hash table.  */
#define SHT_GNU_LIBLIST    0x6ffffff7    /* Prelink library list */
#define SHT_CHECKSUM       0x6ffffff8    /* Checksum for DSO content.  */
#define SHT_LOSUNW         0x6ffffffa    /* Sun-specific low bound.  */
#define SHT_SUNW_move      0x6ffffffa
#define SHT_SUNW_COMDAT    0x6ffffffb
#define SHT_SUNW_syminfo   0x6ffffffc
#define SHT_GNU_verdef     0x6ffffffd    /* Version definition section.  */
#define SHT_GNU_verneed    0x6ffffffe    /* Version needs section.  */
#define SHT_GNU_versym     0x6fffffff    /* Version symbol table.  */
#define SHT_HISUNW         0x6fffffff    /* Sun-specific high bound.  */
#define SHT_HIOS           0x6fffffff    /* End OS-specific type */
#define SHT_LOPROC         0x70000000    /* Start of processor-specific */
#define SHT_HIPROC         0x7fffffff    /* End of processor-specific */
#define SHT_LOUSER         0x80000000    /* Start of application-specific */
#define SHT_HIUSER         0x8fffffff    /* End of application-specific */

Legal values for sh_flags

#define SHF_WRITE            ( 1 <<  0)  /* Writable */
#define SHF_ALLOC            ( 1 <<  1)  /* Occupies memory during execution */
#define SHF_EXECINSTR        ( 1 <<  2)  /* Executable */
#define SHF_MERGE            ( 1 <<  4)  /* Might be merged */
#define SHF_STRINGS          ( 1 <<  5)  /* Contains nul-terminated strings */
#define SHF_INFO_LINK        ( 1 <<  6)  /* `sh_info' contains SHT index */
#define SHF_LINK_ORDER       ( 1 <<  7)  /* Preserve order after combining */
#define SHF_OS_NONCONFORMING ( 1 <<  8)  /* Non-standard OS specific handling required */
#define SHF_GROUP            ( 1 <<  9)  /* Section is member of a group.  */
#define SHF_TLS              ( 1 << 10)  /* Section hold thread-local data.  */
#define SHF_COMPRESSED       ( 1 << 11)  /* Section with compressed data. */
#define SHF_MASKOS           0x0ff00000  /* OS-specific. */
#define SHF_MASKPROC         0xf0000000  /* Processor-specific */
#define SHF_ORDERED          ( 1 << 30)  /* Special ordering requirement (Solaris).  */
#define SHF_EXCLUDE          (1U << 31)  /* Section is excluded unless referenced or allocated (Solaris).*/

Elf64_Section (Symbol table entry)

typedef struct
{
  Elf64_Word    st_name;                /* Symbol name (string tbl index) */
  unsigned char st_info;                /* Symbol type and binding */
  unsigned char st_other;               /* Symbol visibility */
  Elf64_Section st_shndx;               /* Section index */
  Elf64_Addr    st_value;               /* Symbol value */
  Elf64_Xword   st_size;                /* Symbol size */
} Elf64_Sym;
typedef struct
{
  Elf64_Half si_boundto;                /* Direct bindings, symbol bound to */
  Elf64_Half si_flags;                  /* Per symbol flags */
} Elf64_Syminfo;

Possible values for si_boundto

#define SYMINFO_BT_SELF         0xffff  /* Symbol bound to self */
#define SYMINFO_BT_PARENT       0xfffe  /* Symbol bound to parent */
#define SYMINFO_BT_LOWRESERVE   0xff00  /* Beginning of reserved entries */

Possible values for si_flags

#define SYMINFO_FLG_DIRECT      0x0001  /* Direct bound symbol */
#define SYMINFO_FLG_PASSTHRU    0x0002  /* Pass-thru symbol for translator */
#define SYMINFO_FLG_COPY        0x0004  /* Symbol is a copy-reloc */
#define SYMINFO_FLG_LAZYLOAD    0x0008  /* Symbol bound to object to be lazy

Syminfo version values

#define SYMINFO_NONE            0
#define SYMINFO_CURRENT         1
#define SYMINFO_NUM             2

Legal values for the ST_BIND subfield of st_info (symbol binding)

#define STB_LOCAL       0               /* Local symbol */
#define STB_GLOBAL      1               /* Global symbol */
#define STB_WEAK        2               /* Weak symbol */
#define STB_NUM         3               /* Number of defined types.  */
#define STB_LOOS        10              /* Start of OS-specific */
#define STB_GNU_UNIQUE  10              /* Unique symbol.  */
#define STB_HIOS        12              /* End of OS-specific */
#define STB_LOPROC      13              /* Start of processor-specific */
#define STB_HIPROC      15              /* End of processor-specific */

Legal value for the ST_TYPE subfield of st_info (symbol type)

#define STT_NOTYPE      0               /* Symbol type is unspecified */
#define STT_OBJECT      1               /* Symbol is a data object */
#define STT_FUNC        2               /* Symbol is a code object */
#define STT_SECTION     3               /* Symbol associated with a section */
#define STT_FILE        4               /* Symbol's name is file name */
#define STT_COMMON      5               /* Symbol is a common data object */
#define STT_TLS         6               /* Symbol is thread-local data object*/
#define STT_NUM         7               /* Number of defined types.  */
#define STT_LOOS        10              /* Start of OS-specific */
#define STT_GNU_IFUNC   10              /* Symbol is indirect code object */
#define STT_HIOS        12              /* End of OS-specific */
#define STT_LOPROC      13              /* Start of processor-specific */
#define STT_HIPROC      15              /* End of processor-specific */

Elf64_auxv_t (Auxiliary vector)

An auxiliary vector is normally only used by the program interpreter.
The usual definition in an ABI supplement uses the name auxv_t and is usually not defined in <elf.h>.
GNU(?) includ it in <elf.h> because it cannot hurt and renamed it (likely from auxv_t to Elf64_auxv_t) to avoid conflicts.
typedef struct
{
  uint64_t a_type;              /* Entry type */
  union
    {
      uint64_t a_val;           /* Integer value */
      /* We use to have pointer elements added here.  We cannot do that,
         though, since it does not work when using 32-bit definitions
         on 64-bit platforms and vice versa.  */
    } a_un;
} Elf64_auxv_t;
TODO: Is the auxiliary vector used to implement atexit()?
The dynamic linker can be asked to show some debug information about the auxiliary vector by setting the variable LD_SHOW_AUXV=1.
See also
  • man 7 vdso
  • man 3 getauxval
  • /proc/$PID/auxv

Elf64_Phdr (Program header)

The program header is meaningful only for executable and shared object files.
  Elf64_Word    p_type;                 /* Segment type */
  Elf64_Word    p_flags;                /* Segment flags */
  Elf64_Off     p_offset;               /* Segment file offset */
  Elf64_Addr    p_vaddr;                /* Segment virtual address */
  Elf64_Addr    p_paddr;                /* Segment physical address */
  Elf64_Xword   p_filesz;               /* Segment size in file */
  Elf64_Xword   p_memsz;                /* Segment size in memory */
  Elf64_Xword   p_align;                /* Segment alignment */
} Elf64_Phdr;

Legal values for p_flags

#define PF_X            (1 << 0)        /* Segment is executable */
#define PF_W            (1 << 1)        /* Segment is writable */
#define PF_R            (1 << 2)        /* Segment is readable */
#define PF_MASKOS       0x0ff00000      /* OS-specific */
#define PF_MASKPROC     0xf0000000      /* Processor-specific */

Legal values for p_type

#define PT_NULL         0               /* Program header table entry unused */
#define PT_LOAD         1               /* Loadable program segment, described by p_filesz and p_memsz */
#define PT_DYNAMIC      2               /* Dynamic linking information */
#define PT_INTERP       3               /* Program interpreter, may occur at most once */
#define PT_NOTE         4               /* Auxiliary information */
#define PT_SHLIB        5               /* Reserved */
#define PT_PHDR         6               /* Entry for header table itself */
#define PT_TLS          7               /* Thread-local storage segment */
#define PT_NUM          8               /* Number of defined types */

#define PT_LOOS         0x60000000      /* Start of OS-specific */
#define PT_GNU_EH_FRAME 0x6474e550      /* GCC .eh_frame_hdr segment */
#define PT_GNU_STACK    0x6474e551      /* Indicates stack executability */
#define PT_GNU_RELRO    0x6474e552      /* Read-only after relocation */
#define PT_LOSUNW       0x6ffffffa
#define PT_SUNWBSS      0x6ffffffa      /* Sun Specific segment */
#define PT_SUNWSTACK    0x6ffffffb      /* Stack segment */
#define PT_HISUNW       0x6fffffff
#define PT_HIOS         0x6fffffff      /* End of OS-specific */
#define PT_LOPROC       0x70000000      /* Start of processor-specific */
#define PT_HIPROC       0x7fffffff      /* End of processor-specific */
When the kernel executes a program, it is specially interested in the three types PT_LOAD, PT_INTERP and PT_GNU_STACK (but what about PT_GNU_PROPERTY?)
PT_LOAD describes .code and .data sections that come from the executable file and the file of a .bss section.
>>>>>>> c580dd01faebfe296c4d33334fde29c3203a8a0a

See also

/usr/include

Index

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 8 attempt to write a readonly database in /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php:78 Stack trace: #0 /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php(78): PDOStatement->execute(Array) #1 /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php(30): insert_webrequest_('/notes/Linux/fh...', 1759391195, '216.73.216.42', 'Mozilla/5.0 App...', NULL) #2 /home/httpd/vhosts/renenyffenegger.ch/httpsdocs/notes/Linux/fhs/usr/include/elf_h(397): insert_webrequest() #3 {main} thrown in /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php on line 78