1*4a5d661aSToomas Soome /*- 2*4a5d661aSToomas Soome * Copyright (c) 1996-1997 John D. Polstra. 3*4a5d661aSToomas Soome * All rights reserved. 4*4a5d661aSToomas Soome * 5*4a5d661aSToomas Soome * Redistribution and use in source and binary forms, with or without 6*4a5d661aSToomas Soome * modification, are permitted provided that the following conditions 7*4a5d661aSToomas Soome * are met: 8*4a5d661aSToomas Soome * 1. Redistributions of source code must retain the above copyright 9*4a5d661aSToomas Soome * notice, this list of conditions and the following disclaimer. 10*4a5d661aSToomas Soome * 2. Redistributions in binary form must reproduce the above copyright 11*4a5d661aSToomas Soome * notice, this list of conditions and the following disclaimer in the 12*4a5d661aSToomas Soome * documentation and/or other materials provided with the distribution. 13*4a5d661aSToomas Soome * 14*4a5d661aSToomas Soome * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*4a5d661aSToomas Soome * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*4a5d661aSToomas Soome * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*4a5d661aSToomas Soome * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*4a5d661aSToomas Soome * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*4a5d661aSToomas Soome * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*4a5d661aSToomas Soome * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*4a5d661aSToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*4a5d661aSToomas Soome * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*4a5d661aSToomas Soome * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*4a5d661aSToomas Soome * SUCH DAMAGE. 25*4a5d661aSToomas Soome * 26*4a5d661aSToomas Soome * $FreeBSD$ 27*4a5d661aSToomas Soome */ 28*4a5d661aSToomas Soome 29*4a5d661aSToomas Soome #ifndef _MACHINE_ELF_H_ 30*4a5d661aSToomas Soome #define _MACHINE_ELF_H_ 1 31*4a5d661aSToomas Soome 32*4a5d661aSToomas Soome #if defined(__i386__) || defined(_MACHINE_ELF_WANT_32BIT) 33*4a5d661aSToomas Soome 34*4a5d661aSToomas Soome /* 35*4a5d661aSToomas Soome * ELF definitions for the i386 architecture. 36*4a5d661aSToomas Soome */ 37*4a5d661aSToomas Soome 38*4a5d661aSToomas Soome #include <sys/elf32.h> /* Definitions common to all 32 bit architectures. */ 39*4a5d661aSToomas Soome #if defined(__ELF_WORD_SIZE) && __ELF_WORD_SIZE == 64 40*4a5d661aSToomas Soome #include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */ 41*4a5d661aSToomas Soome #endif 42*4a5d661aSToomas Soome 43*4a5d661aSToomas Soome #ifndef __ELF_WORD_SIZE 44*4a5d661aSToomas Soome #define __ELF_WORD_SIZE 32 /* Used by <sys/elf_generic.h> */ 45*4a5d661aSToomas Soome #endif 46*4a5d661aSToomas Soome 47*4a5d661aSToomas Soome #include <sys/elf_generic.h> 48*4a5d661aSToomas Soome 49*4a5d661aSToomas Soome #define ELF_ARCH EM_386 50*4a5d661aSToomas Soome 51*4a5d661aSToomas Soome #define ELF_MACHINE_OK(x) ((x) == EM_386 || (x) == EM_486) 52*4a5d661aSToomas Soome 53*4a5d661aSToomas Soome /* 54*4a5d661aSToomas Soome * Auxiliary vector entries for passing information to the interpreter. 55*4a5d661aSToomas Soome * 56*4a5d661aSToomas Soome * The i386 supplement to the SVR4 ABI specification names this "auxv_t", 57*4a5d661aSToomas Soome * but POSIX lays claim to all symbols ending with "_t". 58*4a5d661aSToomas Soome */ 59*4a5d661aSToomas Soome 60*4a5d661aSToomas Soome typedef struct { /* Auxiliary vector entry on initial stack */ 61*4a5d661aSToomas Soome int a_type; /* Entry type. */ 62*4a5d661aSToomas Soome union { 63*4a5d661aSToomas Soome long a_val; /* Integer value. */ 64*4a5d661aSToomas Soome void *a_ptr; /* Address. */ 65*4a5d661aSToomas Soome void (*a_fcn)(void); /* Function pointer (not used). */ 66*4a5d661aSToomas Soome } a_un; 67*4a5d661aSToomas Soome } Elf32_Auxinfo; 68*4a5d661aSToomas Soome 69*4a5d661aSToomas Soome #if __ELF_WORD_SIZE == 64 70*4a5d661aSToomas Soome /* Fake for amd64 loader support */ 71*4a5d661aSToomas Soome typedef struct { 72*4a5d661aSToomas Soome int fake; 73*4a5d661aSToomas Soome } Elf64_Auxinfo; 74*4a5d661aSToomas Soome #endif 75*4a5d661aSToomas Soome 76*4a5d661aSToomas Soome __ElfType(Auxinfo); 77*4a5d661aSToomas Soome 78*4a5d661aSToomas Soome /* Values for a_type. */ 79*4a5d661aSToomas Soome #define AT_NULL 0 /* Terminates the vector. */ 80*4a5d661aSToomas Soome #define AT_IGNORE 1 /* Ignored entry. */ 81*4a5d661aSToomas Soome #define AT_EXECFD 2 /* File descriptor of program to load. */ 82*4a5d661aSToomas Soome #define AT_PHDR 3 /* Program header of program already loaded. */ 83*4a5d661aSToomas Soome #define AT_PHENT 4 /* Size of each program header entry. */ 84*4a5d661aSToomas Soome #define AT_PHNUM 5 /* Number of program header entries. */ 85*4a5d661aSToomas Soome #define AT_PAGESZ 6 /* Page size in bytes. */ 86*4a5d661aSToomas Soome #define AT_BASE 7 /* Interpreter's base address. */ 87*4a5d661aSToomas Soome #define AT_FLAGS 8 /* Flags (unused for i386). */ 88*4a5d661aSToomas Soome #define AT_ENTRY 9 /* Where interpreter should transfer control. */ 89*4a5d661aSToomas Soome #define AT_NOTELF 10 /* Program is not ELF ?? */ 90*4a5d661aSToomas Soome #define AT_UID 11 /* Real uid. */ 91*4a5d661aSToomas Soome #define AT_EUID 12 /* Effective uid. */ 92*4a5d661aSToomas Soome #define AT_GID 13 /* Real gid. */ 93*4a5d661aSToomas Soome #define AT_EGID 14 /* Effective gid. */ 94*4a5d661aSToomas Soome #define AT_EXECPATH 15 /* Path to the executable. */ 95*4a5d661aSToomas Soome #define AT_CANARY 16 /* Canary for SSP. */ 96*4a5d661aSToomas Soome #define AT_CANARYLEN 17 /* Length of the canary. */ 97*4a5d661aSToomas Soome #define AT_OSRELDATE 18 /* OSRELDATE. */ 98*4a5d661aSToomas Soome #define AT_NCPUS 19 /* Number of CPUs. */ 99*4a5d661aSToomas Soome #define AT_PAGESIZES 20 /* Pagesizes. */ 100*4a5d661aSToomas Soome #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */ 101*4a5d661aSToomas Soome #define AT_TIMEKEEP 22 /* Pointer to timehands. */ 102*4a5d661aSToomas Soome #define AT_STACKPROT 23 /* Initial stack protection. */ 103*4a5d661aSToomas Soome 104*4a5d661aSToomas Soome #define AT_COUNT 24 /* Count of defined aux entry types. */ 105*4a5d661aSToomas Soome 106*4a5d661aSToomas Soome /* 107*4a5d661aSToomas Soome * Relocation types. 108*4a5d661aSToomas Soome */ 109*4a5d661aSToomas Soome 110*4a5d661aSToomas Soome #define R_386_COUNT 38 /* Count of defined relocation types. */ 111*4a5d661aSToomas Soome 112*4a5d661aSToomas Soome /* Define "machine" characteristics */ 113*4a5d661aSToomas Soome #define ELF_TARG_CLASS ELFCLASS32 114*4a5d661aSToomas Soome #define ELF_TARG_DATA ELFDATA2LSB 115*4a5d661aSToomas Soome #define ELF_TARG_MACH EM_386 116*4a5d661aSToomas Soome #define ELF_TARG_VER 1 117*4a5d661aSToomas Soome 118*4a5d661aSToomas Soome #define ET_DYN_LOAD_ADDR 0x01001000 119*4a5d661aSToomas Soome 120*4a5d661aSToomas Soome #elif defined(__amd64__) 121*4a5d661aSToomas Soome 122*4a5d661aSToomas Soome /* 123*4a5d661aSToomas Soome * ELF definitions for the AMD64 architecture. 124*4a5d661aSToomas Soome */ 125*4a5d661aSToomas Soome 126*4a5d661aSToomas Soome #ifndef __ELF_WORD_SIZE 127*4a5d661aSToomas Soome #define __ELF_WORD_SIZE 64 /* Used by <sys/elf_generic.h> */ 128*4a5d661aSToomas Soome #endif 129*4a5d661aSToomas Soome #include <sys/elf32.h> /* Definitions common to all 32 bit architectures. */ 130*4a5d661aSToomas Soome #include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */ 131*4a5d661aSToomas Soome #include <sys/elf_generic.h> 132*4a5d661aSToomas Soome 133*4a5d661aSToomas Soome #define ELF_ARCH EM_X86_64 134*4a5d661aSToomas Soome #define ELF_ARCH32 EM_386 135*4a5d661aSToomas Soome 136*4a5d661aSToomas Soome #define ELF_MACHINE_OK(x) ((x) == EM_X86_64) 137*4a5d661aSToomas Soome 138*4a5d661aSToomas Soome /* 139*4a5d661aSToomas Soome * Auxiliary vector entries for passing information to the interpreter. 140*4a5d661aSToomas Soome * 141*4a5d661aSToomas Soome * The i386 supplement to the SVR4 ABI specification names this "auxv_t", 142*4a5d661aSToomas Soome * but POSIX lays claim to all symbols ending with "_t". 143*4a5d661aSToomas Soome */ 144*4a5d661aSToomas Soome typedef struct { /* Auxiliary vector entry on initial stack */ 145*4a5d661aSToomas Soome int a_type; /* Entry type. */ 146*4a5d661aSToomas Soome union { 147*4a5d661aSToomas Soome int a_val; /* Integer value. */ 148*4a5d661aSToomas Soome } a_un; 149*4a5d661aSToomas Soome } Elf32_Auxinfo; 150*4a5d661aSToomas Soome 151*4a5d661aSToomas Soome 152*4a5d661aSToomas Soome typedef struct { /* Auxiliary vector entry on initial stack */ 153*4a5d661aSToomas Soome long a_type; /* Entry type. */ 154*4a5d661aSToomas Soome union { 155*4a5d661aSToomas Soome long a_val; /* Integer value. */ 156*4a5d661aSToomas Soome void *a_ptr; /* Address. */ 157*4a5d661aSToomas Soome void (*a_fcn)(void); /* Function pointer (not used). */ 158*4a5d661aSToomas Soome } a_un; 159*4a5d661aSToomas Soome } Elf64_Auxinfo; 160*4a5d661aSToomas Soome 161*4a5d661aSToomas Soome __ElfType(Auxinfo); 162*4a5d661aSToomas Soome 163*4a5d661aSToomas Soome /* Values for a_type. */ 164*4a5d661aSToomas Soome #define AT_NULL 0 /* Terminates the vector. */ 165*4a5d661aSToomas Soome #define AT_IGNORE 1 /* Ignored entry. */ 166*4a5d661aSToomas Soome #define AT_EXECFD 2 /* File descriptor of program to load. */ 167*4a5d661aSToomas Soome #define AT_PHDR 3 /* Program header of program already loaded. */ 168*4a5d661aSToomas Soome #define AT_PHENT 4 /* Size of each program header entry. */ 169*4a5d661aSToomas Soome #define AT_PHNUM 5 /* Number of program header entries. */ 170*4a5d661aSToomas Soome #define AT_PAGESZ 6 /* Page size in bytes. */ 171*4a5d661aSToomas Soome #define AT_BASE 7 /* Interpreter's base address. */ 172*4a5d661aSToomas Soome #define AT_FLAGS 8 /* Flags (unused for i386). */ 173*4a5d661aSToomas Soome #define AT_ENTRY 9 /* Where interpreter should transfer control. */ 174*4a5d661aSToomas Soome #define AT_NOTELF 10 /* Program is not ELF ?? */ 175*4a5d661aSToomas Soome #define AT_UID 11 /* Real uid. */ 176*4a5d661aSToomas Soome #define AT_EUID 12 /* Effective uid. */ 177*4a5d661aSToomas Soome #define AT_GID 13 /* Real gid. */ 178*4a5d661aSToomas Soome #define AT_EGID 14 /* Effective gid. */ 179*4a5d661aSToomas Soome #define AT_EXECPATH 15 /* Path to the executable. */ 180*4a5d661aSToomas Soome #define AT_CANARY 16 /* Canary for SSP */ 181*4a5d661aSToomas Soome #define AT_CANARYLEN 17 /* Length of the canary. */ 182*4a5d661aSToomas Soome #define AT_OSRELDATE 18 /* OSRELDATE. */ 183*4a5d661aSToomas Soome #define AT_NCPUS 19 /* Number of CPUs. */ 184*4a5d661aSToomas Soome #define AT_PAGESIZES 20 /* Pagesizes. */ 185*4a5d661aSToomas Soome #define AT_PAGESIZESLEN 21 /* Number of pagesizes. */ 186*4a5d661aSToomas Soome #define AT_TIMEKEEP 22 /* Pointer to timehands. */ 187*4a5d661aSToomas Soome #define AT_STACKPROT 23 /* Initial stack protection. */ 188*4a5d661aSToomas Soome 189*4a5d661aSToomas Soome #define AT_COUNT 24 /* Count of defined aux entry types. */ 190*4a5d661aSToomas Soome 191*4a5d661aSToomas Soome /* 192*4a5d661aSToomas Soome * Relocation types. 193*4a5d661aSToomas Soome */ 194*4a5d661aSToomas Soome 195*4a5d661aSToomas Soome #define R_X86_64_COUNT 24 /* Count of defined relocation types. */ 196*4a5d661aSToomas Soome 197*4a5d661aSToomas Soome /* Define "machine" characteristics */ 198*4a5d661aSToomas Soome #if __ELF_WORD_SIZE == 32 199*4a5d661aSToomas Soome #define ELF_TARG_CLASS ELFCLASS32 200*4a5d661aSToomas Soome #else 201*4a5d661aSToomas Soome #define ELF_TARG_CLASS ELFCLASS64 202*4a5d661aSToomas Soome #endif 203*4a5d661aSToomas Soome #define ELF_TARG_DATA ELFDATA2LSB 204*4a5d661aSToomas Soome #define ELF_TARG_MACH EM_X86_64 205*4a5d661aSToomas Soome #define ELF_TARG_VER 1 206*4a5d661aSToomas Soome 207*4a5d661aSToomas Soome #if __ELF_WORD_SIZE == 32 208*4a5d661aSToomas Soome #define ET_DYN_LOAD_ADDR 0x01001000 209*4a5d661aSToomas Soome #else 210*4a5d661aSToomas Soome #define ET_DYN_LOAD_ADDR 0x01021000 211*4a5d661aSToomas Soome #endif 212*4a5d661aSToomas Soome 213*4a5d661aSToomas Soome #endif /* __i386__, __amd64__ */ 214*4a5d661aSToomas Soome 215*4a5d661aSToomas Soome #endif /* !_MACHINE_ELF_H_ */ 216