linux/include/linux/elf.h
<<
>>
Prefs
   1#ifndef _LINUX_ELF_H
   2#define _LINUX_ELF_H
   3
   4#include <linux/types.h>
   5#include <asm/elf.h>
   6
   7#ifndef elf_read_implies_exec
   8  /* Executables for which elf_read_implies_exec() returns TRUE will
   9     have the READ_IMPLIES_EXEC personality flag set automatically.
  10     Override in asm/elf.h as needed.  */
  11# define elf_read_implies_exec(ex, have_pt_gnu_stack)   0
  12#endif
  13
  14/* 32-bit ELF base types. */
  15typedef __u32   Elf32_Addr;
  16typedef __u16   Elf32_Half;
  17typedef __u32   Elf32_Off;
  18typedef __s32   Elf32_Sword;
  19typedef __u32   Elf32_Word;
  20
  21/* 64-bit ELF base types. */
  22typedef __u64   Elf64_Addr;
  23typedef __u16   Elf64_Half;
  24typedef __s16   Elf64_SHalf;
  25typedef __u64   Elf64_Off;
  26typedef __s32   Elf64_Sword;
  27typedef __u32   Elf64_Word;
  28typedef __u64   Elf64_Xword;
  29typedef __s64   Elf64_Sxword;
  30
  31/* These constants are for the segment types stored in the image headers */
  32#define PT_NULL    0
  33#define PT_LOAD    1
  34#define PT_DYNAMIC 2
  35#define PT_INTERP  3
  36#define PT_NOTE    4
  37#define PT_SHLIB   5
  38#define PT_PHDR    6
  39#define PT_TLS     7               /* Thread local storage segment */
  40#define PT_LOOS    0x60000000      /* OS-specific */
  41#define PT_HIOS    0x6fffffff      /* OS-specific */
  42#define PT_LOPROC  0x70000000
  43#define PT_HIPROC  0x7fffffff
  44#define PT_GNU_EH_FRAME         0x6474e550
  45
  46#define PT_GNU_STACK    (PT_LOOS + 0x474e551)
  47
  48/* These constants define the different elf file types */
  49#define ET_NONE   0
  50#define ET_REL    1
  51#define ET_EXEC   2
  52#define ET_DYN    3
  53#define ET_CORE   4
  54#define ET_LOPROC 0xff00
  55#define ET_HIPROC 0xffff
  56
  57/* These constants define the various ELF target machines */
  58#define EM_NONE  0
  59#define EM_M32   1
  60#define EM_SPARC 2
  61#define EM_386   3
  62#define EM_68K   4
  63#define EM_88K   5
  64#define EM_486   6   /* Perhaps disused */
  65#define EM_860   7
  66
  67#define EM_MIPS         8       /* MIPS R3000 (officially, big-endian only) */
  68
  69#define EM_MIPS_RS4_BE 10       /* MIPS R4000 big-endian */
  70
  71#define EM_PARISC      15       /* HPPA */
  72
  73#define EM_SPARC32PLUS 18       /* Sun's "v8plus" */
  74
  75#define EM_PPC         20       /* PowerPC */
  76#define EM_PPC64       21       /* PowerPC64 */
  77
  78#define EM_SH          42       /* SuperH */
  79
  80#define EM_SPARCV9     43       /* SPARC v9 64-bit */
  81
  82#define EM_IA_64        50      /* HP/Intel IA-64 */
  83
  84#define EM_X86_64       62      /* AMD x86-64 */
  85
  86#define EM_S390         22      /* IBM S/390 */
  87
  88#define EM_CRIS         76      /* Axis Communications 32-bit embedded processor */
  89
  90#define EM_V850         87      /* NEC v850 */
  91
  92#define EM_M32R         88      /* Renesas M32R */
  93
  94#define EM_H8_300       46      /* Renesas H8/300,300H,H8S */
  95
  96/*
  97 * This is an interim value that we will use until the committee comes
  98 * up with a final number.
  99 */
 100#define EM_ALPHA        0x9026
 101
 102/* Bogus old v850 magic number, used by old tools.  */
 103#define EM_CYGNUS_V850  0x9080
 104
 105/* Bogus old m32r magic number, used by old tools.  */
 106#define EM_CYGNUS_M32R  0x9041
 107
 108/*
 109 * This is the old interim value for S/390 architecture
 110 */
 111#define EM_S390_OLD     0xA390
 112
 113#define EM_FRV          0x5441          /* Fujitsu FR-V */
 114
 115/* This is the info that is needed to parse the dynamic section of the file */
 116#define DT_NULL         0
 117#define DT_NEEDED       1
 118#define DT_PLTRELSZ     2
 119#define DT_PLTGOT       3
 120#define DT_HASH         4
 121#define DT_STRTAB       5
 122#define DT_SYMTAB       6
 123#define DT_RELA         7
 124#define DT_RELASZ       8
 125#define DT_RELAENT      9
 126#define DT_STRSZ        10
 127#define DT_SYMENT       11
 128#define DT_INIT         12
 129#define DT_FINI         13
 130#define DT_SONAME       14
 131#define DT_RPATH        15
 132#define DT_SYMBOLIC     16
 133#define DT_REL          17
 134#define DT_RELSZ        18
 135#define DT_RELENT       19
 136#define DT_PLTREL       20
 137#define DT_DEBUG        21
 138#define DT_TEXTREL      22
 139#define DT_JMPREL       23
 140#define DT_LOPROC       0x70000000
 141#define DT_HIPROC       0x7fffffff
 142
 143/* This info is needed when parsing the symbol table */
 144#define STB_LOCAL  0
 145#define STB_GLOBAL 1
 146#define STB_WEAK   2
 147
 148#define STT_NOTYPE  0
 149#define STT_OBJECT  1
 150#define STT_FUNC    2
 151#define STT_SECTION 3
 152#define STT_FILE    4
 153
 154#define ELF_ST_BIND(x)          ((x) >> 4)
 155#define ELF_ST_TYPE(x)          (((unsigned int) x) & 0xf)
 156#define ELF32_ST_BIND(x)        ELF_ST_BIND(x)
 157#define ELF32_ST_TYPE(x)        ELF_ST_TYPE(x)
 158#define ELF64_ST_BIND(x)        ELF_ST_BIND(x)
 159#define ELF64_ST_TYPE(x)        ELF_ST_TYPE(x)
 160
 161/* Symbolic values for the entries in the auxiliary table
 162   put on the initial stack */
 163#define AT_NULL   0     /* end of vector */
 164#define AT_IGNORE 1     /* entry should be ignored */
 165#define AT_EXECFD 2     /* file descriptor of program */
 166#define AT_PHDR   3     /* program headers for program */
 167#define AT_PHENT  4     /* size of program header entry */
 168#define AT_PHNUM  5     /* number of program headers */
 169#define AT_PAGESZ 6     /* system page size */
 170#define AT_BASE   7     /* base address of interpreter */
 171#define AT_FLAGS  8     /* flags */
 172#define AT_ENTRY  9     /* entry point of program */
 173#define AT_NOTELF 10    /* program is not ELF */
 174#define AT_UID    11    /* real uid */
 175#define AT_EUID   12    /* effective uid */
 176#define AT_GID    13    /* real gid */
 177#define AT_EGID   14    /* effective gid */
 178#define AT_PLATFORM 15  /* string identifying CPU for optimizations */
 179#define AT_HWCAP  16    /* arch dependent hints at CPU capabilities */
 180#define AT_CLKTCK 17    /* frequency at which times() increments */
 181
 182#define AT_SECURE 23   /* secure mode boolean */
 183
 184typedef struct dynamic{
 185  Elf32_Sword d_tag;
 186  union{
 187    Elf32_Sword d_val;
 188    Elf32_Addr  d_ptr;
 189  } d_un;
 190} Elf32_Dyn;
 191
 192typedef struct {
 193  Elf64_Sxword d_tag;           /* entry tag value */
 194  union {
 195    Elf64_Xword d_val;
 196    Elf64_Addr d_ptr;
 197  } d_un;
 198} Elf64_Dyn;
 199
 200/* The following are used with relocations */
 201#define ELF32_R_SYM(x) ((x) >> 8)
 202#define ELF32_R_TYPE(x) ((x) & 0xff)
 203
 204#define ELF64_R_SYM(i)                  ((i) >> 32)
 205#define ELF64_R_TYPE(i)                 ((i) & 0xffffffff)
 206
 207typedef struct elf32_rel {
 208  Elf32_Addr    r_offset;
 209  Elf32_Word    r_info;
 210} Elf32_Rel;
 211
 212typedef struct elf64_rel {
 213  Elf64_Addr r_offset;  /* Location at which to apply the action */
 214  Elf64_Xword r_info;   /* index and type of relocation */
 215} Elf64_Rel;
 216
 217typedef struct elf32_rela{
 218  Elf32_Addr    r_offset;
 219  Elf32_Word    r_info;
 220  Elf32_Sword   r_addend;
 221} Elf32_Rela;
 222
 223typedef struct elf64_rela {
 224  Elf64_Addr r_offset;  /* Location at which to apply the action */
 225  Elf64_Xword r_info;   /* index and type of relocation */
 226  Elf64_Sxword r_addend;        /* Constant addend used to compute value */
 227} Elf64_Rela;
 228
 229typedef struct elf32_sym{
 230  Elf32_Word    st_name;
 231  Elf32_Addr    st_value;
 232  Elf32_Word    st_size;
 233  unsigned char st_info;
 234  unsigned char st_other;
 235  Elf32_Half    st_shndx;
 236} Elf32_Sym;
 237
 238typedef struct elf64_sym {
 239  Elf64_Word st_name;           /* Symbol name, index in string tbl */
 240  unsigned char st_info;        /* Type and binding attributes */
 241  unsigned char st_other;       /* No defined meaning, 0 */
 242  Elf64_Half st_shndx;          /* Associated section index */
 243  Elf64_Addr st_value;          /* Value of the symbol */
 244  Elf64_Xword st_size;          /* Associated symbol size */
 245} Elf64_Sym;
 246
 247
 248#define EI_NIDENT       16
 249
 250typedef struct elf32_hdr{
 251  unsigned char e_ident[EI_NIDENT];
 252  Elf32_Half    e_type;
 253  Elf32_Half    e_machine;
 254  Elf32_Word    e_version;
 255  Elf32_Addr    e_entry;  /* Entry point */
 256  Elf32_Off     e_phoff;
 257  Elf32_Off     e_shoff;
 258  Elf32_Word    e_flags;
 259  Elf32_Half    e_ehsize;
 260  Elf32_Half    e_phentsize;
 261  Elf32_Half    e_phnum;
 262  Elf32_Half    e_shentsize;
 263  Elf32_Half    e_shnum;
 264  Elf32_Half    e_shstrndx;
 265} Elf32_Ehdr;
 266
 267typedef struct elf64_hdr {
 268  unsigned char e_ident[16];            /* ELF "magic number" */
 269  Elf64_Half e_type;
 270  Elf64_Half e_machine;
 271  Elf64_Word e_version;
 272  Elf64_Addr e_entry;           /* Entry point virtual address */
 273  Elf64_Off e_phoff;            /* Program header table file offset */
 274  Elf64_Off e_shoff;            /* Section header table file offset */
 275  Elf64_Word e_flags;
 276  Elf64_Half e_ehsize;
 277  Elf64_Half e_phentsize;
 278  Elf64_Half e_phnum;
 279  Elf64_Half e_shentsize;
 280  Elf64_Half e_shnum;
 281  Elf64_Half e_shstrndx;
 282} Elf64_Ehdr;
 283
 284/* These constants define the permissions on sections in the program
 285   header, p_flags. */
 286#define PF_R            0x4
 287#define PF_W            0x2
 288#define PF_X            0x1
 289
 290typedef struct elf32_phdr{
 291  Elf32_Word    p_type;
 292  Elf32_Off     p_offset;
 293  Elf32_Addr    p_vaddr;
 294  Elf32_Addr    p_paddr;
 295  Elf32_Word    p_filesz;
 296  Elf32_Word    p_memsz;
 297  Elf32_Word    p_flags;
 298  Elf32_Word    p_align;
 299} Elf32_Phdr;
 300
 301typedef struct elf64_phdr {
 302  Elf64_Word p_type;
 303  Elf64_Word p_flags;
 304  Elf64_Off p_offset;           /* Segment file offset */
 305  Elf64_Addr p_vaddr;           /* Segment virtual address */
 306  Elf64_Addr p_paddr;           /* Segment physical address */
 307  Elf64_Xword p_filesz;         /* Segment size in file */
 308  Elf64_Xword p_memsz;          /* Segment size in memory */
 309  Elf64_Xword p_align;          /* Segment alignment, file & memory */
 310} Elf64_Phdr;
 311
 312/* sh_type */
 313#define SHT_NULL        0
 314#define SHT_PROGBITS    1
 315#define SHT_SYMTAB      2
 316#define SHT_STRTAB      3
 317#define SHT_RELA        4
 318#define SHT_HASH        5
 319#define SHT_DYNAMIC     6
 320#define SHT_NOTE        7
 321#define SHT_NOBITS      8
 322#define SHT_REL         9
 323#define SHT_SHLIB       10
 324#define SHT_DYNSYM      11
 325#define SHT_NUM         12
 326#define SHT_LOPROC      0x70000000
 327#define SHT_HIPROC      0x7fffffff
 328#define SHT_LOUSER      0x80000000
 329#define SHT_HIUSER      0xffffffff
 330
 331/* sh_flags */
 332#define SHF_WRITE       0x1
 333#define SHF_ALLOC       0x2
 334#define SHF_EXECINSTR   0x4
 335#define SHF_MASKPROC    0xf0000000
 336
 337/* special section indexes */
 338#define SHN_UNDEF       0
 339#define SHN_LORESERVE   0xff00
 340#define SHN_LOPROC      0xff00
 341#define SHN_HIPROC      0xff1f
 342#define SHN_ABS         0xfff1
 343#define SHN_COMMON      0xfff2
 344#define SHN_HIRESERVE   0xffff
 345 
 346typedef struct {
 347  Elf32_Word    sh_name;
 348  Elf32_Word    sh_type;
 349  Elf32_Word    sh_flags;
 350  Elf32_Addr    sh_addr;
 351  Elf32_Off     sh_offset;
 352  Elf32_Word    sh_size;
 353  Elf32_Word    sh_link;
 354  Elf32_Word    sh_info;
 355  Elf32_Word    sh_addralign;
 356  Elf32_Word    sh_entsize;
 357} Elf32_Shdr;
 358
 359typedef struct elf64_shdr {
 360  Elf64_Word sh_name;           /* Section name, index in string tbl */
 361  Elf64_Word sh_type;           /* Type of section */
 362  Elf64_Xword sh_flags;         /* Miscellaneous section attributes */
 363  Elf64_Addr sh_addr;           /* Section virtual addr at execution */
 364  Elf64_Off sh_offset;          /* Section file offset */
 365  Elf64_Xword sh_size;          /* Size of section in bytes */
 366  Elf64_Word sh_link;           /* Index of another section */
 367  Elf64_Word sh_info;           /* Additional section information */
 368  Elf64_Xword sh_addralign;     /* Section alignment */
 369  Elf64_Xword sh_entsize;       /* Entry size if section holds table */
 370} Elf64_Shdr;
 371
 372#define EI_MAG0         0               /* e_ident[] indexes */
 373#define EI_MAG1         1
 374#define EI_MAG2         2
 375#define EI_MAG3         3
 376#define EI_CLASS        4
 377#define EI_DATA         5
 378#define EI_VERSION      6
 379#define EI_OSABI        7
 380#define EI_PAD          8
 381
 382#define ELFMAG0         0x7f            /* EI_MAG */
 383#define ELFMAG1         'E'
 384#define ELFMAG2         'L'
 385#define ELFMAG3         'F'
 386#define ELFMAG          "\177ELF"
 387#define SELFMAG         4
 388
 389#define ELFCLASSNONE    0               /* EI_CLASS */
 390#define ELFCLASS32      1
 391#define ELFCLASS64      2
 392#define ELFCLASSNUM     3
 393
 394#define ELFDATANONE     0               /* e_ident[EI_DATA] */
 395#define ELFDATA2LSB     1
 396#define ELFDATA2MSB     2
 397
 398#define EV_NONE         0               /* e_version, EI_VERSION */
 399#define EV_CURRENT      1
 400#define EV_NUM          2
 401
 402#define ELFOSABI_NONE   0
 403#define ELFOSABI_LINUX  3
 404
 405#ifndef ELF_OSABI
 406#define ELF_OSABI ELFOSABI_NONE
 407#endif
 408
 409/* Notes used in ET_CORE */
 410#define NT_PRSTATUS     1
 411#define NT_PRFPREG      2
 412#define NT_PRPSINFO     3
 413#define NT_TASKSTRUCT   4
 414#define NT_AUXV         6
 415#define NT_PRXFPREG     0x46e62b7f      /* copied from gdb5.1/include/elf/common.h */
 416
 417
 418/* Note header in a PT_NOTE section */
 419typedef struct elf32_note {
 420  Elf32_Word    n_namesz;       /* Name size */
 421  Elf32_Word    n_descsz;       /* Content size */
 422  Elf32_Word    n_type;         /* Content type */
 423} Elf32_Nhdr;
 424
 425/* Note header in a PT_NOTE section */
 426typedef struct elf64_note {
 427  Elf64_Word n_namesz;  /* Name size */
 428  Elf64_Word n_descsz;  /* Content size */
 429  Elf64_Word n_type;    /* Content type */
 430} Elf64_Nhdr;
 431
 432#if ELF_CLASS == ELFCLASS32
 433
 434extern Elf32_Dyn _DYNAMIC [];
 435#define elfhdr          elf32_hdr
 436#define elf_phdr        elf32_phdr
 437#define elf_note        elf32_note
 438
 439#else
 440
 441extern Elf64_Dyn _DYNAMIC [];
 442#define elfhdr          elf64_hdr
 443#define elf_phdr        elf64_phdr
 444#define elf_note        elf64_note
 445
 446#endif
 447
 448
 449#endif /* _LINUX_ELF_H */
 450
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.