Lines Matching refs:mod

72 open_elf (Dwfl_Module *mod, struct dwfl_file *file)
151 if (file == &mod->main)
153 mod->e_type = ehdr->e_type;
156 if (mod->e_type == ET_EXEC && file->vaddr != mod->low_addr)
157 mod->e_type = ET_DYN;
160 assert (mod->main.elf != NULL);
168 mod_verify_build_id (Dwfl_Module *mod)
170 assert (mod->build_id_len > 0);
172 switch (__builtin_expect (__libdwfl_find_build_id (mod, false,
173 mod->main.elf), 2))
180 mod->elferr = INTUSE(dwfl_errno) ();
185 mod->elferr = DWFL_E_WRONG_ID_ELF;
193 elf_end (mod->main.elf);
194 mod->main.elf = NULL;
195 if (mod->main.fd >= 0)
197 close (mod->main.fd);
198 mod->main.fd = -1;
206 __libdwfl_getelf (Dwfl_Module *mod)
208 if (mod->main.elf != NULL /* Already done. */
209 || mod->elferr != DWFL_E_NOERROR) /* Cached failure. */
212 mod->main.fd = (*mod->dwfl->callbacks->find_elf) (MODCB_ARGS (mod),
213 &mod->main.name,
214 &mod->main.elf);
215 const bool fallback = mod->main.elf == NULL && mod->main.fd < 0;
216 mod->elferr = open_elf (mod, &mod->main);
217 if (mod->elferr != DWFL_E_NOERROR)
220 if (!mod->main.valid)
224 free (mod->build_id_bits);
225 mod->build_id_bits = NULL;
226 mod->build_id_len = 0;
229 mod_verify_build_id (mod);
231 mod->main_bias = mod->e_type == ET_REL ? 0 : mod->low_addr - mod->main.vaddr;
269 find_prelink_address_sync (Dwfl_Module *mod, struct dwfl_file *file)
273 if (elf_getshdrstrndx (mod->main.elf, &shstrndx) < 0)
277 while ((scn = elf_nextscn (mod->main.elf, scn)) != NULL)
287 const char *secname = elf_strptr (mod->main.elf, shstrndx,
320 src.d_size = gelf_fsize (mod->main.elf, ELF_T_EHDR, 1, EV_CURRENT);
322 if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
323 elf_getident (mod->main.elf, NULL)[EI_DATA])
327 size_t shentsize = gelf_fsize (mod->main.elf, ELF_T_SHDR, 1, EV_CURRENT);
328 size_t phentsize = gelf_fsize (mod->main.elf, ELF_T_PHDR, 1, EV_CURRENT);
368 if (unlikely (elf_getphdrnum (mod->main.elf, &main_phnum)))
373 if (unlikely (gelf_getphdr (mod->main.elf, i, &phdr) == NULL))
399 if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
433 src.d_size = gelf_fsize (mod->main.elf, ELF_T_SHDR, shnum - 1, EV_CURRENT);
444 if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
471 while ((scn = elf_nextscn (mod->main.elf, scn)) != NULL)
483 if (highest > mod->main.vaddr)
485 mod->main.address_sync = highest;
522 find_debuginfo (Dwfl_Module *mod)
524 if (mod->debug.elf != NULL)
529 debuglink_file = INTUSE(dwelf_elf_gnu_debuglink) (mod->main.elf,
532 mod->debug.fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
533 mod->main.name,
536 &mod->debug.name);
537 Dwfl_Error result = open_elf (mod, &mod->debug);
538 if (result == DWFL_E_NOERROR && mod->debug.address_sync != 0)
539 result = find_prelink_address_sync (mod, &mod->debug);
544 it if found. Only called when mod->dw is already setup but still
548 find_debug_altlink (Dwfl_Module *mod, const char *filename)
550 assert (mod->dw != NULL);
554 ssize_t build_id_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw,
562 mod->alt_fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
568 /* The (internal) callbacks might just set mod->alt_elf directly
572 Dwfl_Error error = open_elf_file (&mod->alt_elf, &mod->alt_fd,
576 mod->alt = INTUSE(dwarf_begin_elf) (mod->alt_elf,
578 if (mod->alt == NULL)
580 elf_end (mod->alt_elf);
581 mod->alt_elf = NULL;
582 close (mod->alt_fd);
583 mod->alt_fd = -1;
586 dwarf_setalt (mod->dw, mod->alt);
692 in case the dynamic segment wasn't adjusted or mod->main_bias.
693 Will set mod->symfile if the translated offsets can be used as
697 Dwfl_Module *mod, size_t phnum,
702 find_offsets (mod->main.elf, adjust, phnum, i_max, addrs, offs);
710 Elf_Data *data = elf_getdata_rawchunk (mod->main.elf,
715 mod->syments = (entsz == 4
719 if (offs[i_gnu_hash] != 0 && mod->syments == 0)
731 Elf_Data *data = elf_getdata_rawchunk (mod->main.elf, offs[i_gnu_hash],
739 + (gelf_getclass (mod->main.elf)
750 data = elf_getdata_rawchunk (mod->main.elf, buckets_at,
766 data = elf_getdata_rawchunk (mod->main.elf,
773 mod->syments = maxndx + 1;
783 if (offs[i_strtab] > offs[i_symtab] && mod->syments == 0)
784 mod->syments = ((offs[i_strtab] - offs[i_symtab])
785 / gelf_fsize (mod->main.elf,
788 if (mod->syments > 0)
790 mod->symdata = elf_getdata_rawchunk (mod->main.elf,
792 gelf_fsize (mod->main.elf,
794 mod->syments,
797 if (mod->symdata != NULL)
799 mod->symstrdata = elf_getdata_rawchunk (mod->main.elf,
803 if (mod->symstrdata == NULL)
804 mod->symdata = NULL;
806 if (mod->symdata == NULL)
807 mod->symerr = DWFL_E (LIBELF, elf_errno ());
810 mod->symfile = &mod->main;
811 mod->symerr = DWFL_E_NOERROR;
818 find_dynsym (Dwfl_Module *mod)
821 GElf_Ehdr *ehdr = gelf_getehdr (mod->main.elf, &ehdr_mem);
824 if (unlikely (elf_getphdrnum (mod->main.elf, &phnum) != 0))
830 GElf_Phdr *phdr = gelf_getphdr (mod->main.elf, i, &phdr_mem);
838 Elf_Data *data = elf_getdata_rawchunk (mod->main.elf,
846 size_t n = data->d_size / gelf_fsize (mod->main.elf,
887 translate_offs (0, mod, phnum, addrs, strsz, ehdr);
888 if (mod->symfile == NULL)
889 translate_offs (mod->main_bias, mod, phnum, addrs, strsz, ehdr);
900 find_aux_address_sync (Dwfl_Module *mod)
904 mod->aux_sym.address_sync = mod->main.address_sync;
909 if (unlikely (gelf_getehdr (mod->main.elf, &ehdr_main) == NULL)
910 || unlikely (gelf_getehdr (mod->aux_sym.elf, &ehdr_aux) == NULL))
912 mod->aux_sym.address_sync += ehdr_aux.e_entry - ehdr_main.e_entry;
916 if (mod->aux_sym.address_sync != 0)
917 return find_prelink_address_sync (mod, &mod->aux_sym) == DWFL_E_NOERROR;
927 find_aux_sym (Dwfl_Module *mod __attribute__ ((unused)),
935 Elf *elf = mod->main.elf;
977 mod->aux_sym.elf = elf_memory (buffer, size);
978 if (mod->aux_sym.elf == NULL)
982 mod->aux_sym.fd = -1;
983 mod->aux_sym.elf->flags |= ELF_F_MALLOCED;
984 if (open_elf (mod, &mod->aux_sym) != DWFL_E_NOERROR)
986 if (! find_aux_address_sync (mod))
988 elf_end (mod->aux_sym.elf);
989 mod->aux_sym.elf = NULL;
996 while ((scn = elf_nextscn (mod->aux_sym.elf, scn)) != NULL)
1006 mod->aux_syments = shdr->sh_size / shdr->sh_entsize;
1007 mod->aux_first_global = shdr->sh_info;
1030 mod->aux_syments = 0;
1031 elf_end (mod->aux_sym.elf);
1032 mod->aux_sym.elf = NULL;
1044 find_symtab (Dwfl_Module *mod)
1046 if (mod->symdata != NULL || mod->aux_symdata != NULL /* Already done. */
1047 || mod->symerr != DWFL_E_NOERROR) /* Cached previous failure. */
1050 __libdwfl_getelf (mod);
1051 mod->symerr = mod->elferr;
1052 if (mod->symerr != DWFL_E_NOERROR)
1059 mod->symerr = load_symtab (&mod->main, &mod->symfile, &symscn,
1060 &xndxscn, &mod->syments, &mod->first_global,
1062 switch (mod->symerr)
1072 mod->symerr = find_debuginfo (mod);
1073 switch (mod->symerr)
1079 mod->symerr = load_symtab (&mod->debug, &mod->symfile, &symscn,
1080 &xndxscn, &mod->syments,
1081 &mod->first_global, &strshndx);
1085 mod->symerr = DWFL_E_NO_SYMTAB;
1089 switch (mod->symerr)
1099 find_aux_sym (mod, &aux_symscn, &aux_xndxscn, &aux_strshndx);
1104 mod->symerr = DWFL_E_NOERROR;
1111 mod->symerr = DWFL_E_NOERROR;
1116 find_dynsym (mod);
1123 if (elf_strptr (mod->symfile->elf, strshndx, 0) == NULL)
1126 mod->symdata = NULL;
1127 mod->syments = 0;
1128 mod->first_global = 0;
1129 mod->symerr = DWFL_E (LIBELF, elf_errno ());
1139 Elf_Scn *symstrscn = elf_getscn (mod->symfile->elf, strshndx);
1149 if (elf_getshdrstrndx (mod->symfile->elf, &shstrndx) < 0)
1152 const char *sname = elf_strptr (mod->symfile->elf, shstrndx, shdr->sh_name);
1165 mod->symstrdata = elf_getdata (symstrscn, NULL);
1166 if (mod->symstrdata == NULL || mod->symstrdata->d_buf == NULL)
1170 mod->symxndxdata = NULL;
1181 mod->symxndxdata = elf_getdata (xndxscn, NULL);
1182 if (mod->symxndxdata == NULL || mod->symxndxdata->d_buf == NULL)
1194 mod->symdata = elf_getdata (symscn, NULL);
1195 if (mod->symdata == NULL || mod->symdata->d_buf == NULL)
1201 || mod->syments > mod->symdata->d_size / shdr->sh_entsize
1202 || (size_t) mod->first_global > mod->syments)
1210 if (elf_strptr (mod->aux_sym.elf, aux_strshndx, 0) == NULL)
1213 mod->aux_syments = 0;
1214 elf_end (mod->aux_sym.elf);
1215 mod->aux_sym.elf = NULL;
1218 find_dynsym (mod);
1222 Elf_Scn *aux_strscn = elf_getscn (mod->aux_sym.elf, aux_strshndx);
1231 if (elf_getshdrstrndx (mod->aux_sym.elf, &aux_shstrndx) < 0)
1234 sname = elf_strptr (mod->aux_sym.elf, aux_shstrndx,
1248 mod->aux_symstrdata = elf_getdata (aux_strscn, NULL);
1249 if (mod->aux_symstrdata == NULL || mod->aux_symstrdata->d_buf == NULL)
1253 mod->aux_symxndxdata = NULL;
1264 mod->aux_symxndxdata = elf_getdata (aux_xndxscn, NULL);
1265 if (mod->aux_symxndxdata == NULL
1266 || mod->aux_symxndxdata->d_buf == NULL)
1278 mod->aux_symdata = elf_getdata (aux_symscn, NULL);
1279 if (mod->aux_symdata == NULL || mod->aux_symdata->d_buf == NULL)
1284 if (mod->aux_syments > mod->aux_symdata->d_size / shdr->sh_entsize
1285 || (size_t) mod->aux_first_global > mod->aux_syments)
1294 __libdwfl_module_getebl (Dwfl_Module *mod)
1296 if (mod->ebl == NULL)
1298 __libdwfl_getelf (mod);
1299 if (mod->elferr != DWFL_E_NOERROR)
1300 return mod->elferr;
1302 mod->ebl = ebl_openbackend (mod->main.elf);
1303 if (mod->ebl == NULL)
1311 load_dw (Dwfl_Module *mod, struct dwfl_file *debugfile)
1313 if (mod->e_type == ET_REL && !debugfile->relocated)
1315 const Dwfl_Callbacks *const cb = mod->dwfl->callbacks;
1321 Dwfl_Error error = __libdwfl_module_getebl (mod);
1325 find_symtab (mod);
1326 Dwfl_Error result = mod->symerr;
1328 result = __libdwfl_relocate (mod, debugfile->elf, true);
1333 if (mod->main.fd != -1 && elf_cntl (mod->main.elf, ELF_C_FDREAD) == 0)
1335 close (mod->main.fd);
1336 mod->main.fd = -1;
1345 mod->dw = INTUSE(dwarf_begin_elf) (debugfile->elf, DWARF_C_READ, NULL);
1346 if (mod->dw == NULL)
1353 mod->lazycu = 1;
1360 find_dw (Dwfl_Module *mod)
1362 if (mod->dw != NULL /* Already done. */
1363 || mod->dwerr != DWFL_E_NOERROR) /* Cached previous failure. */
1366 __libdwfl_getelf (mod);
1367 mod->dwerr = mod->elferr;
1368 if (mod->dwerr != DWFL_E_NOERROR)
1372 mod->dwerr = load_dw (mod, &mod->main);
1373 switch (mod->dwerr)
1376 mod->debug.elf = mod->main.elf;
1377 mod->debug.address_sync = mod->main.address_sync;
1382 find_debug_altlink (mod, mod->main.name);
1393 mod->dwerr = find_debuginfo (mod);
1394 switch (mod->dwerr)
1397 mod->dwerr = load_dw (mod, &mod->debug);
1398 if (mod->dwerr == DWFL_E_NOERROR)
1403 find_debug_altlink (mod, mod->debug.name);
1410 mod->dwerr = DWFL_E_NO_DWARF;
1418 mod->dwerr = __libdwfl_canon_error (mod->dwerr);
1422 dwfl_module_getdwarf (Dwfl_Module *mod, Dwarf_Addr *bias)
1424 if (mod == NULL)
1427 find_dw (mod);
1428 if (mod->dwerr == DWFL_E_NOERROR)
1432 if (mod->e_type == ET_REL
1433 && mod->main.relocated && ! mod->debug.relocated)
1435 mod->debug.relocated = true;
1436 if (mod->debug.elf != mod->main.elf)
1437 (void) __libdwfl_relocate (mod, mod->debug.elf, false);
1440 *bias = dwfl_adjusted_dwarf_addr (mod, 0);
1441 return mod->dw;
1444 __libdwfl_seterrno (mod->dwerr);
1450 dwfl_module_getsymtab (Dwfl_Module *mod)
1452 if (mod == NULL)
1455 find_symtab (mod);
1456 if (mod->symerr == DWFL_E_NOERROR)
1458 return (mod->syments + mod->aux_syments
1459 - (mod->syments > 0 && mod->aux_syments > 0 ? 1 : 0));
1461 __libdwfl_seterrno (mod->symerr);
1467 dwfl_module_getsymtab_first_global (Dwfl_Module *mod)
1469 if (mod == NULL)
1472 find_symtab (mod);
1473 if (mod->symerr == DWFL_E_NOERROR)
1480 int skip_aux_zero = (mod->syments > 0 && mod->aux_syments > 0) ? 1 : 0;
1481 return mod->first_global + mod->aux_first_global - skip_aux_zero;
1484 __libdwfl_seterrno (mod->symerr);