Lines Matching defs:ef

32  * $FreeBSD: stable/10/usr.sbin/kldxref/ef.c 313848 2017-02-17 00:49:01Z emaste $
48 #include "ef.h"
84 static int ef_get_type(elf_file_t ef);
85 static int ef_close(elf_file_t ef);
86 static int ef_read(elf_file_t ef, Elf_Off offset, size_t len, void* dest);
87 static int ef_read_entry(elf_file_t ef, Elf_Off offset, size_t len, void **ptr);
88 static int ef_seg_read(elf_file_t ef, Elf_Off offset, size_t len, void *dest);
89 static int ef_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len,
91 static int ef_seg_read_entry(elf_file_t ef, Elf_Off offset, size_t len,
93 static int ef_seg_read_entry_rel(elf_file_t ef, Elf_Off offset, size_t len,
95 static Elf_Addr ef_symaddr(elf_file_t ef, Elf_Size symidx);
96 static int ef_lookup_set(elf_file_t ef, const char *name, long *startp,
98 static int ef_lookup_symbol(elf_file_t ef, const char* name, Elf_Sym** sym);
129 ef_get_offset(elf_file_t ef, Elf_Off off)
134 for (i = 0; i < ef->ef_nsegs; i++) {
135 ph = ef->ef_segs[i];
144 ef_get_type(elf_file_t ef)
147 return (ef->ef_type);
170 ef_lookup_symbol(elf_file_t ef, const char* name, Elf_Sym** sym)
179 symnum = ef->ef_buckets[hash % ef->ef_nbuckets];
182 if (symnum >= ef->ef_nchains) {
184 ef->ef_name);
188 symp = ef->ef_symtab + symnum;
191 ef->ef_name);
195 strp = ef->ef_strtab + symp->st_name;
207 symnum = ef->ef_chains[symnum];
214 ef_lookup_set(elf_file_t ef, const char *name, long *startp, long *stopp,
228 error = ef_lookup_symbol(ef, setsym, &sym);
235 error = ef_lookup_symbol(ef, setsym, &sym);
249 ef_symaddr(elf_file_t ef, Elf_Size symidx)
253 if (symidx >= ef->ef_nchains)
255 sym = ef->ef_symtab + symidx;
264 ef_parse_dynamic(elf_file_t ef)
280 for (dp = ef->ef_dyn; dp->d_tag != DT_NULL; dp++) {
283 error = ef_read(ef, ef_get_offset(ef, dp->d_un.d_ptr),
287 ef_get_offset(ef, dp->d_un.d_ptr));
290 ef->ef_nbuckets = hashhdr[0];
291 ef->ef_nchains = hashhdr[1];
292 error = ef_read_entry(ef, -1,
294 (void**)&ef->ef_hashtab);
299 ef->ef_buckets = ef->ef_hashtab;
300 ef->ef_chains = ef->ef_buckets + ef->ef_nbuckets;
303 ef->ef_stroff = dp->d_un.d_ptr;
306 ef->ef_strsz = dp->d_un.d_val;
309 ef->ef_symoff = dp->d_un.d_ptr;
347 if (ef->ef_symoff == 0) {
348 warnx("%s: no .dynsym section found\n", ef->ef_name);
351 if (ef->ef_stroff == 0) {
352 warnx("%s: no .dynstr section found\n", ef->ef_name);
355 if (ef_read_entry(ef, ef_get_offset(ef, ef->ef_symoff),
356 ef->ef_nchains * sizeof(Elf_Sym),
357 (void**)&ef->ef_symtab) != 0) {
358 if (ef->ef_verbose)
360 ef->ef_name, (long)ef->ef_symoff);
363 if (ef_read_entry(ef, ef_get_offset(ef, ef->ef_stroff), ef->ef_strsz,
364 (void**)&ef->ef_strtab) != 0) {
370 warnx("%s: no DT_RELENT for DT_REL", ef->ef_name);
375 ef->ef_name);
380 "DT_RELENT", ef->ef_name);
383 if (ef_read_entry(ef, ef_get_offset(ef, rel_off), rel_sz,
384 (void **)&ef->ef_rel) != 0) {
385 warnx("%s: cannot load DT_REL section", ef->ef_name);
388 ef->ef_relsz = rel_sz / rel_entry;
389 if (ef->ef_verbose)
390 warnx("%s: %d REL entries", ef->ef_name,
391 ef->ef_relsz);
395 warnx("%s: no DT_RELAENT for DT_RELA", ef->ef_name);
400 ef->ef_name);
405 "DT_RELAENT", ef->ef_name);
408 if (ef_read_entry(ef, ef_get_offset(ef, rela_off), rela_sz,
409 (void **)&ef->ef_rela) != 0) {
410 warnx("%s: cannot load DT_RELA section", ef->ef_name);
413 ef->ef_relasz = rela_sz / rela_entry;
414 if (ef->ef_verbose)
415 warnx("%s: %d RELA entries", ef->ef_name,
416 ef->ef_relasz);
422 ef_read(elf_file_t ef, Elf_Off offset, size_t len, void*dest)
427 if (lseek(ef->ef_fd, offset, SEEK_SET) == -1)
431 r = read(ef->ef_fd, dest, len);
439 ef_read_entry(elf_file_t ef, Elf_Off offset, size_t len, void**ptr)
446 error = ef_read(ef, offset, len, *ptr);
453 ef_seg_read(elf_file_t ef, Elf_Off offset, size_t len, void*dest)
455 u_long ofs = ef_get_offset(ef, offset);
458 if (ef->ef_verbose)
460 ef->ef_name, (long)offset, ofs);
463 return ef_read(ef, ofs, len, dest);
467 ef_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len, void*dest)
469 u_long ofs = ef_get_offset(ef, offset);
475 if (ef->ef_verbose)
477 ef->ef_name, (long)offset, ofs);
480 if ((error = ef_read(ef, ofs, len, dest)) != 0)
483 for (r = ef->ef_rel; r < &ef->ef_rel[ef->ef_relsz]; r++) {
484 error = ef_reloc(ef->ef_efile, r, EF_RELOC_REL, 0, offset, len,
489 for (a = ef->ef_rela; a < &ef->ef_rela[ef->ef_relasz]; a++) {
490 error = ef_reloc(ef->ef_efile, a, EF_RELOC_RELA, 0, offset, len,
499 ef_seg_read_entry(elf_file_t ef, Elf_Off offset, size_t len, void**ptr)
506 error = ef_seg_read(ef, offset, len, *ptr);
513 ef_seg_read_entry_rel(elf_file_t ef, Elf_Off offset, size_t len, void**ptr)
520 error = ef_seg_read_rel(ef, offset, len, *ptr);
529 elf_file_t ef;
542 ef = malloc(sizeof(*ef));
543 if (ef == NULL) {
548 efile->ef_ef = ef;
551 bzero(ef, sizeof(*ef));
552 ef->ef_verbose = verbose;
553 ef->ef_fd = fd;
554 ef->ef_name = strdup(filename);
555 ef->ef_efile = efile;
556 hdr = (Elf_Ehdr *)&ef->ef_hdr;
572 if (ef_read_entry(ef, hdr->e_phoff, phlen,
573 (void**)&ef->ef_ph) != 0)
575 phdr = ef->ef_ph;
585 ef->ef_segs[nsegs] = phdr;
606 ef->ef_nsegs = nsegs;
607 if (ef_read_entry(ef, phdyn->p_offset,
608 phdyn->p_filesz, (void**)&ef->ef_dyn) != 0) {
612 error = ef_parse_dynamic(ef);
616 ef->ef_type = EFT_KLD;
625 ef->ef_type = EFT_KERNEL;
631 ef_close(ef);
636 ef_close(elf_file_t ef)
638 close(ef->ef_fd);
639 /* if (ef->ef_fpage)
640 free(ef->ef_fpage);*/
641 if (ef->ef_name)
642 free(ef->ef_name);
643 ef->ef_efile->ef_ops = NULL;
644 ef->ef_efile->ef_ef = NULL;
645 free(ef);