1*1b8adde7SWilliam Kucharski /* 2*1b8adde7SWilliam Kucharski * GRUB -- GRand Unified Bootloader 3*1b8adde7SWilliam Kucharski * Copyright (C) 2001,2002 Free Software Foundation, Inc. 4*1b8adde7SWilliam Kucharski * 5*1b8adde7SWilliam Kucharski * This program is free software; you can redistribute it and/or modify 6*1b8adde7SWilliam Kucharski * it under the terms of the GNU General Public License as published by 7*1b8adde7SWilliam Kucharski * the Free Software Foundation; either version 2 of the License, or 8*1b8adde7SWilliam Kucharski * (at your option) any later version. 9*1b8adde7SWilliam Kucharski * 10*1b8adde7SWilliam Kucharski * This program is distributed in the hope that it will be useful, 11*1b8adde7SWilliam Kucharski * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*1b8adde7SWilliam Kucharski * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*1b8adde7SWilliam Kucharski * GNU General Public License for more details. 14*1b8adde7SWilliam Kucharski * 15*1b8adde7SWilliam Kucharski * You should have received a copy of the GNU General Public License 16*1b8adde7SWilliam Kucharski * along with this program; if not, write to the Free Software 17*1b8adde7SWilliam Kucharski * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18*1b8adde7SWilliam Kucharski */ 19*1b8adde7SWilliam Kucharski 20*1b8adde7SWilliam Kucharski /* 32-bit data types */ 21*1b8adde7SWilliam Kucharski 22*1b8adde7SWilliam Kucharski typedef unsigned long Elf32_Addr; 23*1b8adde7SWilliam Kucharski typedef unsigned short Elf32_Half; 24*1b8adde7SWilliam Kucharski typedef unsigned long Elf32_Off; 25*1b8adde7SWilliam Kucharski typedef signed long Elf32_Sword; 26*1b8adde7SWilliam Kucharski typedef unsigned long Elf32_Word; 27*1b8adde7SWilliam Kucharski /* "unsigned char" already exists */ 28*1b8adde7SWilliam Kucharski 29*1b8adde7SWilliam Kucharski /* ELF header */ 30*1b8adde7SWilliam Kucharski typedef struct 31*1b8adde7SWilliam Kucharski { 32*1b8adde7SWilliam Kucharski 33*1b8adde7SWilliam Kucharski #define EI_NIDENT 16 34*1b8adde7SWilliam Kucharski 35*1b8adde7SWilliam Kucharski /* first four characters are defined below */ 36*1b8adde7SWilliam Kucharski #define EI_MAG0 0 37*1b8adde7SWilliam Kucharski #define ELFMAG0 0x7f 38*1b8adde7SWilliam Kucharski #define EI_MAG1 1 39*1b8adde7SWilliam Kucharski #define ELFMAG1 'E' 40*1b8adde7SWilliam Kucharski #define EI_MAG2 2 41*1b8adde7SWilliam Kucharski #define ELFMAG2 'L' 42*1b8adde7SWilliam Kucharski #define EI_MAG3 3 43*1b8adde7SWilliam Kucharski #define ELFMAG3 'F' 44*1b8adde7SWilliam Kucharski 45*1b8adde7SWilliam Kucharski #define EI_CLASS 4 /* data sizes */ 46*1b8adde7SWilliam Kucharski #define ELFCLASS32 1 /* i386 -- up to 32-bit data sizes present */ 47*1b8adde7SWilliam Kucharski 48*1b8adde7SWilliam Kucharski #define EI_DATA 5 /* data type and ordering */ 49*1b8adde7SWilliam Kucharski #define ELFDATA2LSB 1 /* i386 -- LSB 2's complement */ 50*1b8adde7SWilliam Kucharski 51*1b8adde7SWilliam Kucharski #define EI_VERSION 6 /* version number. "e_version" must be the same */ 52*1b8adde7SWilliam Kucharski #define EV_CURRENT 1 /* current version number */ 53*1b8adde7SWilliam Kucharski 54*1b8adde7SWilliam Kucharski #define EI_OSABI 7 /* operating system/ABI indication */ 55*1b8adde7SWilliam Kucharski #define ELFOSABI_FREEBSD 9 56*1b8adde7SWilliam Kucharski 57*1b8adde7SWilliam Kucharski #define EI_ABIVERSION 8 /* ABI version */ 58*1b8adde7SWilliam Kucharski 59*1b8adde7SWilliam Kucharski #define EI_PAD 9 /* from here in is just padding */ 60*1b8adde7SWilliam Kucharski 61*1b8adde7SWilliam Kucharski #define EI_BRAND 8 /* start of OS branding (This is 62*1b8adde7SWilliam Kucharski obviously illegal against the ELF 63*1b8adde7SWilliam Kucharski standard.) */ 64*1b8adde7SWilliam Kucharski 65*1b8adde7SWilliam Kucharski unsigned char e_ident[EI_NIDENT]; /* basic identification block */ 66*1b8adde7SWilliam Kucharski 67*1b8adde7SWilliam Kucharski #define ET_EXEC 2 /* we only care about executable types */ 68*1b8adde7SWilliam Kucharski Elf32_Half e_type; /* file types */ 69*1b8adde7SWilliam Kucharski 70*1b8adde7SWilliam Kucharski #define EM_386 3 /* i386 -- obviously use this one */ 71*1b8adde7SWilliam Kucharski Elf32_Half e_machine; /* machine types */ 72*1b8adde7SWilliam Kucharski Elf32_Word e_version; /* use same as "EI_VERSION" above */ 73*1b8adde7SWilliam Kucharski Elf32_Addr e_entry; /* entry point of the program */ 74*1b8adde7SWilliam Kucharski Elf32_Off e_phoff; /* program header table file offset */ 75*1b8adde7SWilliam Kucharski Elf32_Off e_shoff; /* section header table file offset */ 76*1b8adde7SWilliam Kucharski Elf32_Word e_flags; /* flags */ 77*1b8adde7SWilliam Kucharski Elf32_Half e_ehsize; /* elf header size in bytes */ 78*1b8adde7SWilliam Kucharski Elf32_Half e_phentsize; /* program header entry size */ 79*1b8adde7SWilliam Kucharski Elf32_Half e_phnum; /* number of entries in program header */ 80*1b8adde7SWilliam Kucharski Elf32_Half e_shentsize; /* section header entry size */ 81*1b8adde7SWilliam Kucharski Elf32_Half e_shnum; /* number of entries in section header */ 82*1b8adde7SWilliam Kucharski 83*1b8adde7SWilliam Kucharski #define SHN_UNDEF 0 84*1b8adde7SWilliam Kucharski #define SHN_LORESERVE 0xff00 85*1b8adde7SWilliam Kucharski #define SHN_LOPROC 0xff00 86*1b8adde7SWilliam Kucharski #define SHN_HIPROC 0xff1f 87*1b8adde7SWilliam Kucharski #define SHN_ABS 0xfff1 88*1b8adde7SWilliam Kucharski #define SHN_COMMON 0xfff2 89*1b8adde7SWilliam Kucharski #define SHN_HIRESERVE 0xffff 90*1b8adde7SWilliam Kucharski Elf32_Half e_shstrndx; /* section header table index */ 91*1b8adde7SWilliam Kucharski } 92*1b8adde7SWilliam Kucharski Elf32_Ehdr; 93*1b8adde7SWilliam Kucharski 94*1b8adde7SWilliam Kucharski 95*1b8adde7SWilliam Kucharski #define BOOTABLE_I386_ELF(h) \ 96*1b8adde7SWilliam Kucharski ((h.e_ident[EI_MAG0] == ELFMAG0) & (h.e_ident[EI_MAG1] == ELFMAG1) \ 97*1b8adde7SWilliam Kucharski & (h.e_ident[EI_MAG2] == ELFMAG2) & (h.e_ident[EI_MAG3] == ELFMAG3) \ 98*1b8adde7SWilliam Kucharski & (h.e_ident[EI_CLASS] == ELFCLASS32) & (h.e_ident[EI_DATA] == ELFDATA2LSB) \ 99*1b8adde7SWilliam Kucharski & (h.e_ident[EI_VERSION] == EV_CURRENT) & (h.e_type == ET_EXEC) \ 100*1b8adde7SWilliam Kucharski & (h.e_machine == EM_386) & (h.e_version == EV_CURRENT)) 101*1b8adde7SWilliam Kucharski 102*1b8adde7SWilliam Kucharski /* section table - ? */ 103*1b8adde7SWilliam Kucharski typedef struct 104*1b8adde7SWilliam Kucharski { 105*1b8adde7SWilliam Kucharski Elf32_Word sh_name; /* Section name (string tbl index) */ 106*1b8adde7SWilliam Kucharski Elf32_Word sh_type; /* Section type */ 107*1b8adde7SWilliam Kucharski Elf32_Word sh_flags; /* Section flags */ 108*1b8adde7SWilliam Kucharski Elf32_Addr sh_addr; /* Section virtual addr at execution */ 109*1b8adde7SWilliam Kucharski Elf32_Off sh_offset; /* Section file offset */ 110*1b8adde7SWilliam Kucharski Elf32_Word sh_size; /* Section size in bytes */ 111*1b8adde7SWilliam Kucharski Elf32_Word sh_link; /* Link to another section */ 112*1b8adde7SWilliam Kucharski Elf32_Word sh_info; /* Additional section information */ 113*1b8adde7SWilliam Kucharski Elf32_Word sh_addralign; /* Section alignment */ 114*1b8adde7SWilliam Kucharski Elf32_Word sh_entsize; /* Entry size if section holds table */ 115*1b8adde7SWilliam Kucharski } 116*1b8adde7SWilliam Kucharski Elf32_Shdr; 117*1b8adde7SWilliam Kucharski 118*1b8adde7SWilliam Kucharski /* symbol table - page 4-25, figure 4-15 */ 119*1b8adde7SWilliam Kucharski typedef struct 120*1b8adde7SWilliam Kucharski { 121*1b8adde7SWilliam Kucharski Elf32_Word st_name; 122*1b8adde7SWilliam Kucharski Elf32_Addr st_value; 123*1b8adde7SWilliam Kucharski Elf32_Word st_size; 124*1b8adde7SWilliam Kucharski unsigned char st_info; 125*1b8adde7SWilliam Kucharski unsigned char st_other; 126*1b8adde7SWilliam Kucharski Elf32_Half st_shndx; 127*1b8adde7SWilliam Kucharski } 128*1b8adde7SWilliam Kucharski Elf32_Sym; 129*1b8adde7SWilliam Kucharski 130*1b8adde7SWilliam Kucharski /* symbol type and binding attributes - page 4-26 */ 131*1b8adde7SWilliam Kucharski 132*1b8adde7SWilliam Kucharski #define ELF32_ST_BIND(i) ((i) >> 4) 133*1b8adde7SWilliam Kucharski #define ELF32_ST_TYPE(i) ((i) & 0xf) 134*1b8adde7SWilliam Kucharski #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) 135*1b8adde7SWilliam Kucharski 136*1b8adde7SWilliam Kucharski /* symbol binding - page 4-26, figure 4-16 */ 137*1b8adde7SWilliam Kucharski 138*1b8adde7SWilliam Kucharski #define STB_LOCAL 0 139*1b8adde7SWilliam Kucharski #define STB_GLOBAL 1 140*1b8adde7SWilliam Kucharski #define STB_WEAK 2 141*1b8adde7SWilliam Kucharski #define STB_LOPROC 13 142*1b8adde7SWilliam Kucharski #define STB_HIPROC 15 143*1b8adde7SWilliam Kucharski 144*1b8adde7SWilliam Kucharski /* symbol types - page 4-28, figure 4-17 */ 145*1b8adde7SWilliam Kucharski 146*1b8adde7SWilliam Kucharski #define STT_NOTYPE 0 147*1b8adde7SWilliam Kucharski #define STT_OBJECT 1 148*1b8adde7SWilliam Kucharski #define STT_FUNC 2 149*1b8adde7SWilliam Kucharski #define STT_SECTION 3 150*1b8adde7SWilliam Kucharski #define STT_FILE 4 151*1b8adde7SWilliam Kucharski #define STT_LOPROC 13 152*1b8adde7SWilliam Kucharski #define STT_HIPROC 15 153*1b8adde7SWilliam Kucharski 154*1b8adde7SWilliam Kucharski 155*1b8adde7SWilliam Kucharski /* Macros to split/combine relocation type and symbol page 4-32 */ 156*1b8adde7SWilliam Kucharski 157*1b8adde7SWilliam Kucharski #define ELF32_R_SYM(__i) ((__i)>>8) 158*1b8adde7SWilliam Kucharski #define ELF32_R_TYPE(__i) ((unsigned char) (__i)) 159*1b8adde7SWilliam Kucharski #define ELF32_R_INFO(__s, __t) (((__s)<<8) + (unsigned char) (__t)) 160*1b8adde7SWilliam Kucharski 161*1b8adde7SWilliam Kucharski 162*1b8adde7SWilliam Kucharski /* program header - page 5-2, figure 5-1 */ 163*1b8adde7SWilliam Kucharski 164*1b8adde7SWilliam Kucharski typedef struct 165*1b8adde7SWilliam Kucharski { 166*1b8adde7SWilliam Kucharski Elf32_Word p_type; 167*1b8adde7SWilliam Kucharski Elf32_Off p_offset; 168*1b8adde7SWilliam Kucharski Elf32_Addr p_vaddr; 169*1b8adde7SWilliam Kucharski Elf32_Addr p_paddr; 170*1b8adde7SWilliam Kucharski Elf32_Word p_filesz; 171*1b8adde7SWilliam Kucharski Elf32_Word p_memsz; 172*1b8adde7SWilliam Kucharski Elf32_Word p_flags; 173*1b8adde7SWilliam Kucharski Elf32_Word p_align; 174*1b8adde7SWilliam Kucharski } 175*1b8adde7SWilliam Kucharski Elf32_Phdr; 176*1b8adde7SWilliam Kucharski 177*1b8adde7SWilliam Kucharski /* segment types - page 5-3, figure 5-2 */ 178*1b8adde7SWilliam Kucharski 179*1b8adde7SWilliam Kucharski #define PT_NULL 0 180*1b8adde7SWilliam Kucharski #define PT_LOAD 1 181*1b8adde7SWilliam Kucharski #define PT_DYNAMIC 2 182*1b8adde7SWilliam Kucharski #define PT_INTERP 3 183*1b8adde7SWilliam Kucharski #define PT_NOTE 4 184*1b8adde7SWilliam Kucharski #define PT_SHLIB 5 185*1b8adde7SWilliam Kucharski #define PT_PHDR 6 186*1b8adde7SWilliam Kucharski 187*1b8adde7SWilliam Kucharski #define PT_LOPROC 0x70000000 188*1b8adde7SWilliam Kucharski #define PT_HIPROC 0x7fffffff 189*1b8adde7SWilliam Kucharski 190*1b8adde7SWilliam Kucharski /* segment permissions - page 5-6 */ 191*1b8adde7SWilliam Kucharski 192*1b8adde7SWilliam Kucharski #define PF_X 0x1 193*1b8adde7SWilliam Kucharski #define PF_W 0x2 194*1b8adde7SWilliam Kucharski #define PF_R 0x4 195*1b8adde7SWilliam Kucharski #define PF_MASKPROC 0xf0000000 196*1b8adde7SWilliam Kucharski 197*1b8adde7SWilliam Kucharski 198*1b8adde7SWilliam Kucharski /* dynamic structure - page 5-15, figure 5-9 */ 199*1b8adde7SWilliam Kucharski 200*1b8adde7SWilliam Kucharski typedef struct 201*1b8adde7SWilliam Kucharski { 202*1b8adde7SWilliam Kucharski Elf32_Sword d_tag; 203*1b8adde7SWilliam Kucharski union 204*1b8adde7SWilliam Kucharski { 205*1b8adde7SWilliam Kucharski Elf32_Word d_val; 206*1b8adde7SWilliam Kucharski Elf32_Addr d_ptr; 207*1b8adde7SWilliam Kucharski } 208*1b8adde7SWilliam Kucharski d_un; 209*1b8adde7SWilliam Kucharski } 210*1b8adde7SWilliam Kucharski Elf32_Dyn; 211*1b8adde7SWilliam Kucharski 212*1b8adde7SWilliam Kucharski /* Dynamic array tags - page 5-16, figure 5-10. */ 213*1b8adde7SWilliam Kucharski 214*1b8adde7SWilliam Kucharski #define DT_NULL 0 215*1b8adde7SWilliam Kucharski #define DT_NEEDED 1 216*1b8adde7SWilliam Kucharski #define DT_PLTRELSZ 2 217*1b8adde7SWilliam Kucharski #define DT_PLTGOT 3 218*1b8adde7SWilliam Kucharski #define DT_HASH 4 219*1b8adde7SWilliam Kucharski #define DT_STRTAB 5 220*1b8adde7SWilliam Kucharski #define DT_SYMTAB 6 221*1b8adde7SWilliam Kucharski #define DT_RELA 7 222*1b8adde7SWilliam Kucharski #define DT_RELASZ 8 223*1b8adde7SWilliam Kucharski #define DT_RELAENT 9 224*1b8adde7SWilliam Kucharski #define DT_STRSZ 10 225*1b8adde7SWilliam Kucharski #define DT_SYMENT 11 226*1b8adde7SWilliam Kucharski #define DT_INIT 12 227*1b8adde7SWilliam Kucharski #define DT_FINI 13 228*1b8adde7SWilliam Kucharski #define DT_SONAME 14 229*1b8adde7SWilliam Kucharski #define DT_RPATH 15 230*1b8adde7SWilliam Kucharski #define DT_SYMBOLIC 16 231*1b8adde7SWilliam Kucharski #define DT_REL 17 232*1b8adde7SWilliam Kucharski #define DT_RELSZ 18 233*1b8adde7SWilliam Kucharski #define DT_RELENT 19 234*1b8adde7SWilliam Kucharski #define DT_PLTREL 20 235*1b8adde7SWilliam Kucharski #define DT_DEBUG 21 236*1b8adde7SWilliam Kucharski #define DT_TEXTREL 22 237*1b8adde7SWilliam Kucharski #define DT_JMPREL 23 238