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,
115 ef_obj_get_offset(elf_file_t ef, GElf_Addr addr) in ef_obj_get_offset() argument
120 for (i = 0; i < ef->nprogtab; i++) { in ef_obj_get_offset()
121 pt = &ef->progtab[i]; in ef_obj_get_offset()
131 ef_obj_lookup_symbol(elf_file_t ef, const char *name, GElf_Sym **sym) in ef_obj_lookup_symbol() argument
137 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) { in ef_obj_lookup_symbol()
138 strp = ef->ddbstrtab + symp->st_name; in ef_obj_lookup_symbol()
148 ef_obj_lookup_set(elf_file_t ef, const char *name, GElf_Addr *startp, in ef_obj_lookup_set() argument
153 for (i = 0; i < ef->nprogtab; i++) { in ef_obj_lookup_set()
154 if ((strncmp(ef->progtab[i].name, "set_", 4) == 0) && in ef_obj_lookup_set()
155 strcmp(ef->progtab[i].name + 4, name) == 0) { in ef_obj_lookup_set()
156 *startp = ef->progtab[i].addr; in ef_obj_lookup_set()
157 *stopp = ef->progtab[i].addr + ef->progtab[i].size; in ef_obj_lookup_set()
159 elf_pointer_size(ef->ef_efile); in ef_obj_lookup_set()
167 ef_obj_symaddr(elf_file_t ef, GElf_Size symidx) in ef_obj_symaddr() argument
171 if (symidx >= ef->ddbsymcnt) in ef_obj_symaddr()
173 sym = ef->ddbsymtab + symidx; in ef_obj_symaddr()
181 ef_obj_seg_read_rel(elf_file_t ef, GElf_Addr address, size_t len, void *dest) in ef_obj_seg_read_rel() argument
191 for (i = 0; i < ef->nprogtab; i++) { in ef_obj_seg_read_rel()
192 if (address < ef->progtab[i].addr) in ef_obj_seg_read_rel()
195 dataoff = address - ef->progtab[i].addr; in ef_obj_seg_read_rel()
196 if (dataoff + len > ef->progtab[i].size) in ef_obj_seg_read_rel()
199 sec = ef->progtab[i].sec; in ef_obj_seg_read_rel()
200 secbase = ef->progtab[i].addr; in ef_obj_seg_read_rel()
201 secofs = ef->progtab[i].offset; in ef_obj_seg_read_rel()
206 if (ef->ef_verbose) in ef_obj_seg_read_rel()
208 ef->ef_name, (uintmax_t)address); in ef_obj_seg_read_rel()
215 error = elf_read_raw_data(ef->ef_efile, secofs + dataoff, dest, in ef_obj_seg_read_rel()
222 for (i = 0; i < ef->nrel; i++) { in ef_obj_seg_read_rel()
223 if (ef->reltab[i].sec != sec) in ef_obj_seg_read_rel()
225 for (r = ef->reltab[i].rel; in ef_obj_seg_read_rel()
226 r < &ef->reltab[i].rel[ef->reltab[i].nrel]; r++) { in ef_obj_seg_read_rel()
227 error = elf_reloc(ef->ef_efile, r, ELF_T_REL, secbase, in ef_obj_seg_read_rel()
233 for (i = 0; i < ef->nrela; i++) { in ef_obj_seg_read_rel()
234 if (ef->relatab[i].sec != sec) in ef_obj_seg_read_rel()
236 for (a = ef->relatab[i].rela; in ef_obj_seg_read_rel()
237 a < &ef->relatab[i].rela[ef->relatab[i].nrela]; a++) { in ef_obj_seg_read_rel()
238 error = elf_reloc(ef->ef_efile, a, ELF_T_RELA, secbase, in ef_obj_seg_read_rel()
248 ef_obj_seg_read_string(elf_file_t ef, GElf_Addr address, size_t len, char *dest) in ef_obj_seg_read_string() argument
252 ofs = ef_obj_get_offset(ef, address); in ef_obj_seg_read_string()
254 if (ef->ef_verbose) in ef_obj_seg_read_string()
256 ef->ef_name, (uintmax_t)address); in ef_obj_seg_read_string()
260 return (elf_read_raw_string(ef->ef_efile, ofs, dest, len)); in ef_obj_seg_read_string()
266 elf_file_t ef; in ef_obj_open() local
280 ef = calloc(1, sizeof(*ef)); in ef_obj_open()
281 if (ef == NULL) in ef_obj_open()
284 efile->ef_ef = ef; in ef_obj_open()
287 ef->ef_verbose = verbose; in ef_obj_open()
288 ef->ef_name = strdup(efile->ef_filename); in ef_obj_open()
289 ef->ef_efile = efile; in ef_obj_open()
305 ef->nprogtab++; in ef_obj_open()
313 ef->nrel++; in ef_obj_open()
316 ef->nrela++; in ef_obj_open()
323 if (ef->nprogtab == 0) { in ef_obj_open()
324 warnx("%s: file has no contents", ef->ef_name); in ef_obj_open()
328 warnx("%s: file has no valid symbol table", ef->ef_name); in ef_obj_open()
333 warnx("%s: file has invalid symbol strings", ef->ef_name); in ef_obj_open()
338 if (ef->nprogtab != 0) in ef_obj_open()
339 ef->progtab = calloc(ef->nprogtab, sizeof(*ef->progtab)); in ef_obj_open()
340 if (ef->nrel != 0) in ef_obj_open()
341 ef->reltab = calloc(ef->nrel, sizeof(*ef->reltab)); in ef_obj_open()
342 if (ef->nrela != 0) in ef_obj_open()
343 ef->relatab = calloc(ef->nrela, sizeof(*ef->relatab)); in ef_obj_open()
344 if ((ef->nprogtab != 0 && ef->progtab == NULL) || in ef_obj_open()
345 (ef->nrel != 0 && ef->reltab == NULL) || in ef_obj_open()
346 (ef->nrela != 0 && ef->relatab == NULL)) { in ef_obj_open()
352 if (elf_read_symbols(efile, symtabindex, &ef->ddbsymcnt, in ef_obj_open()
353 &ef->ddbsymtab) != 0) { in ef_obj_open()
358 if (elf_read_string_table(efile, &shdr[symstrindex], &ef->ddbstrcnt, in ef_obj_open()
359 &ef->ddbstrtab) != 0) { in ef_obj_open()
368 &ef->shstrcnt, &ef->shstrtab) != 0) { in ef_obj_open()
387 ef->progtab[pb].addr = mapbase; in ef_obj_open()
389 ef->progtab[pb].name = "<<PROGBITS>>"; in ef_obj_open()
390 ef->progtab[pb].offset = shdr[i].sh_offset; in ef_obj_open()
392 ef->progtab[pb].name = "<<NOBITS>>"; in ef_obj_open()
393 ef->progtab[pb].offset = (GElf_Off)-1; in ef_obj_open()
395 ef->progtab[pb].size = shdr[i].sh_size; in ef_obj_open()
396 ef->progtab[pb].sec = i; in ef_obj_open()
397 if (ef->shstrtab && shdr[i].sh_name != 0) in ef_obj_open()
398 ef->progtab[pb].name = in ef_obj_open()
399 ef->shstrtab + shdr[i].sh_name; in ef_obj_open()
402 for (j = 0; j < ef->ddbsymcnt; j++) { in ef_obj_open()
403 es = &ef->ddbsymtab[j]; in ef_obj_open()
406 es->st_value += ef->progtab[pb].addr; in ef_obj_open()
412 ef->reltab[rl].sec = shdr[i].sh_info; in ef_obj_open()
413 if (elf_read_rel(efile, i, &ef->reltab[rl].nrel, in ef_obj_open()
414 &ef->reltab[rl].rel) != 0) { in ef_obj_open()
421 ef->relatab[ra].sec = shdr[i].sh_info; in ef_obj_open()
422 if (elf_read_rela(efile, i, &ef->relatab[ra].nrela, in ef_obj_open()
423 &ef->relatab[ra].rela) != 0) { in ef_obj_open()
435 ef_obj_close(ef); in ef_obj_open()
440 ef_obj_close(elf_file_t ef) in ef_obj_close() argument
444 if (ef->ef_name) in ef_obj_close()
445 free(ef->ef_name); in ef_obj_close()
446 if (ef->nprogtab != 0) in ef_obj_close()
447 free(ef->progtab); in ef_obj_close()
448 if (ef->nrel != 0) { in ef_obj_close()
449 for (i = 0; i < ef->nrel; i++) in ef_obj_close()
450 if (ef->reltab[i].rel != NULL) in ef_obj_close()
451 free(ef->reltab[i].rel); in ef_obj_close()
452 free(ef->reltab); in ef_obj_close()
454 if (ef->nrela != 0) { in ef_obj_close()
455 for (i = 0; i < ef->nrela; i++) in ef_obj_close()
456 if (ef->relatab[i].rela != NULL) in ef_obj_close()
457 free(ef->relatab[i].rela); in ef_obj_close()
458 free(ef->relatab); in ef_obj_close()
460 if (ef->ddbsymtab != NULL) in ef_obj_close()
461 free(ef->ddbsymtab); in ef_obj_close()
462 if (ef->ddbstrtab != NULL) in ef_obj_close()
463 free(ef->ddbstrtab); in ef_obj_close()
464 if (ef->shstrtab != NULL) in ef_obj_close()
465 free(ef->shstrtab); in ef_obj_close()
466 ef->ef_efile->ef_ops = NULL; in ef_obj_close()
467 ef->ef_efile->ef_ef = NULL; in ef_obj_close()
468 free(ef); in ef_obj_close()