Lines Matching refs:ef

93 static void	ef_obj_close(elf_file_t ef);
95 static int ef_obj_seg_read_rel(elf_file_t ef, GElf_Addr address,
97 static int ef_obj_seg_read_string(elf_file_t ef, GElf_Addr address,
100 static GElf_Addr ef_obj_symaddr(elf_file_t ef, GElf_Size symidx);
101 static int ef_obj_lookup_set(elf_file_t ef, const char *name,
103 static int ef_obj_lookup_symbol(elf_file_t ef, const char *name,
116 ef_obj_get_offset(elf_file_t ef, GElf_Addr addr) in ef_obj_get_offset() argument
121 for (i = 0; i < ef->nprogtab; i++) { in ef_obj_get_offset()
122 pt = &ef->progtab[i]; in ef_obj_get_offset()
132 ef_obj_lookup_symbol(elf_file_t ef, const char *name, GElf_Sym **sym, in ef_obj_lookup_symbol() argument
139 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) { in ef_obj_lookup_symbol()
140 strp = ef->ddbstrtab + symp->st_name; in ef_obj_lookup_symbol()
153 ef_obj_lookup_set(elf_file_t ef, const char *name, GElf_Addr *startp, in ef_obj_lookup_set() argument
158 for (i = 0; i < ef->nprogtab; i++) { in ef_obj_lookup_set()
159 if ((strncmp(ef->progtab[i].name, "set_", 4) == 0) && in ef_obj_lookup_set()
160 strcmp(ef->progtab[i].name + 4, name) == 0) { in ef_obj_lookup_set()
161 *startp = ef->progtab[i].addr; in ef_obj_lookup_set()
162 *stopp = ef->progtab[i].addr + ef->progtab[i].size; in ef_obj_lookup_set()
164 elf_pointer_size(ef->ef_efile); in ef_obj_lookup_set()
172 ef_obj_symaddr(elf_file_t ef, GElf_Size symidx) in ef_obj_symaddr() argument
176 if (symidx >= ef->ddbsymcnt) in ef_obj_symaddr()
178 sym = ef->ddbsymtab + symidx; in ef_obj_symaddr()
186 ef_obj_seg_read_rel(elf_file_t ef, GElf_Addr address, size_t len, void *dest) in ef_obj_seg_read_rel() argument
196 for (i = 0; i < ef->nprogtab; i++) { in ef_obj_seg_read_rel()
197 if (address < ef->progtab[i].addr) in ef_obj_seg_read_rel()
200 dataoff = address - ef->progtab[i].addr; in ef_obj_seg_read_rel()
201 if (dataoff + len > ef->progtab[i].size) in ef_obj_seg_read_rel()
204 sec = ef->progtab[i].sec; in ef_obj_seg_read_rel()
205 secbase = ef->progtab[i].addr; in ef_obj_seg_read_rel()
206 secofs = ef->progtab[i].offset; in ef_obj_seg_read_rel()
211 if (ef->ef_verbose) in ef_obj_seg_read_rel()
213 ef->ef_name, (uintmax_t)address); in ef_obj_seg_read_rel()
220 error = elf_read_raw_data(ef->ef_efile, secofs + dataoff, dest, in ef_obj_seg_read_rel()
227 for (i = 0; i < ef->nrel; i++) { in ef_obj_seg_read_rel()
228 if (ef->reltab[i].sec != sec) in ef_obj_seg_read_rel()
230 for (r = ef->reltab[i].rel; in ef_obj_seg_read_rel()
231 r < &ef->reltab[i].rel[ef->reltab[i].nrel]; r++) { in ef_obj_seg_read_rel()
232 error = elf_reloc(ef->ef_efile, r, ELF_T_REL, secbase, in ef_obj_seg_read_rel()
238 for (i = 0; i < ef->nrela; i++) { in ef_obj_seg_read_rel()
239 if (ef->relatab[i].sec != sec) in ef_obj_seg_read_rel()
241 for (a = ef->relatab[i].rela; in ef_obj_seg_read_rel()
242 a < &ef->relatab[i].rela[ef->relatab[i].nrela]; a++) { in ef_obj_seg_read_rel()
243 error = elf_reloc(ef->ef_efile, a, ELF_T_RELA, secbase, in ef_obj_seg_read_rel()
253 ef_obj_seg_read_string(elf_file_t ef, GElf_Addr address, size_t len, char *dest) in ef_obj_seg_read_string() argument
257 ofs = ef_obj_get_offset(ef, address); in ef_obj_seg_read_string()
259 if (ef->ef_verbose) in ef_obj_seg_read_string()
261 ef->ef_name, (uintmax_t)address); in ef_obj_seg_read_string()
265 return (elf_read_raw_string(ef->ef_efile, ofs, dest, len)); in ef_obj_seg_read_string()
271 elf_file_t ef; in ef_obj_open() local
285 ef = calloc(1, sizeof(*ef)); in ef_obj_open()
286 if (ef == NULL) in ef_obj_open()
289 efile->ef_ef = ef; in ef_obj_open()
292 ef->ef_verbose = verbose; in ef_obj_open()
293 ef->ef_name = strdup(efile->ef_filename); in ef_obj_open()
294 ef->ef_efile = efile; in ef_obj_open()
310 ef->nprogtab++; in ef_obj_open()
318 ef->nrel++; in ef_obj_open()
321 ef->nrela++; in ef_obj_open()
328 if (ef->nprogtab == 0) { in ef_obj_open()
329 warnx("%s: file has no contents", ef->ef_name); in ef_obj_open()
333 warnx("%s: file has no valid symbol table", ef->ef_name); in ef_obj_open()
338 warnx("%s: file has invalid symbol strings", ef->ef_name); in ef_obj_open()
343 if (ef->nprogtab != 0) in ef_obj_open()
344 ef->progtab = calloc(ef->nprogtab, sizeof(*ef->progtab)); in ef_obj_open()
345 if (ef->nrel != 0) in ef_obj_open()
346 ef->reltab = calloc(ef->nrel, sizeof(*ef->reltab)); in ef_obj_open()
347 if (ef->nrela != 0) in ef_obj_open()
348 ef->relatab = calloc(ef->nrela, sizeof(*ef->relatab)); in ef_obj_open()
349 if ((ef->nprogtab != 0 && ef->progtab == NULL) || in ef_obj_open()
350 (ef->nrel != 0 && ef->reltab == NULL) || in ef_obj_open()
351 (ef->nrela != 0 && ef->relatab == NULL)) { in ef_obj_open()
357 if (elf_read_symbols(efile, symtabindex, &ef->ddbsymcnt, in ef_obj_open()
358 &ef->ddbsymtab) != 0) { in ef_obj_open()
363 if (elf_read_string_table(efile, &shdr[symstrindex], &ef->ddbstrcnt, in ef_obj_open()
364 &ef->ddbstrtab) != 0) { in ef_obj_open()
373 &ef->shstrcnt, &ef->shstrtab) != 0) { in ef_obj_open()
392 ef->progtab[pb].addr = mapbase; in ef_obj_open()
394 ef->progtab[pb].name = "<<PROGBITS>>"; in ef_obj_open()
395 ef->progtab[pb].offset = shdr[i].sh_offset; in ef_obj_open()
397 ef->progtab[pb].name = "<<NOBITS>>"; in ef_obj_open()
398 ef->progtab[pb].offset = (GElf_Off)-1; in ef_obj_open()
400 ef->progtab[pb].size = shdr[i].sh_size; in ef_obj_open()
401 ef->progtab[pb].sec = i; in ef_obj_open()
402 if (ef->shstrtab && shdr[i].sh_name != 0) in ef_obj_open()
403 ef->progtab[pb].name = in ef_obj_open()
404 ef->shstrtab + shdr[i].sh_name; in ef_obj_open()
407 for (j = 0; j < ef->ddbsymcnt; j++) { in ef_obj_open()
408 es = &ef->ddbsymtab[j]; in ef_obj_open()
411 es->st_value += ef->progtab[pb].addr; in ef_obj_open()
417 ef->reltab[rl].sec = shdr[i].sh_info; in ef_obj_open()
418 if (elf_read_rel(efile, i, &ef->reltab[rl].nrel, in ef_obj_open()
419 &ef->reltab[rl].rel) != 0) { in ef_obj_open()
426 ef->relatab[ra].sec = shdr[i].sh_info; in ef_obj_open()
427 if (elf_read_rela(efile, i, &ef->relatab[ra].nrela, in ef_obj_open()
428 &ef->relatab[ra].rela) != 0) { in ef_obj_open()
440 ef_obj_close(ef); in ef_obj_open()
445 ef_obj_close(elf_file_t ef) in ef_obj_close() argument
449 if (ef->ef_name) in ef_obj_close()
450 free(ef->ef_name); in ef_obj_close()
451 if (ef->nprogtab != 0) in ef_obj_close()
452 free(ef->progtab); in ef_obj_close()
453 if (ef->nrel != 0) { in ef_obj_close()
454 for (i = 0; i < ef->nrel; i++) in ef_obj_close()
455 if (ef->reltab[i].rel != NULL) in ef_obj_close()
456 free(ef->reltab[i].rel); in ef_obj_close()
457 free(ef->reltab); in ef_obj_close()
459 if (ef->nrela != 0) { in ef_obj_close()
460 for (i = 0; i < ef->nrela; i++) in ef_obj_close()
461 if (ef->relatab[i].rela != NULL) in ef_obj_close()
462 free(ef->relatab[i].rela); in ef_obj_close()
463 free(ef->relatab); in ef_obj_close()
465 if (ef->ddbsymtab != NULL) in ef_obj_close()
466 free(ef->ddbsymtab); in ef_obj_close()
467 if (ef->ddbstrtab != NULL) in ef_obj_close()
468 free(ef->ddbstrtab); in ef_obj_close()
469 if (ef->shstrtab != NULL) in ef_obj_close()
470 free(ef->shstrtab); in ef_obj_close()
471 ef->ef_efile->ef_ops = NULL; in ef_obj_close()
472 ef->ef_efile->ef_ef = NULL; in ef_obj_close()
473 free(ef); in ef_obj_close()