elf.h (4524B)
1 /* 2 * Copyright (c) 2004 Russ Cox. See LICENSE. 3 */ 4 5 /* /home/rsc/papers/elfXXelf.pdf */ 6 7 typedef struct Elf Elf; 8 typedef struct ElfHdr ElfHdr; 9 typedef struct ElfSect ElfSect; 10 typedef struct ElfProg ElfProg; 11 typedef struct ElfNote ElfNote; 12 typedef struct ElfSym ElfSym; 13 14 enum 15 { 16 ElfClassNone = 0, 17 ElfClass32, 18 ElfClass64, 19 20 ElfDataNone = 0, 21 ElfDataLsb, 22 ElfDataMsb, 23 24 ElfTypeNone = 0, 25 ElfTypeRelocatable, 26 ElfTypeExecutable, 27 ElfTypeSharedObject, 28 ElfTypeCore, 29 /* 0xFF00 - 0xFFFF reserved for processor-specific types */ 30 31 ElfMachNone = 0, 32 ElfMach32100, /* AT&T WE 32100 */ 33 ElfMachSparc, /* SPARC */ 34 ElfMach386, /* Intel 80386 */ 35 ElfMach68000, /* Motorola 68000 */ 36 ElfMach88000, /* Motorola 88000 */ 37 ElfMach486, /* Intel 80486, no longer used */ 38 ElfMach860, /* Intel 80860 */ 39 ElfMachMips, /* MIPS RS3000 */ 40 ElfMachS370, /* IBM System/370 */ 41 ElfMachMipsLe, /* MIPS RS3000 LE */ 42 ElfMachParisc = 15, /* HP PA RISC */ 43 ElfMachVpp500 = 17, /* Fujitsu VPP500 */ 44 ElfMachSparc32Plus, /* SPARC V8+ */ 45 ElfMach960, /* Intel 80960 */ 46 ElfMachPower, /* PowerPC */ 47 ElfMachPower64, /* PowerPC 64 */ 48 ElfMachS390, /* IBM System/390 */ 49 ElfMachV800 = 36, /* NEC V800 */ 50 ElfMachFr20, /* Fujitsu FR20 */ 51 ElfMachRh32, /* TRW RH-32 */ 52 ElfMachRce, /* Motorola RCE */ 53 ElfMachArm, /* ARM */ 54 ElfMachAlpha, /* Digital Alpha */ 55 ElfMachSH, /* Hitachi SH */ 56 ElfMachSparc9, /* SPARC V9 */ 57 ElfMachAmd64 = 62, /* x86-64 */ 58 /* and the list goes on... */ 59 60 ElfAbiNone = 0, 61 ElfAbiSystemV = 0, /* [sic] */ 62 ElfAbiHPUX, 63 ElfAbiNetBSD, 64 ElfAbiLinux, 65 ElfAbiSolaris = 6, 66 ElfAbiAix, 67 ElfAbiIrix, 68 ElfAbiFreeBSD, 69 ElfAbiTru64, 70 ElfAbiModesto, 71 ElfAbiOpenBSD, 72 ElfAbiARM = 97, 73 ElfAbiEmbedded = 255, 74 75 /* some of sections 0xFF00 - 0xFFFF reserved for various things */ 76 ElfSectNone = 0, 77 ElfSectProgbits, 78 ElfSectSymtab, 79 ElfSectStrtab, 80 ElfSectRela, 81 ElfSectHash, 82 ElfSectDynamic, 83 ElfSectNote, 84 ElfSectNobits, 85 ElfSectRel, 86 ElfSectShlib, 87 ElfSectDynsym, 88 89 ElfSectFlagWrite = 0x1, 90 ElfSectFlagAlloc = 0x2, 91 ElfSectFlagExec = 0x4, 92 /* 0xF0000000 are reserved for processor specific */ 93 94 ElfSymBindLocal = 0, 95 ElfSymBindGlobal, 96 ElfSymBindWeak, 97 /* 13-15 reserved */ 98 99 ElfSymTypeNone = 0, 100 ElfSymTypeObject, 101 ElfSymTypeFunc, 102 ElfSymTypeSection, 103 ElfSymTypeFile, 104 /* 13-15 reserved */ 105 106 ElfSymShnNone = 0, 107 ElfSymShnAbs = 0xFFF1, 108 ElfSymShnCommon = 0xFFF2, 109 /* 0xFF00-0xFF1F reserved for processors */ 110 /* 0xFF20-0xFF3F reserved for operating systems */ 111 112 ElfProgNone = 0, 113 ElfProgLoad, 114 ElfProgDynamic, 115 ElfProgInterp, 116 ElfProgNote, 117 ElfProgShlib, 118 ElfProgPhdr, 119 120 ElfProgFlagExec = 0x1, 121 ElfProgFlagWrite = 0x2, 122 ElfProgFlagRead = 0x4, 123 124 ElfNotePrStatus = 1, 125 ElfNotePrFpreg = 2, 126 ElfNotePrPsinfo = 3, 127 ElfNotePrTaskstruct = 4, 128 ElfNotePrAuxv = 6, 129 ElfNotePrXfpreg = 0x46e62b7f /* for gdb/386 */ 130 }; 131 132 struct ElfHdr 133 { 134 uchar magic[4]; 135 uchar class; 136 uchar encoding; 137 uchar version; 138 uchar abi; 139 uchar abiversion; 140 u32int type; 141 u32int machine; 142 u64int entry; 143 u64int phoff; 144 u64int shoff; 145 u32int flags; 146 u32int ehsize; 147 u32int phentsize; 148 u32int phnum; 149 u32int shentsize; 150 u32int shnum; 151 u32int shstrndx; 152 u16int (*e2)(uchar*); 153 u32int (*e4)(uchar*); 154 u64int (*e8)(uchar*); 155 }; 156 157 struct ElfSect 158 { 159 char *name; 160 u32int type; 161 u64int flags; 162 u64int addr; 163 u64int offset; 164 u64int size; 165 u32int link; 166 u32int info; 167 u64int align; 168 u64int entsize; 169 uchar *base; 170 }; 171 172 struct ElfProg 173 { 174 u32int type; 175 u64int offset; 176 u64int vaddr; 177 u64int paddr; 178 u64int filesz; 179 u64int memsz; 180 u32int flags; 181 u64int align; 182 }; 183 184 struct ElfNote 185 { 186 u32int namesz; 187 u32int descsz; 188 u32int type; 189 char *name; 190 uchar *desc; 191 u32int offset; /* in-memory only */ 192 }; 193 194 struct ElfSym 195 { 196 char* name; 197 u64int value; 198 u64int size; 199 uchar bind; 200 uchar type; 201 uchar other; 202 u16int shndx; 203 }; 204 205 struct Elf 206 { 207 int fd; 208 ElfHdr hdr; 209 ElfSect *sect; 210 uint nsect; 211 ElfProg *prog; 212 uint nprog; 213 char *shstrtab; 214 215 int nsymtab; 216 ElfSect *symtab; 217 ElfSect *symstr; 218 int ndynsym; 219 ElfSect *dynsym; 220 ElfSect *dynstr; 221 ElfSect *bss; 222 ulong dynamic; /* offset to elf dynamic crap */ 223 224 int (*coreregs)(Elf*, ElfNote*, uchar**); 225 int (*corecmd)(Elf*, ElfNote*, char**); 226 }; 227 228 Elf* elfopen(char*); 229 Elf* elfinit(int); 230 ElfSect *elfsection(Elf*, char*); 231 void elfclose(Elf*); 232 int elfsym(Elf*, int, ElfSym*); 233 int elfsymlookup(Elf*, char*, ulong*); 234 int elfmap(Elf*, ElfSect*); 235 236 struct Fhdr; 237 void elfcorelinux386(struct Fhdr*, Elf*, ElfNote*); 238 void elfcorefreebsd386(struct Fhdr*, Elf*, ElfNote*); 239 void elfcorefreebsdamd64(struct Fhdr*, Elf*, ElfNote*); 240 void elfdl386mapdl(int);