Statistics
| Branch: | Revision:

root / elf.h @ 31e31b8a

History | View | Annotate | Download (10.7 kB)

1
/*
2
 * ELF register definitions..
3
 */
4

    
5
#include <inttypes.h>
6

    
7
typedef uint32_t  elf_greg_t;
8

    
9
#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
10
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
11

    
12
typedef struct user_i387_struct elf_fpregset_t;
13

    
14
/*
15
 * This is used to ensure we don't load something for the wrong architecture.
16
 */
17
#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
18

    
19
/*
20
 * These are used to set parameters in the core dumps.
21
 */
22
#define ELF_CLASS        ELFCLASS32
23
#define ELF_DATA        ELFDATA2LSB;
24
#define ELF_ARCH        EM_386
25

    
26
        /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program
27
           starts %edx contains a pointer to a function which might be
28
           registered using `atexit'.  This provides a mean for the
29
           dynamic linker to call DT_FINI functions for shared libraries
30
           that have been loaded before the code runs.
31

32
           A value of 0 tells we have no such handler.  */
33
#define ELF_PLAT_INIT(_r)        _r->edx = 0
34

    
35
#define USE_ELF_CORE_DUMP
36
#define ELF_EXEC_PAGESIZE        4096
37

    
38

    
39
typedef uint32_t         Elf32_Addr;
40
typedef uint16_t Elf32_Half;
41
typedef uint32_t Elf32_Off;
42
typedef int32_t  Elf32_Sword;
43
typedef uint32_t Elf32_Word;
44

    
45
/* These constants are for the segment types stored in the image headers */
46
#define PT_NULL    0
47
#define PT_LOAD    1
48
#define PT_DYNAMIC 2
49
#define PT_INTERP  3
50
#define PT_NOTE    4
51
#define PT_SHLIB   5
52
#define PT_PHDR    6
53
#define PT_LOPROC  0x70000000
54
#define PT_HIPROC  0x7fffffff
55

    
56
/* These constants define the different elf file types */
57
#define ET_NONE   0
58
#define ET_REL    1
59
#define ET_EXEC   2
60
#define ET_DYN    3
61
#define ET_CORE   4
62
#define ET_LOPROC 5
63
#define ET_HIPROC 6
64

    
65
/* These constants define the various ELF target machines */
66
#define EM_NONE  0
67
#define EM_M32   1
68
#define EM_SPARC 2
69
#define EM_386   3
70
#define EM_68K   4
71
#define EM_88K   5
72
#define EM_486   6   /* Perhaps disused */
73
#define EM_860   7
74

    
75
#define EM_MIPS                8        /* MIPS R3000 (officially, big-endian only) */
76

    
77
#define EM_MIPS_RS4_BE 10        /* MIPS R4000 big-endian */
78

    
79
#define EM_SPARC64     11        /* SPARC v9 (not official) 64-bit */
80

    
81
#define EM_PARISC      15        /* HPPA */
82

    
83
#define EM_SPARC32PLUS 18        /* Sun's "v8plus" */
84

    
85
#define EM_PPC               20        /* PowerPC */
86

    
87
/*
88
 * This is an interim value that we will use until the committee comes
89
 * up with a final number.
90
 */
91
#define EM_ALPHA        0x9026
92

    
93

    
94
/* This is the info that is needed to parse the dynamic section of the file */
95
#define DT_NULL                0
96
#define DT_NEEDED        1
97
#define DT_PLTRELSZ        2
98
#define DT_PLTGOT        3
99
#define DT_HASH                4
100
#define DT_STRTAB        5
101
#define DT_SYMTAB        6
102
#define DT_RELA                7
103
#define DT_RELASZ        8
104
#define DT_RELAENT        9
105
#define DT_STRSZ        10
106
#define DT_SYMENT        11
107
#define DT_INIT                12
108
#define DT_FINI                13
109
#define DT_SONAME        14
110
#define DT_RPATH         15
111
#define DT_SYMBOLIC        16
112
#define DT_REL                17
113
#define DT_RELSZ        18
114
#define DT_RELENT        19
115
#define DT_PLTREL        20
116
#define DT_DEBUG        21
117
#define DT_TEXTREL        22
118
#define DT_JMPREL        23
119
#define DT_LOPROC        0x70000000
120
#define DT_HIPROC        0x7fffffff
121

    
122
/* This info is needed when parsing the symbol table */
123
#define STB_LOCAL  0
124
#define STB_GLOBAL 1
125
#define STB_WEAK   2
126

    
127
#define STT_NOTYPE  0
128
#define STT_OBJECT  1
129
#define STT_FUNC    2
130
#define STT_SECTION 3
131
#define STT_FILE    4
132

    
133
#define ELF32_ST_BIND(x) ((x) >> 4)
134
#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
135

    
136
/* Symbolic values for the entries in the auxiliary table
137
   put on the initial stack */
138
#define AT_NULL   0        /* end of vector */
139
#define AT_IGNORE 1        /* entry should be ignored */
140
#define AT_EXECFD 2        /* file descriptor of program */
141
#define AT_PHDR   3        /* program headers for program */
142
#define AT_PHENT  4        /* size of program header entry */
143
#define AT_PHNUM  5        /* number of program headers */
144
#define AT_PAGESZ 6        /* system page size */
145
#define AT_BASE   7        /* base address of interpreter */
146
#define AT_FLAGS  8        /* flags */
147
#define AT_ENTRY  9        /* entry point of program */
148
#define AT_NOTELF 10        /* program is not ELF */
149
#define AT_UID    11        /* real uid */
150
#define AT_EUID   12        /* effective uid */
151
#define AT_GID    13        /* real gid */
152
#define AT_EGID   14        /* effective gid */
153

    
154

    
155
typedef struct dynamic{
156
  Elf32_Sword d_tag;
157
  union{
158
    Elf32_Sword        d_val;
159
    Elf32_Addr        d_ptr;
160
  } d_un;
161
} Elf32_Dyn;
162

    
163
typedef struct {
164
  unsigned long long d_tag;                /* entry tag value */
165
  union {
166
    unsigned long long d_val;
167
    unsigned long long d_ptr;
168
  } d_un;
169
} Elf64_Dyn;
170

    
171
/* The following are used with relocations */
172
#define ELF32_R_SYM(x) ((x) >> 8)
173
#define ELF32_R_TYPE(x) ((x) & 0xff)
174

    
175
#define R_386_NONE        0
176
#define R_386_32        1
177
#define R_386_PC32        2
178
#define R_386_GOT32        3
179
#define R_386_PLT32        4
180
#define R_386_COPY        5
181
#define R_386_GLOB_DAT        6
182
#define R_386_JMP_SLOT        7
183
#define R_386_RELATIVE        8
184
#define R_386_GOTOFF        9
185
#define R_386_GOTPC        10
186
#define R_386_NUM        11
187

    
188
typedef struct elf32_rel {
189
  Elf32_Addr        r_offset;
190
  Elf32_Word        r_info;
191
} Elf32_Rel;
192

    
193
typedef struct elf64_rel {
194
  unsigned long long r_offset;        /* Location at which to apply the action */
195
  unsigned long long r_info;        /* index and type of relocation */
196
} Elf64_Rel;
197

    
198
typedef struct elf32_rela{
199
  Elf32_Addr        r_offset;
200
  Elf32_Word        r_info;
201
  Elf32_Sword        r_addend;
202
} Elf32_Rela;
203

    
204
typedef struct elf64_rela {
205
  unsigned long long r_offset;        /* Location at which to apply the action */
206
  unsigned long long r_info;        /* index and type of relocation */
207
  unsigned long long r_addend;        /* Constant addend used to compute value */
208
} Elf64_Rela;
209

    
210
typedef struct elf32_sym{
211
  Elf32_Word        st_name;
212
  Elf32_Addr        st_value;
213
  Elf32_Word        st_size;
214
  unsigned char        st_info;
215
  unsigned char        st_other;
216
  Elf32_Half        st_shndx;
217
} Elf32_Sym;
218

    
219
typedef struct elf64_sym {
220
  unsigned int        st_name;                /* Symbol name, index in string tbl */
221
  unsigned char        st_info;                /* Type and binding attributes */
222
  unsigned char        st_other;                /* No defined meaning, 0 */
223
  unsigned short st_shndx;                /* Associated section index */
224
  unsigned long long st_value;                /* Value of the symbol */
225
  unsigned long long st_size;                /* Associated symbol size */
226
} Elf64_Sym;
227

    
228

    
229
#define EI_NIDENT        16
230

    
231
typedef struct elf32_hdr{
232
  unsigned char        e_ident[EI_NIDENT];
233
  Elf32_Half        e_type;
234
  Elf32_Half        e_machine;
235
  Elf32_Word        e_version;
236
  Elf32_Addr        e_entry;  /* Entry point */
237
  Elf32_Off        e_phoff;
238
  Elf32_Off        e_shoff;
239
  Elf32_Word        e_flags;
240
  Elf32_Half        e_ehsize;
241
  Elf32_Half        e_phentsize;
242
  Elf32_Half        e_phnum;
243
  Elf32_Half        e_shentsize;
244
  Elf32_Half        e_shnum;
245
  Elf32_Half        e_shstrndx;
246
} Elf32_Ehdr;
247

    
248
typedef struct elf64_hdr {
249
  unsigned char        e_ident[16];                /* ELF "magic number" */
250
  short int e_type;
251
  short unsigned int e_machine;
252
  int   e_version;
253
  unsigned long long e_entry;                /* Entry point virtual address */
254
  unsigned long long e_phoff;                /* Program header table file offset */
255
  unsigned long long e_shoff;                /* Section header table file offset */
256
  int   e_flags;
257
  short int e_ehsize;
258
  short int e_phentsize;
259
  short int e_phnum;
260
  short int e_shentsize;
261
  short int e_shnum;
262
  short int e_shstrndx;
263
} Elf64_Ehdr;
264

    
265
/* These constants define the permissions on sections in the program
266
   header, p_flags. */
267
#define PF_R                0x4
268
#define PF_W                0x2
269
#define PF_X                0x1
270

    
271
typedef struct elf32_phdr{
272
  Elf32_Word        p_type;
273
  Elf32_Off        p_offset;
274
  Elf32_Addr        p_vaddr;
275
  Elf32_Addr        p_paddr;
276
  Elf32_Word        p_filesz;
277
  Elf32_Word        p_memsz;
278
  Elf32_Word        p_flags;
279
  Elf32_Word        p_align;
280
} Elf32_Phdr;
281

    
282
typedef struct elf64_phdr {
283
  int p_type;
284
  int p_flags;
285
  unsigned long long p_offset;                /* Segment file offset */
286
  unsigned long long p_vaddr;                /* Segment virtual address */
287
  unsigned long long p_paddr;                /* Segment physical address */
288
  unsigned long long p_filesz;                /* Segment size in file */
289
  unsigned long long p_memsz;                /* Segment size in memory */
290
  unsigned long long p_align;                /* Segment alignment, file & memory */
291
} Elf64_Phdr;
292

    
293
/* sh_type */
294
#define SHT_NULL        0
295
#define SHT_PROGBITS        1
296
#define SHT_SYMTAB        2
297
#define SHT_STRTAB        3
298
#define SHT_RELA        4
299
#define SHT_HASH        5
300
#define SHT_DYNAMIC        6
301
#define SHT_NOTE        7
302
#define SHT_NOBITS        8
303
#define SHT_REL                9
304
#define SHT_SHLIB        10
305
#define SHT_DYNSYM        11
306
#define SHT_NUM                12
307
#define SHT_LOPROC        0x70000000
308
#define SHT_HIPROC        0x7fffffff
309
#define SHT_LOUSER        0x80000000
310
#define SHT_HIUSER        0xffffffff
311

    
312
/* sh_flags */
313
#define SHF_WRITE        0x1
314
#define SHF_ALLOC        0x2
315
#define SHF_EXECINSTR        0x4
316
#define SHF_MASKPROC        0xf0000000
317

    
318
/* special section indexes */
319
#define SHN_UNDEF        0
320
#define SHN_LORESERVE        0xff00
321
#define SHN_LOPROC        0xff00
322
#define SHN_HIPROC        0xff1f
323
#define SHN_ABS                0xfff1
324
#define SHN_COMMON        0xfff2
325
#define SHN_HIRESERVE        0xffff
326
 
327
typedef struct {
328
  Elf32_Word        sh_name;
329
  Elf32_Word        sh_type;
330
  Elf32_Word        sh_flags;
331
  Elf32_Addr        sh_addr;
332
  Elf32_Off        sh_offset;
333
  Elf32_Word        sh_size;
334
  Elf32_Word        sh_link;
335
  Elf32_Word        sh_info;
336
  Elf32_Word        sh_addralign;
337
  Elf32_Word        sh_entsize;
338
} Elf32_Shdr;
339

    
340
typedef struct elf64_shdr {
341
  unsigned int        sh_name;                /* Section name, index in string tbl */
342
  unsigned int        sh_type;                /* Type of section */
343
  unsigned long long sh_flags;                /* Miscellaneous section attributes */
344
  unsigned long long sh_addr;                /* Section virtual addr at execution */
345
  unsigned long long sh_offset;                /* Section file offset */
346
  unsigned long long sh_size;                /* Size of section in bytes */
347
  unsigned int        sh_link;                /* Index of another section */
348
  unsigned int        sh_info;                /* Additional section information */
349
  unsigned long long sh_addralign;        /* Section alignment */
350
  unsigned long long sh_entsize;        /* Entry size if section holds table */
351
} Elf64_Shdr;
352

    
353
#define        EI_MAG0                0                /* e_ident[] indexes */
354
#define        EI_MAG1                1
355
#define        EI_MAG2                2
356
#define        EI_MAG3                3
357
#define        EI_CLASS        4
358
#define        EI_DATA                5
359
#define        EI_VERSION        6
360
#define        EI_PAD                7
361

    
362
#define        ELFMAG0                0x7f                /* EI_MAG */
363
#define        ELFMAG1                'E'
364
#define        ELFMAG2                'L'
365
#define        ELFMAG3                'F'
366
#define        ELFMAG                "\177ELF"
367
#define        SELFMAG                4
368

    
369
#define        ELFCLASSNONE        0                /* EI_CLASS */
370
#define        ELFCLASS32        1
371
#define        ELFCLASS64        2
372
#define        ELFCLASSNUM        3
373

    
374
#define ELFDATANONE        0                /* e_ident[EI_DATA] */
375
#define ELFDATA2LSB        1
376
#define ELFDATA2MSB        2
377

    
378
#define EV_NONE                0                /* e_version, EI_VERSION */
379
#define EV_CURRENT        1
380
#define EV_NUM                2
381

    
382
/* Notes used in ET_CORE */
383
#define NT_PRSTATUS        1
384
#define NT_PRFPREG        2
385
#define NT_PRPSINFO        3
386
#define NT_TASKSTRUCT        4
387

    
388
/* Note header in a PT_NOTE section */
389
typedef struct elf32_note {
390
  Elf32_Word        n_namesz;        /* Name size */
391
  Elf32_Word        n_descsz;        /* Content size */
392
  Elf32_Word        n_type;                /* Content type */
393
} Elf32_Nhdr;
394

    
395
/* Note header in a PT_NOTE section */
396
/*
397
 * For now we use the 32 bit version of the structure until we figure
398
 * out whether we need anything better.  Note - on the Alpha, "unsigned int"
399
 * is only 32 bits.
400
 */
401
typedef struct elf64_note {
402
  unsigned int        n_namesz;        /* Name size */
403
  unsigned int        n_descsz;        /* Content size */
404
  unsigned int        n_type;                /* Content type */
405
} Elf64_Nhdr;
406

    
407
#define ELF_START_MMAP 0x80000000
408

    
409
#if ELF_CLASS == ELFCLASS32
410

    
411
extern Elf32_Dyn _DYNAMIC [];
412
#define elfhdr                elf32_hdr
413
#define elf_phdr        elf32_phdr
414
#define elf_note        elf32_note
415

    
416
#else
417

    
418
extern Elf64_Dyn _DYNAMIC [];
419
#define elfhdr                elf64_hdr
420
#define elf_phdr        elf64_phdr
421
#define elf_note        elf64_note
422

    
423
#endif
424

    
425