Lines Matching refs:mod
59 open_elf (Dwfl_Module *mod, struct dwfl_file *file) in open_elf() argument
95 if (mod->e_type != ET_EXEC) in open_elf()
104 file->bias = ((mod->low_addr & -ph->p_align) in open_elf()
110 mod->e_type = ehdr->e_type; in open_elf()
113 if (mod->e_type == ET_EXEC && file->bias != 0) in open_elf()
114 mod->e_type = ET_DYN; in open_elf()
122 find_file (Dwfl_Module *mod) in find_file() argument
124 if (mod->main.elf != NULL /* Already done. */ in find_file()
125 || mod->elferr != DWFL_E_NOERROR) /* Cached failure. */ in find_file()
128 mod->main.fd = (*mod->dwfl->callbacks->find_elf) (MODCB_ARGS (mod), in find_file()
129 &mod->main.name, in find_file()
130 &mod->main.elf); in find_file()
131 mod->elferr = open_elf (mod, &mod->main); in find_file()
133 if (mod->elferr == DWFL_E_NOERROR && !mod->main.valid) in find_file()
137 free (mod->build_id_bits); in find_file()
138 mod->build_id_bits = NULL; in find_file()
139 mod->build_id_len = 0; in find_file()
207 find_debuginfo (Dwfl_Module *mod) in find_debuginfo() argument
209 if (mod->debug.elf != NULL) in find_debuginfo()
213 const char *debuglink_file = find_debuglink (mod->main.elf, &debuglink_crc); in find_debuginfo()
215 mod->debug.fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod), in find_debuginfo()
216 mod->main.name, in find_debuginfo()
219 &mod->debug.name); in find_debuginfo()
220 return open_elf (mod, &mod->debug); in find_debuginfo()
308 find_dynsym (Dwfl_Module *mod) in find_dynsym() argument
311 GElf_Ehdr *ehdr = gelf_getehdr (mod->main.elf, &ehdr_mem); in find_dynsym()
316 GElf_Phdr *phdr = gelf_getphdr (mod->main.elf, i, &phdr_mem); in find_dynsym()
324 Elf_Data *data = elf_getdata_rawchunk (mod->main.elf, in find_dynsym()
340 size_t n = data->d_size / gelf_fsize (mod->main.elf, in find_dynsym()
380 find_offsets (mod->main.elf, ehdr, i_max, addrs, offs); in find_dynsym()
388 data = elf_getdata_rawchunk (mod->main.elf, in find_dynsym()
393 mod->syments = (entsz == 4 in find_dynsym()
397 if (offs[i_gnu_hash] != 0 && mod->syments == 0) in find_dynsym()
409 data = elf_getdata_rawchunk (mod->main.elf, offs[i_gnu_hash], in find_dynsym()
417 + (gelf_getclass (mod->main.elf) in find_dynsym()
421 data = elf_getdata_rawchunk (mod->main.elf, buckets_at, in find_dynsym()
437 data = elf_getdata_rawchunk (mod->main.elf, in find_dynsym()
444 mod->syments = maxndx + 1; in find_dynsym()
453 if (offs[i_strtab] > offs[i_symtab] && mod->syments == 0) in find_dynsym()
454 mod->syments = ((offs[i_strtab] - offs[i_symtab]) in find_dynsym()
455 / gelf_fsize (mod->main.elf, in find_dynsym()
458 if (mod->syments > 0) in find_dynsym()
460 mod->symdata = elf_getdata_rawchunk (mod->main.elf, in find_dynsym()
462 gelf_fsize (mod->main.elf, in find_dynsym()
464 mod->syments, in find_dynsym()
467 if (mod->symdata != NULL) in find_dynsym()
469 mod->symstrdata = elf_getdata_rawchunk (mod->main.elf, in find_dynsym()
473 if (mod->symstrdata == NULL) in find_dynsym()
474 mod->symdata = NULL; in find_dynsym()
476 if (mod->symdata == NULL) in find_dynsym()
477 mod->symerr = DWFL_E (LIBELF, elf_errno ()); in find_dynsym()
480 mod->symfile = &mod->main; in find_dynsym()
481 mod->symerr = DWFL_E_NOERROR; in find_dynsym()
491 find_symtab (Dwfl_Module *mod) in find_symtab() argument
493 if (mod->symdata != NULL /* Already done. */ in find_symtab()
494 || mod->symerr != DWFL_E_NOERROR) /* Cached previous failure. */ in find_symtab()
497 find_file (mod); in find_symtab()
498 mod->symerr = mod->elferr; in find_symtab()
499 if (mod->symerr != DWFL_E_NOERROR) in find_symtab()
505 mod->symerr = load_symtab (&mod->main, &mod->symfile, &symscn, in find_symtab()
506 &xndxscn, &mod->syments, &strshndx); in find_symtab()
507 switch (mod->symerr) in find_symtab()
517 mod->symerr = find_debuginfo (mod); in find_symtab()
518 switch (mod->symerr) in find_symtab()
524 mod->symerr = load_symtab (&mod->debug, &mod->symfile, &symscn, in find_symtab()
525 &xndxscn, &mod->syments, &strshndx); in find_symtab()
529 mod->symerr = DWFL_E_NO_SYMTAB; in find_symtab()
533 switch (mod->symerr) in find_symtab()
545 mod->symerr = DWFL_E_NOERROR; in find_symtab()
550 find_dynsym (mod); in find_symtab()
557 if (elf_strptr (mod->symfile->elf, strshndx, 0) == NULL) in find_symtab()
560 mod->symerr = DWFL_E (LIBELF, elf_errno ()); in find_symtab()
566 mod->symstrdata = elf_getdata (elf_getscn (mod->symfile->elf, strshndx), in find_symtab()
568 if (mod->symstrdata == NULL) in find_symtab()
572 mod->symxndxdata = NULL; in find_symtab()
575 mod->symxndxdata = elf_getdata (xndxscn, NULL); in find_symtab()
576 if (mod->symxndxdata == NULL) in find_symtab()
580 mod->symdata = elf_getdata (symscn, NULL); in find_symtab()
581 if (mod->symdata == NULL) in find_symtab()
589 __libdwfl_module_getebl (Dwfl_Module *mod) in __libdwfl_module_getebl() argument
591 if (mod->ebl == NULL) in __libdwfl_module_getebl()
593 find_file (mod); in __libdwfl_module_getebl()
594 if (mod->elferr != DWFL_E_NOERROR) in __libdwfl_module_getebl()
595 return mod->elferr; in __libdwfl_module_getebl()
597 mod->ebl = ebl_openbackend (mod->main.elf); in __libdwfl_module_getebl()
598 if (mod->ebl == NULL) in __libdwfl_module_getebl()
606 load_dw (Dwfl_Module *mod, struct dwfl_file *debugfile) in load_dw() argument
608 if (mod->e_type == ET_REL && !debugfile->relocated) in load_dw()
610 const Dwfl_Callbacks *const cb = mod->dwfl->callbacks; in load_dw()
616 Dwfl_Error error = __libdwfl_module_getebl (mod); in load_dw()
620 find_symtab (mod); in load_dw()
621 Dwfl_Error result = mod->symerr; in load_dw()
623 result = __libdwfl_relocate (mod, debugfile->elf, true); in load_dw()
628 if (mod->main.fd != -1 && elf_cntl (mod->main.elf, ELF_C_FDREAD) == 0) in load_dw()
630 close (mod->main.fd); in load_dw()
631 mod->main.fd = -1; in load_dw()
640 mod->dw = INTUSE(dwarf_begin_elf) (debugfile->elf, DWARF_C_READ, NULL); in load_dw()
641 if (mod->dw == NULL) in load_dw()
648 mod->lazycu = 1; in load_dw()
655 find_dw (Dwfl_Module *mod) in find_dw() argument
657 if (mod->dw != NULL /* Already done. */ in find_dw()
658 || mod->dwerr != DWFL_E_NOERROR) /* Cached previous failure. */ in find_dw()
661 find_file (mod); in find_dw()
662 mod->dwerr = mod->elferr; in find_dw()
663 if (mod->dwerr != DWFL_E_NOERROR) in find_dw()
667 mod->dwerr = load_dw (mod, &mod->main); in find_dw()
668 switch (mod->dwerr) in find_dw()
671 mod->debug.elf = mod->main.elf; in find_dw()
672 mod->debug.bias = mod->main.bias; in find_dw()
683 mod->dwerr = find_debuginfo (mod); in find_dw()
684 switch (mod->dwerr) in find_dw()
687 mod->dwerr = load_dw (mod, &mod->debug); in find_dw()
691 mod->dwerr = DWFL_E_NO_DWARF; in find_dw()
699 mod->dwerr = __libdwfl_canon_error (mod->dwerr); in find_dw()
704 dwfl_module_getelf (Dwfl_Module *mod, GElf_Addr *loadbase) in dwfl_module_getelf() argument
706 if (mod == NULL) in dwfl_module_getelf()
709 find_file (mod); in dwfl_module_getelf()
710 if (mod->elferr == DWFL_E_NOERROR) in dwfl_module_getelf()
712 if (mod->e_type == ET_REL && ! mod->main.relocated) in dwfl_module_getelf()
717 mod->main.relocated = true; in dwfl_module_getelf()
718 if (likely (__libdwfl_module_getebl (mod) == DWFL_E_NOERROR)) in dwfl_module_getelf()
720 (void) __libdwfl_relocate (mod, mod->main.elf, false); in dwfl_module_getelf()
722 if (mod->debug.elf == mod->main.elf) in dwfl_module_getelf()
723 mod->debug.relocated = true; in dwfl_module_getelf()
724 else if (mod->debug.elf != NULL && ! mod->debug.relocated) in dwfl_module_getelf()
726 mod->debug.relocated = true; in dwfl_module_getelf()
727 (void) __libdwfl_relocate (mod, mod->debug.elf, false); in dwfl_module_getelf()
732 *loadbase = mod->main.bias; in dwfl_module_getelf()
733 return mod->main.elf; in dwfl_module_getelf()
736 __libdwfl_seterrno (mod->elferr); in dwfl_module_getelf()
743 dwfl_module_getdwarf (Dwfl_Module *mod, Dwarf_Addr *bias) in INTDEF()
745 if (mod == NULL) in INTDEF()
748 find_dw (mod); in INTDEF()
749 if (mod->dwerr == DWFL_E_NOERROR) in INTDEF()
753 if (mod->e_type == ET_REL in INTDEF()
754 && mod->main.relocated && ! mod->debug.relocated) in INTDEF()
756 mod->debug.relocated = true; in INTDEF()
757 if (mod->debug.elf != mod->main.elf) in INTDEF()
758 (void) __libdwfl_relocate (mod, mod->debug.elf, false); in INTDEF()
761 *bias = mod->debug.bias; in INTDEF()
762 return mod->dw; in INTDEF()
765 __libdwfl_seterrno (mod->dwerr); in INTDEF()
771 dwfl_module_getsymtab (Dwfl_Module *mod) in INTDEF()
773 if (mod == NULL) in INTDEF()
776 find_symtab (mod); in INTDEF()
777 if (mod->symerr == DWFL_E_NOERROR) in INTDEF()
778 return mod->syments; in INTDEF()
780 __libdwfl_seterrno (mod->symerr); in INTDEF()