Lines Matching refs:ef

44 #include "ef.h"
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,
110 ef_get_offset(elf_file_t ef, GElf_Addr addr)
115 for (i = 0; i < ef->ef_nsegs; i++) {
116 ph = ef->ef_segs[i];
128 ef_lookup_symbol(elf_file_t ef, const char *name, GElf_Sym **sym)
136 symnum = ef->ef_buckets[hash % ef->ef_nbuckets];
139 if (symnum >= ef->ef_nchains) {
141 ef->ef_name);
145 symp = ef->ef_symtab + symnum;
148 ef->ef_name);
152 strp = ef->ef_strtab + symp->st_name;
164 symnum = ef->ef_chains[symnum];
171 ef_lookup_set(elf_file_t ef, const char *name, GElf_Addr *startp,
185 error = ef_lookup_symbol(ef, setsym, &sym);
192 error = ef_lookup_symbol(ef, setsym, &sym);
198 *countp = (*stopp - *startp) / elf_pointer_size(ef->ef_efile);
206 ef_symaddr(elf_file_t ef, GElf_Size symidx)
210 if (symidx >= ef->ef_nchains)
212 sym = ef->ef_symtab + symidx;
221 ef_parse_dynamic(elf_file_t ef, const GElf_Phdr *phdyn)
242 error = elf_read_shdrs(ef->ef_efile, &nshdr, &shdr);
258 ((elf_machine(ef->ef_efile) == EM_PPC ||
259 elf_machine(ef->ef_efile) == EM_PPC64) ?
275 error = elf_read_dynamic(ef->ef_efile, dynamic_idx, &ndyn, &dyn);
291 hash_off = ef_get_offset(ef, dp->d_un.d_ptr);
297 str_off = ef_get_offset(ef, dp->d_un.d_ptr);
303 sym_off = ef_get_offset(ef, dp->d_un.d_ptr);
306 if (dp->d_un.d_val != elf_object_size(ef->ef_efile,
316 rel_off = ef_get_offset(ef, dp->d_un.d_ptr);
325 if (dp->d_un.d_val != elf_object_size(ef->ef_efile,
335 rela_off = ef_get_offset(ef, dp->d_un.d_ptr);
344 if (dp->d_un.d_val != elf_object_size(ef->ef_efile,
353 warnx("%s: no .hash section found\n", ef->ef_name);
358 warnx("%s: no .dynsym section found\n", ef->ef_name);
363 warnx("%s: no .dynstr section found\n", ef->ef_name);
368 warnx("%s: no ELF relocation table found\n", ef->ef_name);
379 ef->ef_name);
387 if (shdr[i].sh_size < sizeof(*ef->ef_hashtab) * 2) {
392 error = elf_read_data(ef->ef_efile, ELF_T_WORD,
394 (void **)&ef->ef_hashtab);
399 ef->ef_nbuckets = ef->ef_hashtab[0];
400 ef->ef_nchains = ef->ef_hashtab[1];
401 if ((2 + ef->ef_nbuckets + ef->ef_nchains) *
402 sizeof(*ef->ef_hashtab) != shdr[i].sh_size) {
408 ef->ef_buckets = ef->ef_hashtab + 2;
409 ef->ef_chains = ef->ef_buckets + ef->ef_nbuckets;
414 ef->ef_name);
417 error = elf_read_symbols(ef->ef_efile, i, &nsym,
418 &ef->ef_symtab);
420 if (ef->ef_verbose)
422 ef->ef_name, (uintmax_t)sym_off);
429 error = elf_read_string_table(ef->ef_efile,
430 &shdr[i], &ef->ef_strsz, &ef->ef_strtab);
442 ef->ef_name);
446 error = elf_read_rel(ef->ef_efile, i, &ef->ef_relsz,
447 &ef->ef_rel);
450 ef->ef_name);
459 ef->ef_name);
463 error = elf_read_rela(ef->ef_efile, i, &ef->ef_relasz,
464 &ef->ef_rela);
467 ef->ef_name);
474 if (ef->ef_hashtab == NULL) {
475 warnx("%s: did not find a symbol hash table", ef->ef_name);
479 if (ef->ef_symtab == NULL) {
480 warnx("%s: did not find a dynamic symbol table", ef->ef_name);
484 if (nsym != ef->ef_nchains) {
485 warnx("%s: symbol count mismatch", ef->ef_name);
489 if (ef->ef_strtab == NULL) {
490 warnx("%s: did not find a dynamic string table", ef->ef_name);
494 if (rel_off != 0 && ef->ef_rel == NULL) {
496 ef->ef_name);
500 if (rela_off != 0 && ef->ef_rela == NULL) {
502 ef->ef_name);
515 ef_seg_read_rel(elf_file_t ef, GElf_Addr address, size_t len, void *dest)
522 ofs = ef_get_offset(ef, address);
524 if (ef->ef_verbose)
526 ef->ef_name, (uintmax_t)address);
529 error = elf_read_raw_data(ef->ef_efile, ofs, dest, len);
533 for (r = ef->ef_rel; r < &ef->ef_rel[ef->ef_relsz]; r++) {
534 error = elf_reloc(ef->ef_efile, r, ELF_T_REL, 0, address,
539 for (a = ef->ef_rela; a < &ef->ef_rela[ef->ef_relasz]; a++) {
540 error = elf_reloc(ef->ef_efile, a, ELF_T_RELA, 0, address,
549 ef_seg_read_string(elf_file_t ef, GElf_Addr address, size_t len, char *dest)
553 ofs = ef_get_offset(ef, address);
555 if (ef->ef_verbose)
557 ef->ef_name, (uintmax_t)address, (uintmax_t)ofs);
561 return (elf_read_raw_string(ef->ef_efile, ofs, dest, len));
567 elf_file_t ef;
580 ef = malloc(sizeof(*ef));
581 if (ef == NULL)
584 efile->ef_ef = ef;
587 bzero(ef, sizeof(*ef));
588 ef->ef_verbose = verbose;
589 ef->ef_name = strdup(efile->ef_filename);
590 ef->ef_efile = efile;
592 error = elf_read_phdrs(efile, &nphdr, &ef->ef_ph);
601 phdr = ef->ef_ph;
608 ef->ef_segs[nsegs] = phdr;
622 ef->ef_name);
627 warnx("%s: too many segments", ef->ef_name);
630 ef->ef_nsegs = nsegs;
632 error = ef_parse_dynamic(ef, phdyn);
635 ef_close(ef);
640 ef_close(elf_file_t ef)
642 free(ef->ef_rela);
643 free(ef->ef_rel);
644 free(ef->ef_strtab);
645 free(ef->ef_symtab);
646 free(ef->ef_hashtab);
647 free(ef->ef_ph);
648 if (ef->ef_name)
649 free(ef->ef_name);
650 ef->ef_efile->ef_ops = NULL;
651 ef->ef_efile->ef_ef = NULL;
652 free(ef);