Blame


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