-
-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Expand file tree
/
Copy pathelf.h
More file actions
277 lines (251 loc) · 8.43 KB
/
Copy pathelf.h
File metadata and controls
277 lines (251 loc) · 8.43 KB
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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
#include <r_types.h>
#include <r_util.h>
#include <r_lib.h>
#include <r_bin.h>
#include <r_vec.h>
#include <sdb/ht_uu.h>
#include "elf_specs.h"
#ifndef _INCLUDE_ELF_H_
#define _INCLUDE_ELF_H_
#define SBPF_PROGRAM_ADDR 0x100000000ULL
#define SBPF_STACK_ADDR 0x200000000ULL
#define R_BIN_ELF_SCN_IS_EXECUTABLE(x) x & SHF_EXECINSTR
#define R_BIN_ELF_SCN_IS_READABLE(x) x & SHF_ALLOC
#define R_BIN_ELF_SCN_IS_WRITABLE(x) x & SHF_WRITE
#define R_BIN_ELF_SCN_IS_COMPRESSED(x) x & SHF_COMPRESSED
#define R_BIN_ELF_SYMTAB_SYMBOLS 1 << 0
#define R_BIN_ELF_DYNSYM_SYMBOLS 1 << 1
#define R_BIN_ELF_IMPORT_SYMBOLS (1 << 2 | (eo->ehdr.e_type == ET_REL ? R_BIN_ELF_SYMTAB_SYMBOLS : R_BIN_ELF_DYNSYM_SYMBOLS))
#define R_BIN_ELF_ALL_SYMBOLS (R_BIN_ELF_SYMTAB_SYMBOLS | R_BIN_ELF_DYNSYM_SYMBOLS)
#define ELFOBJ struct Elf_(obj_t)
#if R_BIN_ELF64
#define R_BIN_ELF_WORDSIZE 0x8
#define R_BIN_ELF_WORD_MAX UT64_MAX
#define R_BIN_ELF_READWORD(x, i) READ64 (x, i)
#define R_BIN_ELF_BREADWORD(x, i) BREAD64 (x, i)
#define R_BIN_ELF_ADDR_MAX UT64_MAX
#define R_BIN_ELF_XWORD_MAX UT64_MAX
#else
#define R_BIN_ELF_WORDSIZE 0x4
#define R_BIN_ELF_WORD_MAX UT32_MAX
#define R_BIN_ELF_READWORD(x, i) READ32 (x, i)
#define R_BIN_ELF_BREADWORD(x, i) BREAD32 (x, i)
#define R_BIN_ELF_ADDR_MAX UT32_MAX
#define R_BIN_ELF_XWORD_MAX UT64_MAX
#endif
typedef struct r_bin_elf_section_t {
ut64 offset;
ut64 rva;
ut64 size;
ut64 align;
ut32 flags;
ut32 link;
ut32 info;
char name[ELF_STRING_LENGTH];
int type;
} RBinElfSection;
typedef struct r_bin_elf_symbol_t {
ut64 offset;
ut64 size;
ut32 ordinal;
bool in_shdr;
bool is_sht_null;
bool is_vaddr; /* when true, offset is virtual address, otherwise it's physical */
bool is_imported;
const char *bind;
const char *type;
char name[ELF_STRING_LENGTH];
char libname[ELF_STRING_LENGTH];
} RBinElfSymbol;
typedef struct r_bin_elf_reloc_t {
int sym;
int type;
Elf_(Xword) mode;
st64 addend;
ut64 offset;
ut64 rva;
ut16 section;
ut64 sto;
ut64 laddr; // local symbol address
} RBinElfReloc;
typedef struct r_bin_elf_field_t {
ut64 offset;
char name[ELF_STRING_LENGTH];
} RBinElfField;
R_VEC_TYPE (RVecElfOff, Elf_(Off));
typedef struct Elf_(dynamic_info) {
Elf_(Xword) dt_pltrelsz;
Elf_(Addr) dt_pltgot;
Elf_(Addr) dt_hash;
Elf_(Addr) dt_strtab;
Elf_(Addr) dt_symtab;
Elf_(Addr) dt_rela;
Elf_(Addr) dt_relr;
Elf_(Xword) dt_relasz;
Elf_(Xword) dt_relrsz;
Elf_(Xword) dt_relrent;
Elf_(Xword) dt_relaent;
Elf_(Xword) dt_strsz;
Elf_(Xword) dt_syment;
Elf_(Addr) dt_fini;
Elf_(Addr) dt_rel;
Elf_(Xword) dt_relsz;
Elf_(Xword) dt_relent;
Elf_(Xword) dt_pltrel;
Elf_(Addr) dt_jmprel;
Elf_(Addr) dt_mips_pltgot;
Elf_(Xword) dt_mips_local_gotno;
Elf_(Xword) dt_mips_gotsym;
Elf_(Xword) dt_mips_symtabno;
Elf_(Addr) dt_ppc64_glink; /* PPC64 ELFv1: DT_PPC64_GLINK lazy PLT resolver anchor */
Elf_(Addr) dt_crel; // Address of Crel relocs
bool dt_bind_now;
bool dt_aarch64_pac_plt; /* AArch64 -z pac-plt: 24 byte plt entries */
Elf_(Xword) dt_flags;
Elf_(Xword) dt_flags_1;
Elf_(Xword) dt_rpath;
Elf_(Xword) dt_runpath;
RVecElfOff dt_needed;
} RBinElfDynamicInfo;
typedef struct r_bin_elf_lib_t {
char name[ELF_STRING_LENGTH];
} RBinElfLib;
#include <r_vec.h>
R_VEC_TYPE (RVecRBinElfSection, RBinElfSection);
R_VEC_TYPE (RVecRBinElfReloc, RBinElfReloc);
R_VEC_TYPE (RVecRBinElfSymbol, RBinElfSymbol);
R_VEC_TYPE (RVecRBinElfLib, RBinElfLib);
R_VEC_TYPE (RVecRBinElfField, RBinElfField);
struct Elf_(obj_t) {
Elf_(Ehdr) ehdr;
Elf_(Phdr) *phdr;
ut64 phnum;
Elf_(Shdr) *shdr;
Elf_(Shdr) *strtab_section;
ut64 strtab_size;
char *strtab;
Elf_(Shdr) *shstrtab_section;
ut64 shstrtab_size;
char *shstrtab;
RBinElfDynamicInfo dyn_info;
ut64 version_info[DT_VERSIONTAGNUM];
char *dynstr;
ut32 dynstr_size;
RBinImport **imports_by_ord;
size_t imports_by_ord_size;
RBinSymbol **symbols_by_ord;
size_t symbols_by_ord_size;
int bss;
ut64 size;
ut64 baddr;
ut64 user_baddr;
ut64 boffset;
int endian;
bool verbose;
bool load_unnamed;
bool has_nobtcfi;
bool has_nx;
int bits_cache;
const char* file;
RBuffer *b;
Sdb *kv;
/*cache purpose*/
RVecRBinElfSymbol *g_symbols_vec;
RVecRBinElfSymbol *g_imports_vec;
// cached converted symbols/imports for direct transfer to bin layer
RVecRBinSymbol symbols_cache;
RVecRBinImport imports_cache;
RVecRBinSymbol plt_symbols_cache; // PLT entries from imports with size > 0
bool symbols_cached;
bool imports_cached;
bool plt_symbols_cached;
RList *inits;
HtUU *rel_cache;
HtUU *ppc64_plt_stubs; // ppc64: slot_vaddr -> stub_vaddr (lazy, NULL until first use)
ut64 arm64_plt_esize; // aarch64: measured plt entry stride, 0 until probed
ut64 *ppc32_thunks; // ppc32: plt slot index -> call thunk vaddr, lazy
ut64 ppc32_nthunks;
bool ppc32_thunks_done;
ut32 g_reloc_num;
bool relocs_loaded;
RVecRBinElfReloc g_relocs;
RList *relocs_list;
bool sections_loaded;
bool sections_cached;
RVecRBinElfSection g_sections;
RVecRBinSection cached_sections;
RBinElfSection *last_section; // RBinSection
bool libs_loaded;
RVecRBinElfLib g_libs;
bool fields_loaded;
RVecRBinElfField g_fields;
int limit;
char *osabi;
};
int Elf_(has_va)(struct Elf_(obj_t) *bin);
ut64 Elf_(get_section_addr)(struct Elf_(obj_t) *bin, const char *section_name);
ut64 Elf_(get_section_offset)(struct Elf_(obj_t) *bin, const char *section_name);
ut64 Elf_(get_section_size)(struct Elf_(obj_t) *bin, const char *section_name);
ut64 Elf_(get_baddr)(struct Elf_(obj_t) *bin);
ut64 Elf_(p2v)(struct Elf_(obj_t) *bin, ut64 paddr);
ut64 Elf_(v2p)(struct Elf_(obj_t) *bin, ut64 vaddr);
ut64 Elf_(get_boffset)(struct Elf_(obj_t) *bin);
ut64 Elf_(get_entry_offset)(struct Elf_(obj_t) *bin);
ut64 Elf_(get_main_offset)(struct Elf_(obj_t) *bin);
ut64 Elf_(get_init_offset)(struct Elf_(obj_t) *bin);
ut64 Elf_(get_fini_offset)(struct Elf_(obj_t) *bin);
char *Elf_(intrp)(struct Elf_(obj_t) *bin);
char *Elf_(compiler)(ELFOBJ *bin);
bool Elf_(get_stripped)(struct Elf_(obj_t) *bin, bool *have_lines, bool *have_syms, bool *have_uncaps);
bool Elf_(is_static)(struct Elf_(obj_t) *bin);
char* Elf_(get_data_encoding)(struct Elf_(obj_t) *bin);
char* Elf_(get_arch)(struct Elf_(obj_t) *bin);
char* Elf_(get_machine_name)(struct Elf_(obj_t) *bin);
char* Elf_(get_head_flag)(ELFOBJ *bin); //yin
char* Elf_(get_abi)(ELFOBJ *bin);
char* Elf_(get_cpu)(ELFOBJ *bin);
char* Elf_(get_file_type)(struct Elf_(obj_t) *bin);
char* Elf_(get_elf_class)(struct Elf_(obj_t) *bin);
int Elf_(get_bits)(struct Elf_(obj_t) *bin);
char* Elf_(get_osabi_name)(struct Elf_(obj_t) *bin);
int Elf_(is_big_endian)(struct Elf_(obj_t) *bin);
const RVecRBinElfReloc *Elf_(load_relocs)(struct Elf_(obj_t) *bin);
const RVecRBinElfLib *Elf_(load_libs)(struct Elf_(obj_t) *bin);
const RVecRBinSection *Elf_(load_sections)(RBinFile *bf, ELFOBJ *eo);
bool Elf_(load_gresources)(RBinFile *bf, ELFOBJ *eo, RVecRBinResource *resources);
bool Elf_(load_symbols)(ELFOBJ *eo);
bool Elf_(load_imports)(ELFOBJ *eo);
RVecRBinSymbol *Elf_(load_symbols_vec)(ELFOBJ *eo);
RVecRBinImport *Elf_(load_imports_vec)(ELFOBJ *eo);
RVecRBinSymbol *Elf_(load_plt_symbols_vec)(ELFOBJ *eo);
const RVecRBinElfField *Elf_(load_fields)(struct Elf_(obj_t) *bin);
char *Elf_(get_rpath)(struct Elf_(obj_t) *bin);
struct Elf_(obj_t)* Elf_(new)(const char* file, bool verbose);
struct Elf_(obj_t)* Elf_(new_buf)(RBuffer *buf, ut64 user_baddr, bool verbose);
void Elf_(free)(struct Elf_(obj_t)* bin);
ut64 Elf_(resize_section)(RBinFile *bf, const char *name, ut64 size);
bool Elf_(section_perms)(RBinFile *bf, const char *name, int perms);
bool Elf_(segment_perms)(RBinFile *bf, const char *name, int perms);
bool Elf_(entry_write)(RBinFile *bf, ut64 addr);
bool Elf_(del_rpath)(RBinFile *bf);
ut64 Elf_(get_phnum)(ELFOBJ *bin);
bool Elf_(is_executable)(ELFOBJ *bin);
int Elf_(has_relro)(struct Elf_(obj_t) *bin);
bool Elf_(has_nx)(struct Elf_(obj_t) *bin);
bool Elf_(has_nobtcfi)(ELFOBJ *eo);
ut8 *Elf_(grab_regstate)(struct Elf_(obj_t) *bin, int *len);
RList *Elf_(get_maps)(ELFOBJ *bin);
ut64 Elf_(ppc64_get_plt_stub_for_slot)(ELFOBJ *eo, ut64 slot_vaddr);
#if R_BIN_ELF64
void Elf_(plt_ppc64v1_load_text_stubs)(ELFOBJ *eo);
#endif
/* plt.c */
ut64 Elf_(plt_get_import_addr)(ELFOBJ *eo, int sym);
int Elf_(plt_ppc64_abi)(ELFOBJ *eo);
ut64 Elf_(plt_arm64_entry)(ELFOBJ *eo, ut64 plt_addr, ut64 pos);
ut64 Elf_(plt_ppc32_thunk)(ELFOBJ *eo, ut64 slot_vaddr);
/* elf.c helpers exported for plt.c */
RBinElfSection *Elf_(plt_section_by_name)(ELFOBJ *eo, const char *name);
ut64 Elf_(plt_num_relocs)(ELFOBJ *eo);
R_API RBinSection *r_bin_section_clone(RBinSection *s);
#endif