The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/exec_elf.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $OpenBSD: exec_elf.h,v 1.97 2022/10/27 23:17:18 deraadt Exp $   */
    2 /*
    3  * Copyright (c) 1995, 1996 Erik Theisen.  All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  * 3. The name of the author may not be used to endorse or promote products
   14  *    derived from this software without specific prior written permission
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   26  */
   27 
   28 /*
   29  * This is the ELF ABI header file
   30  * formerly known as "elf_abi.h".
   31  */
   32 
   33 #ifndef _SYS_EXEC_ELF_H_
   34 #define _SYS_EXEC_ELF_H_
   35 
   36 #include <sys/types.h>
   37 #include <machine/exec.h>
   38 
   39 typedef __uint32_t      Elf32_Addr;     /* Unsigned program address */
   40 typedef __uint32_t      Elf32_Off;      /* Unsigned file offset */
   41 typedef __int32_t       Elf32_Sword;    /* Signed large integer */
   42 typedef __uint32_t      Elf32_Word;     /* Unsigned large integer */
   43 typedef __uint16_t      Elf32_Half;     /* Unsigned medium integer */
   44 typedef __uint64_t      Elf32_Lword;
   45 
   46 typedef __uint64_t      Elf64_Addr;
   47 typedef __uint64_t      Elf64_Off;
   48 typedef __int32_t       Elf64_Shalf;
   49 
   50 typedef __int32_t       Elf64_Sword;
   51 typedef __uint32_t      Elf64_Word;
   52 
   53 typedef __int64_t       Elf64_Sxword;
   54 typedef __uint64_t      Elf64_Xword;
   55 typedef __uint64_t      Elf64_Lword;
   56 
   57 typedef __uint16_t      Elf64_Half;
   58 
   59 /*
   60  * e_ident[] identification indexes
   61  * See http://www.sco.com/developers/gabi/latest/ch4.eheader.html
   62  */
   63 #define EI_MAG0         0               /* file ID */
   64 #define EI_MAG1         1               /* file ID */
   65 #define EI_MAG2         2               /* file ID */
   66 #define EI_MAG3         3               /* file ID */
   67 #define EI_CLASS        4               /* file class */
   68 #define EI_DATA         5               /* data encoding */
   69 #define EI_VERSION      6               /* ELF header version */
   70 #define EI_OSABI        7               /* OS/ABI ID */
   71 #define EI_ABIVERSION   8               /* ABI version */
   72 #define EI_PAD          9               /* start of pad bytes */
   73 #define EI_NIDENT       16              /* Size of e_ident[] */
   74 
   75 /* e_ident[] magic number */
   76 #define ELFMAG0         0x7f            /* e_ident[EI_MAG0] */
   77 #define ELFMAG1         'E'             /* e_ident[EI_MAG1] */
   78 #define ELFMAG2         'L'             /* e_ident[EI_MAG2] */
   79 #define ELFMAG3         'F'             /* e_ident[EI_MAG3] */
   80 #define ELFMAG          "\177ELF"       /* magic */
   81 #define SELFMAG         4               /* size of magic */
   82 
   83 /* e_ident[] file class */
   84 #define ELFCLASSNONE    0               /* invalid */
   85 #define ELFCLASS32      1               /* 32-bit objs */
   86 #define ELFCLASS64      2               /* 64-bit objs */
   87 #define ELFCLASSNUM     3               /* number of classes */
   88 
   89 /* e_ident[] data encoding */
   90 #define ELFDATANONE     0               /* invalid */
   91 #define ELFDATA2LSB     1               /* Little-Endian */
   92 #define ELFDATA2MSB     2               /* Big-Endian */
   93 #define ELFDATANUM      3               /* number of data encode defines */
   94 
   95 /* e_ident[] Operating System/ABI */
   96 #define ELFOSABI_SYSV           0       /* UNIX System V ABI */
   97 #define ELFOSABI_HPUX           1       /* HP-UX operating system */
   98 #define ELFOSABI_NETBSD         2       /* NetBSD */
   99 #define ELFOSABI_LINUX          3       /* GNU/Linux */
  100 #define ELFOSABI_HURD           4       /* GNU/Hurd */
  101 #define ELFOSABI_86OPEN         5       /* 86Open common IA32 ABI */
  102 #define ELFOSABI_SOLARIS        6       /* Solaris */
  103 #define ELFOSABI_MONTEREY       7       /* Monterey */
  104 #define ELFOSABI_IRIX           8       /* IRIX */
  105 #define ELFOSABI_FREEBSD        9       /* FreeBSD */
  106 #define ELFOSABI_TRU64          10      /* TRU64 UNIX */
  107 #define ELFOSABI_MODESTO        11      /* Novell Modesto */
  108 #define ELFOSABI_OPENBSD        12      /* OpenBSD */
  109 #define ELFOSABI_ARM            97      /* ARM */
  110 #define ELFOSABI_STANDALONE     255     /* Standalone (embedded) application */
  111 
  112 /* e_ident */
  113 #define IS_ELF(ehdr) ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \
  114                       (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \
  115                       (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \
  116                       (ehdr).e_ident[EI_MAG3] == ELFMAG3)
  117 
  118 /* ELF Header */
  119 typedef struct elfhdr {
  120         unsigned char   e_ident[EI_NIDENT]; /* ELF Identification */
  121         Elf32_Half      e_type;         /* object file type */
  122         Elf32_Half      e_machine;      /* machine */
  123         Elf32_Word      e_version;      /* object file version */
  124         Elf32_Addr      e_entry;        /* virtual entry point */
  125         Elf32_Off       e_phoff;        /* program header table offset */
  126         Elf32_Off       e_shoff;        /* section header table offset */
  127         Elf32_Word      e_flags;        /* processor-specific flags */
  128         Elf32_Half      e_ehsize;       /* ELF header size */
  129         Elf32_Half      e_phentsize;    /* program header entry size */
  130         Elf32_Half      e_phnum;        /* number of program header entries */
  131         Elf32_Half      e_shentsize;    /* section header entry size */
  132         Elf32_Half      e_shnum;        /* number of section header entries */
  133         Elf32_Half      e_shstrndx;     /* section header table's "section
  134                                            header string table" entry offset */
  135 } Elf32_Ehdr;
  136 
  137 typedef struct {
  138         unsigned char   e_ident[EI_NIDENT];     /* Id bytes */
  139         Elf64_Half      e_type;                 /* file type */
  140         Elf64_Half      e_machine;              /* machine type */
  141         Elf64_Word      e_version;              /* version number */
  142         Elf64_Addr      e_entry;                /* entry point */
  143         Elf64_Off       e_phoff;                /* Program hdr offset */
  144         Elf64_Off       e_shoff;                /* Section hdr offset */
  145         Elf64_Word      e_flags;                /* Processor flags */
  146         Elf64_Half      e_ehsize;               /* sizeof ehdr */
  147         Elf64_Half      e_phentsize;            /* Program header entry size */
  148         Elf64_Half      e_phnum;                /* Number of program headers */
  149         Elf64_Half      e_shentsize;            /* Section header entry size */
  150         Elf64_Half      e_shnum;                /* Number of section headers */
  151         Elf64_Half      e_shstrndx;             /* String table index */
  152 } Elf64_Ehdr;
  153 
  154 /* e_type */
  155 #define ET_NONE         0               /* No file type */
  156 #define ET_REL          1               /* relocatable file */
  157 #define ET_EXEC         2               /* executable file */
  158 #define ET_DYN          3               /* shared object file */
  159 #define ET_CORE         4               /* core file */
  160 #define ET_NUM          5               /* number of types */
  161 #define ET_LOPROC       0xff00          /* reserved range for processor */
  162 #define ET_HIPROC       0xffff          /*  specific e_type */
  163 
  164 /* e_machine */
  165 #define EM_NONE         0               /* No Machine */
  166 #define EM_M32          1               /* AT&T WE 32100 */
  167 #define EM_SPARC        2               /* SPARC */
  168 #define EM_386          3               /* Intel 80386 */
  169 #define EM_68K          4               /* Motorola 68000 */
  170 #define EM_88K          5               /* Motorola 88000 */
  171 #define EM_486          6               /* Intel 80486 - unused? */
  172 #define EM_860          7               /* Intel 80860 */
  173 #define EM_MIPS         8               /* MIPS R3000 Big-Endian only */
  174 /*
  175  * Don't know if EM_MIPS_RS4_BE,
  176  * EM_SPARC64, EM_PARISC,
  177  * or EM_PPC are ABI compliant
  178  */
  179 #define EM_MIPS_RS4_BE  10              /* MIPS R4000 Big-Endian */
  180 #define EM_SPARC64      11              /* SPARC v9 64-bit unofficial */
  181 #define EM_PARISC       15              /* HPPA */
  182 #define EM_SPARC32PLUS  18              /* Enhanced instruction set SPARC */
  183 #define EM_PPC          20              /* PowerPC */
  184 #define EM_PPC64        21              /* PowerPC 64 */
  185 #define EM_ARM          40              /* Advanced RISC Machines ARM */
  186 #define EM_ALPHA        41              /* DEC ALPHA */
  187 #define EM_SH           42              /* Hitachi/Renesas Super-H */
  188 #define EM_SPARCV9      43              /* SPARC version 9 */
  189 #define EM_IA_64        50              /* Intel IA-64 Processor */
  190 #define EM_AMD64        62              /* AMD64 architecture */
  191 #define EM_X86_64       EM_AMD64
  192 #define EM_VAX          75              /* DEC VAX */
  193 #define EM_AARCH64      183             /* ARM 64-bit architecture (AArch64) */
  194 #define EM_RISCV        243             /* RISC-V */
  195 
  196 /* Non-standard */
  197 #define EM_ALPHA_EXP    0x9026          /* DEC ALPHA */
  198 #define EM__LAST__      (EM_ALPHA_EXP + 1)
  199 
  200 #define EM_NUM          22              /* number of machine types */
  201 
  202 /* Version */
  203 #define EV_NONE         0               /* Invalid */
  204 #define EV_CURRENT      1               /* Current */
  205 #define EV_NUM          2               /* number of versions */
  206 
  207 /* Magic for e_phnum: get real value from sh_info of first section header */
  208 #define PN_XNUM         0xffff
  209 
  210 /* Section Header */
  211 typedef struct {
  212         Elf32_Word      sh_name;        /* name - index into section header
  213                                            string table section */
  214         Elf32_Word      sh_type;        /* type */
  215         Elf32_Word      sh_flags;       /* flags */
  216         Elf32_Addr      sh_addr;        /* address */
  217         Elf32_Off       sh_offset;      /* file offset */
  218         Elf32_Word      sh_size;        /* section size */
  219         Elf32_Word      sh_link;        /* section header table index link */
  220         Elf32_Word      sh_info;        /* extra information */
  221         Elf32_Word      sh_addralign;   /* address alignment */
  222         Elf32_Word      sh_entsize;     /* section entry size */
  223 } Elf32_Shdr;
  224 
  225 typedef struct {
  226         Elf64_Word      sh_name;        /* section name */
  227         Elf64_Word      sh_type;        /* section type */
  228         Elf64_Xword     sh_flags;       /* section flags */
  229         Elf64_Addr      sh_addr;        /* virtual address */
  230         Elf64_Off       sh_offset;      /* file offset */
  231         Elf64_Xword     sh_size;        /* section size */
  232         Elf64_Word      sh_link;        /* link to another */
  233         Elf64_Word      sh_info;        /* misc info */
  234         Elf64_Xword     sh_addralign;   /* memory alignment */
  235         Elf64_Xword     sh_entsize;     /* table entry size */
  236 } Elf64_Shdr;
  237 
  238 /* Special Section Indexes */
  239 #define SHN_UNDEF       0               /* undefined */
  240 #define SHN_LORESERVE   0xff00          /* lower bounds of reserved indexes */
  241 #define SHN_LOPROC      0xff00          /* reserved range for processor */
  242 #define SHN_HIPROC      0xff1f          /*   specific section indexes */
  243 #define SHN_ABS         0xfff1          /* absolute value */
  244 #define SHN_COMMON      0xfff2          /* common symbol */
  245 #define SHN_XINDEX      0xffff          /* Escape -- index stored elsewhere. */
  246 #define SHN_HIRESERVE   0xffff          /* upper bounds of reserved indexes */
  247 
  248 /* sh_type */
  249 #define SHT_NULL                0       /* inactive */
  250 #define SHT_PROGBITS            1       /* program defined information */
  251 #define SHT_SYMTAB              2       /* symbol table section */
  252 #define SHT_STRTAB              3       /* string table section */
  253 #define SHT_RELA                4       /* relocation section with addends*/
  254 #define SHT_HASH                5       /* symbol hash table section */
  255 #define SHT_DYNAMIC             6       /* dynamic section */
  256 #define SHT_NOTE                7       /* note section */
  257 #define SHT_NOBITS              8       /* no space section */
  258 #define SHT_REL                 9       /* relocation section without addends */
  259 #define SHT_SHLIB               10      /* reserved - purpose unknown */
  260 #define SHT_DYNSYM              11      /* dynamic symbol table section */
  261 #define SHT_NUM                 12      /* number of section types */
  262 #define SHT_INIT_ARRAY          14      /* pointers to init functions */
  263 #define SHT_FINI_ARRAY          15      /* pointers to termination functions */
  264 #define SHT_PREINIT_ARRAY       16      /* ptrs to funcs called before init */
  265 #define SHT_GROUP               17      /* defines a section group */
  266 #define SHT_SYMTAB_SHNDX        18      /* Section indexes (see SHN_XINDEX). */
  267 #define SHT_RELR                19      /* relative-only relocation section */
  268 #define SHT_LOOS        0x60000000      /* reserved range for OS specific */
  269 #define SHT_SUNW_dof    0x6ffffff4      /* used by dtrace */
  270 #define SHT_GNU_LIBLIST 0x6ffffff7      /* libraries to be prelinked */
  271 #define SHT_SUNW_move   0x6ffffffa      /* inf for partially init'ed symbols */
  272 #define SHT_SUNW_syminfo        0x6ffffffc      /* ad symbol information */ 
  273 #define SHT_SUNW_verdef         0x6ffffffd      /* symbol versioning inf */
  274 #define SHT_SUNW_verneed        0x6ffffffe      /* symbol versioning req */
  275 #define SHT_SUNW_versym         0x6fffffff      /* symbol versioning table */
  276 #define SHT_HIOS        0x6fffffff      /*  section header types */
  277 #define SHT_LOPROC      0x70000000      /* reserved range for processor */
  278 #define SHT_HIPROC      0x7fffffff      /*  specific section header types */
  279 #define SHT_LOUSER      0x80000000      /* reserved range for application */
  280 #define SHT_HIUSER      0xffffffff      /*  specific indexes */
  281 
  282 #define SHT_GNU_HASH    0x6ffffff6      /* GNU-style hash table section */
  283 
  284 /* Section names */
  285 #define ELF_BSS         ".bss"          /* uninitialized data */
  286 #define ELF_DATA        ".data"         /* initialized data */
  287 #define ELF_CTF         ".SUNW_ctf"     /* CTF data */
  288 #define ELF_DEBUG       ".debug"        /* debug */
  289 #define ELF_DYNAMIC     ".dynamic"      /* dynamic linking information */
  290 #define ELF_DYNSTR      ".dynstr"       /* dynamic string table */
  291 #define ELF_DYNSYM      ".dynsym"       /* dynamic symbol table */
  292 #define ELF_FINI        ".fini"         /* termination code */
  293 #define ELF_GOT         ".got"          /* global offset table */
  294 #define ELF_HASH        ".hash"         /* symbol hash table */
  295 #define ELF_INIT        ".init"         /* initialization code */
  296 #define ELF_REL_DATA    ".rel.data"     /* relocation data */
  297 #define ELF_REL_FINI    ".rel.fini"     /* relocation termination code */
  298 #define ELF_REL_INIT    ".rel.init"     /* relocation initialization code */
  299 #define ELF_REL_DYN     ".rel.dyn"      /* relocation dynamic link info */
  300 #define ELF_REL_RODATA  ".rel.rodata"   /* relocation read-only data */
  301 #define ELF_REL_TEXT    ".rel.text"     /* relocation code */
  302 #define ELF_RODATA      ".rodata"       /* read-only data */
  303 #define ELF_SHSTRTAB    ".shstrtab"     /* section header string table */
  304 #define ELF_STRTAB      ".strtab"       /* string table */
  305 #define ELF_SYMTAB      ".symtab"       /* symbol table */
  306 #define ELF_TEXT        ".text"         /* code */
  307 #define ELF_OPENBSDRANDOMDATA ".openbsd.randomdata" /* constant randomdata */
  308 #define ELF_OPENBSDMUTABLE ".openbsd.mutable" /* mutable bss */
  309 
  310 
  311 /* Section Attribute Flags - sh_flags */
  312 #define SHF_WRITE               0x1     /* Writable */
  313 #define SHF_ALLOC               0x2     /* occupies memory */
  314 #define SHF_EXECINSTR           0x4     /* executable */
  315 #define SHF_MERGE               0x10    /* may be merged */
  316 #define SHF_STRINGS             0x20    /* contains strings */
  317 #define SHF_INFO_LINK           0x40    /* sh_info holds section index */
  318 #define SHF_LINK_ORDER          0x80    /* ordering requirements */
  319 #define SHF_OS_NONCONFORMING    0x100   /* OS-specific processing required */
  320 #define SHF_GROUP               0x200   /* member of section group */
  321 #define SHF_TLS                 0x400   /* thread local storage */
  322 #define SHF_COMPRESSED          0x800   /* contains compressed data */
  323 #define SHF_MASKOS      0x0ff00000      /* OS-specific semantics */
  324 #define SHF_MASKPROC    0xf0000000      /* reserved bits for processor */
  325                                         /*  specific section attributes */
  326 
  327 /* Symbol Table Entry */
  328 typedef struct elf32_sym {
  329         Elf32_Word      st_name;        /* name - index into string table */
  330         Elf32_Addr      st_value;       /* symbol value */
  331         Elf32_Word      st_size;        /* symbol size */
  332         unsigned char   st_info;        /* type and binding */
  333         unsigned char   st_other;       /* 0 - no defined meaning */
  334         Elf32_Half      st_shndx;       /* section header index */
  335 } Elf32_Sym;
  336 
  337 typedef struct {
  338         Elf64_Word      st_name;        /* Symbol name index in str table */
  339         unsigned char   st_info;        /* type / binding attrs */
  340         unsigned char   st_other;       /* unused */
  341         Elf64_Half      st_shndx;       /* section index of symbol */
  342         Elf64_Addr      st_value;       /* value of symbol */
  343         Elf64_Xword     st_size;        /* size of symbol */
  344 } Elf64_Sym;
  345 
  346 /* Symbol table index */
  347 #define STN_UNDEF       0               /* undefined */
  348 
  349 /* Extract symbol info - st_info */
  350 #define ELF32_ST_BIND(x)        ((x) >> 4)
  351 #define ELF32_ST_TYPE(x)        (((unsigned int) x) & 0xf)
  352 #define ELF32_ST_INFO(b,t)      (((b) << 4) + ((t) & 0xf))
  353 
  354 #define ELF64_ST_BIND(x)        ((x) >> 4)
  355 #define ELF64_ST_TYPE(x)        (((unsigned int) x) & 0xf)
  356 #define ELF64_ST_INFO(b,t)      (((b) << 4) + ((t) & 0xf))
  357 
  358 /* Symbol Binding - ELF32_ST_BIND - st_info */
  359 #define STB_LOCAL       0               /* Local symbol */
  360 #define STB_GLOBAL      1               /* Global symbol */
  361 #define STB_WEAK        2               /* like global - lower precedence */
  362 #define STB_NUM         3               /* number of symbol bindings */
  363 #define STB_LOPROC      13              /* reserved range for processor */
  364 #define STB_HIPROC      15              /*  specific symbol bindings */
  365 
  366 /* Symbol type - ELF32_ST_TYPE - st_info */
  367 #define STT_NOTYPE      0               /* not specified */
  368 #define STT_OBJECT      1               /* data object */
  369 #define STT_FUNC        2               /* function */
  370 #define STT_SECTION     3               /* section */
  371 #define STT_FILE        4               /* file */
  372 #define STT_TLS         6               /* thread local storage */
  373 #define STT_LOPROC      13              /* reserved range for processor */
  374 #define STT_HIPROC      15              /*  specific symbol types */
  375 
  376 /* Extract symbol visibility - st_other */
  377 #define ELF_ST_VISIBILITY(v)            ((v) & 0x3)
  378 #define ELF32_ST_VISIBILITY             ELF_ST_VISIBILITY
  379 #define ELF64_ST_VISIBILITY             ELF_ST_VISIBILITY
  380 
  381 #define STV_DEFAULT     0               /* Visibility set by binding type */
  382 #define STV_INTERNAL    1               /* OS specific version of STV_HIDDEN */
  383 #define STV_HIDDEN      2               /* can only be seen inside own .so */
  384 #define STV_PROTECTED   3               /* HIDDEN inside, DEFAULT outside */
  385 
  386 /* Relocation entry with implicit addend */
  387 typedef struct {
  388         Elf32_Addr      r_offset;       /* offset of relocation */
  389         Elf32_Word      r_info;         /* symbol table index and type */
  390 } Elf32_Rel;
  391 
  392 /* Relocation entry with explicit addend */
  393 typedef struct {
  394         Elf32_Addr      r_offset;       /* offset of relocation */
  395         Elf32_Word      r_info;         /* symbol table index and type */
  396         Elf32_Sword     r_addend;
  397 } Elf32_Rela;
  398 
  399 /* Extract relocation info - r_info */
  400 #define ELF32_R_SYM(i)          ((i) >> 8)
  401 #define ELF32_R_TYPE(i)         ((unsigned char) (i))
  402 #define ELF32_R_INFO(s,t)       (((s) << 8) + (unsigned char)(t))
  403 
  404 typedef struct {
  405         Elf64_Addr      r_offset;       /* where to do it */
  406         Elf64_Xword     r_info;         /* index & type of relocation */
  407 } Elf64_Rel;
  408 
  409 typedef struct {
  410         Elf64_Addr      r_offset;       /* where to do it */
  411         Elf64_Xword     r_info;         /* index & type of relocation */
  412         Elf64_Sxword    r_addend;       /* adjustment value */
  413 } Elf64_Rela;
  414 
  415 #define ELF64_R_SYM(info)       ((info) >> 32)
  416 #define ELF64_R_TYPE(info)      ((info) & 0xFFFFFFFF)
  417 #define ELF64_R_INFO(s,t)       (((s) << 32) + (__uint32_t)(t))
  418 
  419 #if defined(__mips64__) && defined(__MIPSEL__)
  420 /*
  421  * The 64-bit MIPS ELF ABI uses a slightly different relocation format
  422  * than the regular ELF ABI: the r_info field is split into several
  423  * pieces (see gnu/usr.bin/binutils-2.17/include/elf/mips.h for details).
  424  */
  425 #undef  ELF64_R_SYM
  426 #undef  ELF64_R_TYPE
  427 #undef  ELF64_R_INFO
  428 #define ELF64_R_TYPE(info)      ((__uint64_t)swap32((info) >> 32))
  429 #define ELF64_R_SYM(info)       ((info) & 0xFFFFFFFF)
  430 #define ELF64_R_INFO(s,t)       (((__uint64_t)swap32(t) << 32) + (__uint32_t)(s))
  431 #endif  /* __mips64__ && __MIPSEL__ */
  432 
  433 /*
  434  * Relative Relocation info.
  435  * c.f. decode_relrs() in gnu/llvm/llvm/lib/Object/ELF.cpp
  436  */
  437 typedef Elf32_Word      Elf32_Relr;
  438 typedef Elf64_Xword     Elf64_Relr;
  439 
  440 /* Program Header */
  441 typedef struct {
  442         Elf32_Word      p_type;         /* segment type */
  443         Elf32_Off       p_offset;       /* segment offset */
  444         Elf32_Addr      p_vaddr;        /* virtual address of segment */
  445         Elf32_Addr      p_paddr;        /* physical address - ignored? */
  446         Elf32_Word      p_filesz;       /* number of bytes in file for seg. */
  447         Elf32_Word      p_memsz;        /* number of bytes in mem. for seg. */
  448         Elf32_Word      p_flags;        /* flags */
  449         Elf32_Word      p_align;        /* memory alignment */
  450 } Elf32_Phdr;
  451 
  452 typedef struct {
  453         Elf64_Word      p_type;         /* entry type */
  454         Elf64_Word      p_flags;        /* flags */
  455         Elf64_Off       p_offset;       /* offset */
  456         Elf64_Addr      p_vaddr;        /* virtual address */
  457         Elf64_Addr      p_paddr;        /* physical address */
  458         Elf64_Xword     p_filesz;       /* file size */
  459         Elf64_Xword     p_memsz;        /* memory size */
  460         Elf64_Xword     p_align;        /* memory & file alignment */
  461 } Elf64_Phdr;
  462 
  463 /* Segment types - p_type */
  464 #define PT_NULL         0               /* unused */
  465 #define PT_LOAD         1               /* loadable segment */
  466 #define PT_DYNAMIC      2               /* dynamic linking section */
  467 #define PT_INTERP       3               /* the RTLD */
  468 #define PT_NOTE         4               /* auxiliary information */
  469 #define PT_SHLIB        5               /* reserved - purpose undefined */
  470 #define PT_PHDR         6               /* program header */
  471 #define PT_TLS          7               /* thread local storage */
  472 #define PT_LOOS         0x60000000      /* reserved range for OS */
  473 #define PT_HIOS         0x6fffffff      /*  specific segment types */
  474 #define PT_LOPROC       0x70000000      /* reserved range for processor */
  475 #define PT_HIPROC       0x7fffffff      /*  specific segment types */
  476 
  477 #define PT_GNU_EH_FRAME         0x6474e550      /* Exception handling info */
  478 #define PT_GNU_RELRO            0x6474e552      /* Read-only after relocation */
  479 
  480 #define PT_OPENBSD_MUTABLE      0x65a3dbe5      /* like bss, but not immutable */
  481 #define PT_OPENBSD_RANDOMIZE    0x65a3dbe6      /* fill with random data */
  482 #define PT_OPENBSD_WXNEEDED     0x65a3dbe7      /* program performs W^X violations */
  483 #define PT_OPENBSD_BOOTDATA     0x65a41be6      /* section for boot arguments */
  484 
  485 /* Segment flags - p_flags */
  486 #define PF_X            0x1             /* Executable */
  487 #define PF_W            0x2             /* Writable */
  488 #define PF_R            0x4             /* Readable */
  489 #define PF_MASKOS       0x0ff00000      /* reserved bits for OS */
  490                                         /*  specific segment flags */
  491 #define PF_MASKPROC     0xf0000000      /* reserved bits for processor */
  492                                         /*  specific segment flags */
  493 
  494 #define PF_OPENBSD_MUTABLE      0x08000000      /* Mutable */
  495 
  496 /* Dynamic structure */
  497 typedef struct {
  498         Elf32_Sword     d_tag;          /* controls meaning of d_val */
  499         union {
  500                 Elf32_Word      d_val;  /* Multiple meanings - see d_tag */
  501                 Elf32_Addr      d_ptr;  /* program virtual address */
  502         } d_un;
  503 } Elf32_Dyn;
  504 
  505 typedef struct {
  506         Elf64_Xword     d_tag;          /* controls meaning of d_val */
  507         union {
  508                 Elf64_Addr      d_ptr;
  509                 Elf64_Xword     d_val;
  510         } d_un;
  511 } Elf64_Dyn;
  512 
  513 /* Dynamic Array Tags - d_tag */
  514 #define DT_NULL         0               /* marks end of _DYNAMIC array */
  515 #define DT_NEEDED       1               /* string table offset of needed lib */
  516 #define DT_PLTRELSZ     2               /* size of relocation entries in PLT */
  517 #define DT_PLTGOT       3               /* address PLT/GOT */
  518 #define DT_HASH         4               /* address of symbol hash table */
  519 #define DT_STRTAB       5               /* address of string table */
  520 #define DT_SYMTAB       6               /* address of symbol table */
  521 #define DT_RELA         7               /* address of relocation table */
  522 #define DT_RELASZ       8               /* size of relocation table */
  523 #define DT_RELAENT      9               /* size of relocation entry */
  524 #define DT_STRSZ        10              /* size of string table */
  525 #define DT_SYMENT       11              /* size of symbol table entry */
  526 #define DT_INIT         12              /* address of initialization func. */
  527 #define DT_FINI         13              /* address of termination function */
  528 #define DT_SONAME       14              /* string table offset of shared obj */
  529 #define DT_RPATH        15              /* string table offset of library
  530                                            search path */
  531 #define DT_SYMBOLIC     16              /* start sym search in shared obj. */
  532 #define DT_REL          17              /* address of rel. tbl. w addends */
  533 #define DT_RELSZ        18              /* size of DT_REL relocation table */
  534 #define DT_RELENT       19              /* size of DT_REL relocation entry */
  535 #define DT_PLTREL       20              /* PLT referenced relocation entry */
  536 #define DT_DEBUG        21              /* bugger */
  537 #define DT_TEXTREL      22              /* Allow rel. mod. to unwritable seg */
  538 #define DT_JMPREL       23              /* add. of PLT's relocation entries */
  539 #define DT_BIND_NOW     24              /* Bind now regardless of env setting */
  540 #define DT_INIT_ARRAY   25              /* address of array of init func */
  541 #define DT_FINI_ARRAY   26              /* address of array of term func */
  542 #define DT_INIT_ARRAYSZ 27              /* size of array of init func */
  543 #define DT_FINI_ARRAYSZ 28              /* size of array of term func */
  544 #define DT_RUNPATH      29              /* strtab offset of lib search path */
  545 #define DT_FLAGS        30              /* Set of DF_* flags */
  546 #define DT_ENCODING     31              /* further DT_* follow encoding rules */
  547 #define DT_PREINIT_ARRAY        32      /* address of array of preinit func */
  548 #define DT_PREINIT_ARRAYSZ      33      /* size of array of preinit func */
  549 #define DT_RELRSZ       35              /* size of DT_RELR relocation table */
  550 #define DT_RELR         36              /* addr of DT_RELR relocation table */
  551 #define DT_RELRENT      37              /* size of DT_RELR relocation entry */
  552 #define DT_LOOS         0x6000000d      /* reserved range for OS */
  553 #define DT_HIOS         0x6ffff000      /*  specific dynamic array tags */
  554 #define DT_LOPROC       0x70000000      /* reserved range for processor */
  555 #define DT_HIPROC       0x7fffffff      /*  specific dynamic array tags */
  556 
  557 /* some other useful tags */
  558 #define DT_GNU_HASH     0x6ffffef5      /* address of GNU hash table */
  559 #define DT_RELACOUNT    0x6ffffff9      /* if present, number of RELATIVE */
  560 #define DT_RELCOUNT     0x6ffffffa      /* relocs, which must come first */
  561 #define DT_FLAGS_1      0x6ffffffb
  562 
  563 /* Dynamic Flags - DT_FLAGS .dynamic entry */
  564 #define DF_ORIGIN       0x00000001
  565 #define DF_SYMBOLIC     0x00000002
  566 #define DF_TEXTREL      0x00000004
  567 #define DF_BIND_NOW     0x00000008
  568 #define DF_STATIC_TLS   0x00000010
  569 
  570 /* Dynamic Flags - DT_FLAGS_1 .dynamic entry */
  571 #define DF_1_NOW        0x00000001
  572 #define DF_1_GLOBAL     0x00000002
  573 #define DF_1_GROUP      0x00000004
  574 #define DF_1_NODELETE   0x00000008
  575 #define DF_1_LOADFLTR   0x00000010
  576 #define DF_1_INITFIRST  0x00000020
  577 #define DF_1_NOOPEN     0x00000040
  578 #define DF_1_ORIGIN     0x00000080
  579 #define DF_1_DIRECT     0x00000100
  580 #define DF_1_TRANS      0x00000200
  581 #define DF_1_INTERPOSE  0x00000400
  582 #define DF_1_NODEFLIB   0x00000800
  583 #define DF_1_NODUMP     0x00001000
  584 #define DF_1_CONLFAT    0x00002000
  585 #define DF_1_ENDFILTEE  0x00004000
  586 #define DF_1_DISPRELDNE 0x00008000
  587 #define DF_1_DISPRELPND 0x00010000
  588 #define DF_1_NODIRECT   0x00020000
  589 #define DF_1_IGNMULDEF  0x00040000
  590 #define DF_1_NOKSYMS    0x00080000
  591 #define DF_1_NOHDR      0x00100000
  592 #define DF_1_EDITED     0x00200000
  593 #define DF_1_NORELOC    0x00400000
  594 #define DF_1_SYMINTPOSE 0x00800000
  595 #define DF_1_GLOBAUDIT  0x01000000
  596 #define DF_1_SINGLETON  0x02000000
  597 #define DF_1_PIE        0x08000000
  598 
  599 /*
  600  * Note header
  601  */
  602 typedef struct {
  603         Elf32_Word n_namesz;
  604         Elf32_Word n_descsz;
  605         Elf32_Word n_type;
  606 } Elf32_Nhdr;
  607 
  608 typedef struct {
  609         Elf64_Word n_namesz;
  610         Elf64_Word n_descsz;
  611         Elf64_Word n_type;
  612 } Elf64_Nhdr;
  613 
  614 /*
  615  * Note Definitions
  616  */
  617 typedef struct {
  618         Elf32_Word namesz;
  619         Elf32_Word descsz;
  620         Elf32_Word type;
  621 } Elf32_Note;
  622 
  623 typedef struct {
  624         Elf64_Word namesz;
  625         Elf64_Word descsz;
  626         Elf64_Word type;
  627 } Elf64_Note;
  628 
  629 /* Values for n_type. */
  630 #define NT_PRSTATUS             1       /* Process status. */
  631 #define NT_FPREGSET             2       /* Floating point registers. */
  632 #define NT_PRPSINFO             3       /* Process state info. */
  633 
  634 /*
  635  * OpenBSD-specific core file information.
  636  *
  637  * OpenBSD ELF core files use notes to provide information about
  638  * the process's state.  The note name is "OpenBSD" for information
  639  * that is global to the process, and "OpenBSD@nn", where "nn" is the
  640  * thread ID of the thread that the information belongs to (such as
  641  * register state).
  642  *
  643  * We use the following note identifiers:
  644  *
  645  *      NT_OPENBSD_PROCINFO
  646  *              Note is a "elfcore_procinfo" structure.
  647  *      NT_OPENBSD_AUXV
  648  *              Note is a a bunch of Auxiliary Vectors, terminated by
  649  *              an AT_NULL entry.
  650  *      NT_OPENBSD_REGS
  651  *              Note is a "reg" structure.
  652  *      NT_OPENBSD_FPREGS
  653  *              Note is a "fpreg" structure.
  654  *
  655  * Please try to keep the members of the "elfcore_procinfo" structure
  656  * nicely aligned, and if you add elements, add them to the end and
  657  * bump the version.
  658  */
  659 
  660 #define NT_OPENBSD_PROCINFO     10
  661 #define NT_OPENBSD_AUXV         11
  662 
  663 #define NT_OPENBSD_REGS         20
  664 #define NT_OPENBSD_FPREGS       21
  665 #define NT_OPENBSD_XFPREGS      22
  666 #define NT_OPENBSD_WCOOKIE      23
  667 
  668 struct elfcore_procinfo {
  669         /* Version 1 fields start here. */
  670         uint32_t        cpi_version;    /* netbsd_elfcore_procinfo version */
  671 #define ELFCORE_PROCINFO_VERSION        1
  672         uint32_t        cpi_cpisize;    /* sizeof(netbsd_elfcore_procinfo) */
  673         uint32_t        cpi_signo;      /* killing signal */
  674         uint32_t        cpi_sigcode;    /* signal code */
  675         uint32_t        cpi_sigpend;    /* pending signals */
  676         uint32_t        cpi_sigmask;    /* blocked signals */
  677         uint32_t        cpi_sigignore;  /* ignored signals */
  678         uint32_t        cpi_sigcatch;   /* signals being caught by user */
  679         int32_t         cpi_pid;        /* process ID */
  680         int32_t         cpi_ppid;       /* parent process ID */
  681         int32_t         cpi_pgrp;       /* process group ID */
  682         int32_t         cpi_sid;        /* session ID */
  683         uint32_t        cpi_ruid;       /* real user ID */
  684         uint32_t        cpi_euid;       /* effective user ID */
  685         uint32_t        cpi_svuid;      /* saved user ID */
  686         uint32_t        cpi_rgid;       /* real group ID */
  687         uint32_t        cpi_egid;       /* effective group ID */
  688         uint32_t        cpi_svgid;      /* saved group ID */
  689         int8_t          cpi_name[32];   /* copy of pr->ps_comm */
  690 };
  691 
  692 /*
  693  * XXX - these _KERNEL items aren't part of the ABI!
  694  */
  695 #if defined(_KERNEL) || defined(_DYN_LOADER)
  696 
  697 #define ELF32_NO_ADDR   ((uint32_t) ~0) /* Indicates addr. not yet filled in */
  698 
  699 typedef struct {
  700         Elf32_Sword     au_id;                          /* 32-bit id */
  701         Elf32_Word      au_v;                           /* 32-bit value */
  702 } Aux32Info;
  703 
  704 #define ELF64_NO_ADDR   ((__uint64_t) ~0)/* Indicates addr. not yet filled in */
  705 
  706 typedef struct {
  707         Elf64_Shalf     au_id;                          /* 32-bit id */
  708         Elf64_Xword     au_v;                           /* 64-bit value */
  709 } Aux64Info;
  710 
  711 enum AuxID {
  712         AUX_null = 0,
  713         AUX_ignore = 1,
  714         AUX_execfd = 2,
  715         AUX_phdr = 3,                   /* &phdr[0] */
  716         AUX_phent = 4,                  /* sizeof(phdr[0]) */
  717         AUX_phnum = 5,                  /* # phdr entries */
  718         AUX_pagesz = 6,                 /* PAGESIZE */
  719         AUX_base = 7,                   /* base addr for ld.so or static PIE */
  720         AUX_flags = 8,                  /* processor flags */
  721         AUX_entry = 9,                  /* a.out entry */
  722         AUX_sun_uid = 2000,             /* euid */
  723         AUX_sun_ruid = 2001,            /* ruid */
  724         AUX_sun_gid = 2002,             /* egid */
  725         AUX_sun_rgid = 2003,            /* rgid */
  726         AUX_openbsd_timekeep = 4000,    /* userland clock_gettime */
  727 };
  728 
  729 struct elf_args {
  730         u_long  arg_entry;              /* program entry point */
  731         u_long  arg_interp;             /* Interpreter load address */
  732         u_long  arg_phaddr;             /* program header address */
  733         u_long  arg_phentsize;          /* Size of program header */
  734         u_long  arg_phnum;              /* Number of program headers */
  735 };
  736 
  737 #endif
  738 
  739 #if !defined(ELFSIZE) && defined(ARCH_ELFSIZE)
  740 #define ELFSIZE ARCH_ELFSIZE
  741 #endif
  742 
  743 #if defined(ELFSIZE)
  744 #define CONCAT(x,y)     __CONCAT(x,y)
  745 #define ELFNAME(x)      CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
  746 #define ELFDEFNNAME(x)  CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
  747 #endif
  748 
  749 #if defined(ELFSIZE) && (ELFSIZE == 32)
  750 #define Elf_Ehdr        Elf32_Ehdr
  751 #define Elf_Phdr        Elf32_Phdr
  752 #define Elf_Shdr        Elf32_Shdr
  753 #define Elf_Sym         Elf32_Sym
  754 #define Elf_Rel         Elf32_Rel
  755 #define Elf_RelA        Elf32_Rela
  756 #define Elf_Relr        Elf32_Relr
  757 #define Elf_Dyn         Elf32_Dyn
  758 #define Elf_Half        Elf32_Half
  759 #define Elf_Word        Elf32_Word
  760 #define Elf_Sword       Elf32_Sword
  761 #define Elf_Addr        Elf32_Addr
  762 #define Elf_Off         Elf32_Off
  763 #define Elf_Nhdr        Elf32_Nhdr
  764 #define Elf_Note        Elf32_Note
  765 
  766 #define ELF_R_SYM       ELF32_R_SYM
  767 #define ELF_R_TYPE      ELF32_R_TYPE
  768 #define ELF_R_INFO      ELF32_R_INFO
  769 #define ELFCLASS        ELFCLASS32
  770 
  771 #define ELF_ST_BIND     ELF32_ST_BIND
  772 #define ELF_ST_TYPE     ELF32_ST_TYPE
  773 #define ELF_ST_INFO     ELF32_ST_INFO
  774 
  775 #define ELF_NO_ADDR     ELF32_NO_ADDR
  776 #define AuxInfo         Aux32Info
  777 #elif defined(ELFSIZE) && (ELFSIZE == 64)
  778 #define Elf_Ehdr        Elf64_Ehdr
  779 #define Elf_Phdr        Elf64_Phdr
  780 #define Elf_Shdr        Elf64_Shdr
  781 #define Elf_Sym         Elf64_Sym
  782 #define Elf_Rel         Elf64_Rel
  783 #define Elf_RelA        Elf64_Rela
  784 #define Elf_Relr        Elf64_Relr
  785 #define Elf_Dyn         Elf64_Dyn
  786 #define Elf_Half        Elf64_Half
  787 #define Elf_Word        Elf64_Word
  788 #define Elf_Sword       Elf64_Sword
  789 #define Elf_Addr        Elf64_Addr
  790 #define Elf_Off         Elf64_Off
  791 #define Elf_Nhdr        Elf64_Nhdr
  792 #define Elf_Note        Elf64_Note
  793 
  794 #define ELF_R_SYM       ELF64_R_SYM
  795 #define ELF_R_TYPE      ELF64_R_TYPE
  796 #define ELF_R_INFO      ELF64_R_INFO
  797 #define ELFCLASS        ELFCLASS64
  798 
  799 #define ELF_ST_BIND     ELF64_ST_BIND
  800 #define ELF_ST_TYPE     ELF64_ST_TYPE
  801 #define ELF_ST_INFO     ELF64_ST_INFO
  802 
  803 #define ELF_NO_ADDR     ELF64_NO_ADDR
  804 #define AuxInfo         Aux64Info
  805 #endif
  806 
  807 #ifndef _KERNEL
  808 extern Elf_Dyn          _DYNAMIC[];
  809 #endif
  810 
  811 #ifdef  _KERNEL
  812 /*
  813  * How many entries are in the AuxInfo array we pass to the process?
  814  */
  815 #define ELF_AUX_ENTRIES 9
  816 #define ELF_AUX_WORDS   (sizeof(AuxInfo) * ELF_AUX_ENTRIES / sizeof(char *))
  817 
  818 struct exec_package;
  819 
  820 int     exec_elf_makecmds(struct proc *, struct exec_package *);
  821 int     exec_elf_fixup(struct proc *, struct exec_package *);
  822 int     coredump_elf(struct proc *, void *);
  823 #endif /* _KERNEL */
  824 
  825 #define ELF_TARG_VER    1       /* The ver for which this code is intended */
  826 
  827 #endif /* _SYS_EXEC_ELF_H_ */

Cache object: 5a6357d4ee16f38eeec09fc5536fe57a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.