-
Notifications
You must be signed in to change notification settings - Fork 0
/
elf32.h
222 lines (188 loc) · 5.93 KB
/
elf32.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/*
* Copyright (c) 1999-2004 University of New South Wales
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#pragma once
#include <sys/types.h>
#define ELF32_R_TYPE(val) ((val) & 0xff)
#define R_ARM_NONE 0 /* No reloc */
#define R_ARM_RELATIVE 23 /* Adjust by program base */
/*
* File header
*/
struct Elf32_Header {
unsigned char e_ident[16];
uint16_t e_type; /* Relocatable=1, Executable=2 (+ some more ..) */
uint16_t e_machine; /* Target architecture: MIPS=8 */
uint32_t e_version; /* Elf version (should be 1) */
uint32_t e_entry; /* Code entry point */
uint32_t e_phoff; /* Program header table */
uint32_t e_shoff; /* Section header table */
uint32_t e_flags; /* Flags */
uint16_t e_ehsize; /* ELF header size */
uint16_t e_phentsize;/* Size of one program segment header */
uint16_t e_phnum; /* Number of program segment headers */
uint16_t e_shentsize;/* Size of one section header */
uint16_t e_shnum; /* Number of section headers */
uint16_t e_shstrndx; /* Section header index of the string table for
* section header names
*/
};
/*
* Section header
*/
struct Elf32_Shdr {
uint32_t sh_name;
uint32_t sh_type;
uint32_t sh_flags;
uint32_t sh_addr;
uint32_t sh_offset;
uint32_t sh_size;
uint32_t sh_link;
uint32_t sh_info;
uint32_t sh_addralign;
uint32_t sh_entsize;
};
/*
* Program header
*/
struct Elf32_Phdr {
uint32_t p_type; /* Segment type: Loadable segment = 1 */
uint32_t p_offset; /* Offset of segment in file */
uint32_t p_vaddr; /* Reqd virtual address of segment when loading */
uint32_t p_paddr; /* Reqd physical address of segment (ignore) */
uint32_t p_filesz; /* How many bytes this segment occupies in file */
uint32_t p_memsz; /* How many bytes this segment should occupy in memory
* (when loading, expand the segment by concatenating
* enough zero bytes to it)
*/
uint32_t p_flags; /* Flags: logical "or" of PF_ constants below */
uint32_t p_align; /* Reqd alignment of segment in memory */
};
/*
* Dynamic header
*/
struct Elf32_Dyn {
uint32_t d_tag; /* Dynamic entry type */
union {
uint32_t d_val; /* Integer value */
uint32_t d_ptr; /* Address value */
} d_un;
};
/*
* Relocation
*/
struct Elf32_Rel {
uint32_t r_offset; /* Address */
uint32_t r_info; /* Relocation type and symbol index */
};
int elf32_checkFile(
struct Elf32_Header const *file);
struct Elf32_Phdr const *elf32_getProgramSegmentTable(
struct Elf32_Header const *file);
unsigned elf32_getNumSections(
struct Elf32_Header const *file);
char const *elf32_getStringTable(
struct Elf32_Header const *file);
char const *elf32_getSegmentStringTable(
struct Elf32_Header const *file);
static inline struct Elf32_Shdr const *elf32_getSectionTable(
struct Elf32_Header const *file)
{
/* Cast heaven! */
return (struct Elf32_Shdr const *)((uintptr_t)file + file->e_shoff);
}
/* accessor functions */
static inline uint32_t elf32_getSectionType(
struct Elf32_Header const *file,
uint16_t s)
{
return elf32_getSectionTable(file)[s].sh_type;
}
static inline uint32_t elf32_getSectionFlags(
struct Elf32_Header const *file,
uint16_t s)
{
return elf32_getSectionTable(file)[s].sh_flags;
}
char const *elf32_getSectionName(
struct Elf32_Header const *file,
unsigned int i);
uint32_t elf32_getSectionSize(
struct Elf32_Header const *file,
unsigned int i);
uint32_t elf32_getSectionAddr(
struct Elf32_Header const *elfFile,
unsigned int i);
void const *elf32_getSection(
struct Elf32_Header const *file,
unsigned int i);
void const *elf32_getSectionNamed(
struct Elf32_Header const *file,
char const *str);
uint32_t elf32_getSegmentType(
struct Elf32_Header const *file,
unsigned int segment);
void elf32_getSegmentInfo(
struct Elf32_Header const *file,
unsigned int segment,
uint64_t *p_vaddr,
uint64_t *p_paddr,
uint64_t *p_filesz,
uint64_t *p_offset,
uint64_t *p_memsz);
uint32_t elf32_getEntryPoint(
struct Elf32_Header const *file);
/* Program header functions */
uint16_t elf32_getNumProgramHeaders(
struct Elf32_Header const *file);
static inline struct Elf32_Phdr const *elf32_getProgramHeaderTable(
struct Elf32_Header const *file)
{
/* Cast heaven! */
return (struct Elf32_Phdr const *)((uintptr_t)file + file->e_phoff);
}
/* accessor functions */
static inline uint32_t elf32_getProgramHeaderFlags(
struct Elf32_Header const *file,
uint16_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_flags;
}
static inline uint32_t elf32_getProgramHeaderType(
struct Elf32_Header const *file,
uint16_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_type;
}
static inline uint32_t elf32_getProgramHeaderFileSize(
struct Elf32_Header const *file,
uint16_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_filesz;
}
static inline uint32_t elf32_getProgramHeaderMemorySize(
struct Elf32_Header const *file,
uint16_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_memsz;
}
static inline uint32_t elf32_getProgramHeaderVaddr(
struct Elf32_Header const *file,
uint16_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_vaddr;
}
static inline uint32_t elf32_getProgramHeaderPaddr(
struct Elf32_Header const *file,
uint16_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_paddr;
}
static inline uint32_t elf32_getProgramHeaderOffset(
struct Elf32_Header const *file,
uint16_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_offset;
}