Lines Matching refs:ef
73 static void ef_close(elf_file_t ef);
75 static int ef_seg_read_rel(elf_file_t ef, GElf_Addr address, size_t len,
77 static int ef_seg_read_string(elf_file_t ef, GElf_Addr address, size_t len,
80 static GElf_Addr ef_symaddr(elf_file_t ef, GElf_Size symidx);
81 static int ef_lookup_set(elf_file_t ef, const char *name,
83 static int ef_lookup_symbol(elf_file_t ef, const char *name,
111 ef_get_offset(elf_file_t ef, GElf_Addr addr) in ef_get_offset() argument
116 for (i = 0; i < ef->ef_nsegs; i++) { in ef_get_offset()
117 ph = ef->ef_segs[i]; in ef_get_offset()
129 ef_lookup_symbol(elf_file_t ef, const char *name, GElf_Sym **sym, bool see_local) in ef_lookup_symbol() argument
137 symnum = ef->ef_buckets[hash % ef->ef_nbuckets]; in ef_lookup_symbol()
140 if (symnum >= ef->ef_nchains) { in ef_lookup_symbol()
142 ef->ef_name); in ef_lookup_symbol()
146 symp = ef->ef_symtab + symnum; in ef_lookup_symbol()
149 ef->ef_name); in ef_lookup_symbol()
153 strp = ef->ef_strtab + symp->st_name; in ef_lookup_symbol()
168 symnum = ef->ef_chains[symnum]; in ef_lookup_symbol()
175 ef_lookup_set(elf_file_t ef, const char *name, GElf_Addr *startp, in ef_lookup_set() argument
189 error = ef_lookup_symbol(ef, setsym, &sym, true); in ef_lookup_set()
196 error = ef_lookup_symbol(ef, setsym, &sym, true); in ef_lookup_set()
202 *countp = (*stopp - *startp) / elf_pointer_size(ef->ef_efile); in ef_lookup_set()
210 ef_symaddr(elf_file_t ef, GElf_Size symidx) in ef_symaddr() argument
214 if (symidx >= ef->ef_nchains) in ef_symaddr()
216 sym = ef->ef_symtab + symidx; in ef_symaddr()
225 ef_parse_dynamic(elf_file_t ef, const GElf_Phdr *phdyn) in ef_parse_dynamic() argument
246 error = elf_read_shdrs(ef->ef_efile, &nshdr, &shdr); in ef_parse_dynamic()
262 ((elf_machine(ef->ef_efile) == EM_PPC || in ef_parse_dynamic()
263 elf_machine(ef->ef_efile) == EM_PPC64) ? in ef_parse_dynamic()
279 error = elf_read_dynamic(ef->ef_efile, dynamic_idx, &ndyn, &dyn); in ef_parse_dynamic()
295 hash_off = ef_get_offset(ef, dp->d_un.d_ptr); in ef_parse_dynamic()
301 str_off = ef_get_offset(ef, dp->d_un.d_ptr); in ef_parse_dynamic()
307 sym_off = ef_get_offset(ef, dp->d_un.d_ptr); in ef_parse_dynamic()
310 if (dp->d_un.d_val != elf_object_size(ef->ef_efile, in ef_parse_dynamic()
320 rel_off = ef_get_offset(ef, dp->d_un.d_ptr); in ef_parse_dynamic()
329 if (dp->d_un.d_val != elf_object_size(ef->ef_efile, in ef_parse_dynamic()
339 rela_off = ef_get_offset(ef, dp->d_un.d_ptr); in ef_parse_dynamic()
348 if (dp->d_un.d_val != elf_object_size(ef->ef_efile, in ef_parse_dynamic()
357 warnx("%s: no .hash section found\n", ef->ef_name); in ef_parse_dynamic()
362 warnx("%s: no .dynsym section found\n", ef->ef_name); in ef_parse_dynamic()
367 warnx("%s: no .dynstr section found\n", ef->ef_name); in ef_parse_dynamic()
378 ef->ef_name); in ef_parse_dynamic()
386 if (shdr[i].sh_size < sizeof(*ef->ef_hashtab) * 2) { in ef_parse_dynamic()
391 error = elf_read_data(ef->ef_efile, ELF_T_WORD, in ef_parse_dynamic()
393 (void **)&ef->ef_hashtab); in ef_parse_dynamic()
398 ef->ef_nbuckets = ef->ef_hashtab[0]; in ef_parse_dynamic()
399 ef->ef_nchains = ef->ef_hashtab[1]; in ef_parse_dynamic()
400 if ((2 + ef->ef_nbuckets + ef->ef_nchains) * in ef_parse_dynamic()
401 sizeof(*ef->ef_hashtab) != shdr[i].sh_size) { in ef_parse_dynamic()
407 ef->ef_buckets = ef->ef_hashtab + 2; in ef_parse_dynamic()
408 ef->ef_chains = ef->ef_buckets + ef->ef_nbuckets; in ef_parse_dynamic()
413 ef->ef_name); in ef_parse_dynamic()
416 error = elf_read_symbols(ef->ef_efile, i, &nsym, in ef_parse_dynamic()
417 &ef->ef_symtab); in ef_parse_dynamic()
419 if (ef->ef_verbose) in ef_parse_dynamic()
421 ef->ef_name, (uintmax_t)sym_off); in ef_parse_dynamic()
428 error = elf_read_string_table(ef->ef_efile, in ef_parse_dynamic()
429 &shdr[i], &ef->ef_strsz, &ef->ef_strtab); in ef_parse_dynamic()
441 ef->ef_name); in ef_parse_dynamic()
445 error = elf_read_rel(ef->ef_efile, i, &ef->ef_relsz, in ef_parse_dynamic()
446 &ef->ef_rel); in ef_parse_dynamic()
449 ef->ef_name); in ef_parse_dynamic()
458 ef->ef_name); in ef_parse_dynamic()
462 error = elf_read_rela(ef->ef_efile, i, &ef->ef_relasz, in ef_parse_dynamic()
463 &ef->ef_rela); in ef_parse_dynamic()
466 ef->ef_name); in ef_parse_dynamic()
473 if (ef->ef_hashtab == NULL) { in ef_parse_dynamic()
474 warnx("%s: did not find a symbol hash table", ef->ef_name); in ef_parse_dynamic()
478 if (ef->ef_symtab == NULL) { in ef_parse_dynamic()
479 warnx("%s: did not find a dynamic symbol table", ef->ef_name); in ef_parse_dynamic()
483 if (nsym != ef->ef_nchains) { in ef_parse_dynamic()
484 warnx("%s: symbol count mismatch", ef->ef_name); in ef_parse_dynamic()
488 if (ef->ef_strtab == NULL) { in ef_parse_dynamic()
489 warnx("%s: did not find a dynamic string table", ef->ef_name); in ef_parse_dynamic()
493 if (rel_off != 0 && ef->ef_rel == NULL) { in ef_parse_dynamic()
495 ef->ef_name); in ef_parse_dynamic()
499 if (rela_off != 0 && ef->ef_rela == NULL) { in ef_parse_dynamic()
501 ef->ef_name); in ef_parse_dynamic()
514 ef_seg_read_rel(elf_file_t ef, GElf_Addr address, size_t len, void *dest) in ef_seg_read_rel() argument
521 ofs = ef_get_offset(ef, address); in ef_seg_read_rel()
523 if (ef->ef_verbose) in ef_seg_read_rel()
525 ef->ef_name, (uintmax_t)address); in ef_seg_read_rel()
528 error = elf_read_raw_data(ef->ef_efile, ofs, dest, len); in ef_seg_read_rel()
532 for (r = ef->ef_rel; r < &ef->ef_rel[ef->ef_relsz]; r++) { in ef_seg_read_rel()
533 error = elf_reloc(ef->ef_efile, r, ELF_T_REL, 0, address, in ef_seg_read_rel()
538 for (a = ef->ef_rela; a < &ef->ef_rela[ef->ef_relasz]; a++) { in ef_seg_read_rel()
539 error = elf_reloc(ef->ef_efile, a, ELF_T_RELA, 0, address, in ef_seg_read_rel()
548 ef_seg_read_string(elf_file_t ef, GElf_Addr address, size_t len, char *dest) in ef_seg_read_string() argument
552 ofs = ef_get_offset(ef, address); in ef_seg_read_string()
554 if (ef->ef_verbose) in ef_seg_read_string()
556 ef->ef_name, (uintmax_t)address, (uintmax_t)ofs); in ef_seg_read_string()
560 return (elf_read_raw_string(ef->ef_efile, ofs, dest, len)); in ef_seg_read_string()
566 elf_file_t ef; in ef_open() local
579 ef = malloc(sizeof(*ef)); in ef_open()
580 if (ef == NULL) in ef_open()
583 efile->ef_ef = ef; in ef_open()
586 bzero(ef, sizeof(*ef)); in ef_open()
587 ef->ef_verbose = verbose; in ef_open()
588 ef->ef_name = strdup(efile->ef_filename); in ef_open()
589 ef->ef_efile = efile; in ef_open()
591 error = elf_read_phdrs(efile, &nphdr, &ef->ef_ph); in ef_open()
600 phdr = ef->ef_ph; in ef_open()
607 ef->ef_segs[nsegs] = phdr; in ef_open()
621 ef->ef_name); in ef_open()
626 warnx("%s: too many segments", ef->ef_name); in ef_open()
629 ef->ef_nsegs = nsegs; in ef_open()
631 error = ef_parse_dynamic(ef, phdyn); in ef_open()
634 ef_close(ef); in ef_open()
639 ef_close(elf_file_t ef) in ef_close() argument
641 free(ef->ef_rela); in ef_close()
642 free(ef->ef_rel); in ef_close()
643 free(ef->ef_strtab); in ef_close()
644 free(ef->ef_symtab); in ef_close()
645 free(ef->ef_hashtab); in ef_close()
646 free(ef->ef_ph); in ef_close()
647 if (ef->ef_name) in ef_close()
648 free(ef->ef_name); in ef_close()
649 ef->ef_efile->ef_ops = NULL; in ef_close()
650 ef->ef_efile->ef_ef = NULL; in ef_close()
651 free(ef); in ef_close()