Lines Matching refs:mod
76 open_elf (Dwfl_Module *mod, struct dwfl_file *file)
155 if (file == &mod->main)
157 mod->e_type = ehdr->e_type;
160 if (mod->e_type == ET_EXEC && file->vaddr != mod->low_addr)
161 mod->e_type = ET_DYN;
164 assert (mod->main.elf != NULL);
172 mod_verify_build_id (Dwfl_Module *mod)
174 assert (mod->build_id_len > 0);
176 switch (__builtin_expect (__libdwfl_find_build_id (mod, false,
177 mod->main.elf), 2))
184 mod->elferr = INTUSE(dwfl_errno) ();
189 mod->elferr = DWFL_E_WRONG_ID_ELF;
197 elf_end (mod->main.elf);
198 mod->main.elf = NULL;
199 if (mod->main.fd >= 0)
201 close (mod->main.fd);
202 mod->main.fd = -1;
210 __libdwfl_getelf (Dwfl_Module *mod)
212 if (mod->main.elf != NULL /* Already done. */
213 || mod->elferr != DWFL_E_NOERROR) /* Cached failure. */
216 mod->main.fd = (*mod->dwfl->callbacks->find_elf) (MODCB_ARGS (mod),
217 &mod->main.name,
218 &mod->main.elf);
219 const bool fallback = mod->main.elf == NULL && mod->main.fd < 0;
220 mod->elferr = open_elf (mod, &mod->main);
221 if (mod->elferr != DWFL_E_NOERROR)
224 if (!mod->main.valid)
228 free (mod->build_id_bits);
229 mod->build_id_bits = NULL;
230 mod->build_id_len = 0;
233 mod_verify_build_id (mod);
235 mod->main_bias = mod->e_type == ET_REL ? 0 : mod->low_addr - mod->main.vaddr;
273 find_prelink_address_sync (Dwfl_Module *mod, struct dwfl_file *file)
277 if (elf_getshdrstrndx (mod->main.elf, &shstrndx) < 0)
281 while ((scn = elf_nextscn (mod->main.elf, scn)) != NULL)
291 const char *secname = elf_strptr (mod->main.elf, shstrndx,
324 src.d_size = gelf_fsize (mod->main.elf, ELF_T_EHDR, 1, EV_CURRENT);
326 if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
327 elf_getident (mod->main.elf, NULL)[EI_DATA])
331 size_t shentsize = gelf_fsize (mod->main.elf, ELF_T_SHDR, 1, EV_CURRENT);
332 size_t phentsize = gelf_fsize (mod->main.elf, ELF_T_PHDR, 1, EV_CURRENT);
374 if (unlikely (elf_getphdrnum (mod->main.elf, &main_phnum)))
379 if (unlikely (gelf_getphdr (mod->main.elf, i, &phdr) == NULL))
405 if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
439 src.d_size = gelf_fsize (mod->main.elf, ELF_T_SHDR, shnum, EV_CURRENT);
450 if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
477 while ((scn = elf_nextscn (mod->main.elf, scn)) != NULL)
489 if (highest > mod->main.vaddr)
491 mod->main.address_sync = highest;
528 find_debuginfo (Dwfl_Module *mod)
530 if (mod->debug.elf != NULL)
535 debuglink_file = INTUSE(dwelf_elf_gnu_debuglink) (mod->main.elf,
538 mod->debug.fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
539 mod->main.name,
542 &mod->debug.name);
543 Dwfl_Error result = open_elf (mod, &mod->debug);
544 if (result == DWFL_E_NOERROR && mod->debug.address_sync != 0)
545 result = find_prelink_address_sync (mod, &mod->debug);
550 it if found. Only called when mod->dw is already setup but still
554 find_debug_altlink (Dwfl_Module *mod, const char *filename)
556 assert (mod->dw != NULL);
560 ssize_t build_id_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw,
568 mod->alt_fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
574 /* The (internal) callbacks might just set mod->alt_elf directly
578 Dwfl_Error error = open_elf_file (&mod->alt_elf, &mod->alt_fd,
582 mod->alt = INTUSE(dwarf_begin_elf) (mod->alt_elf,
584 if (mod->alt == NULL)
586 elf_end (mod->alt_elf);
587 mod->alt_elf = NULL;
588 close (mod->alt_fd);
589 mod->alt_fd = -1;
592 dwarf_setalt (mod->dw, mod->alt);
698 in case the dynamic segment wasn't adjusted or mod->main_bias.
699 Will set mod->symfile if the translated offsets can be used as
703 Dwfl_Module *mod, size_t phnum,
708 find_offsets (mod->main.elf, adjust, phnum, i_max, addrs, offs);
716 Elf_Data *data = elf_getdata_rawchunk (mod->main.elf,
721 mod->syments = (entsz == 4
725 if (offs[i_gnu_hash] != 0 && mod->syments == 0)
737 Elf_Data *data = elf_getdata_rawchunk (mod->main.elf, offs[i_gnu_hash],
745 + (gelf_getclass (mod->main.elf)
756 data = elf_getdata_rawchunk (mod->main.elf, buckets_at,
772 data = elf_getdata_rawchunk (mod->main.elf,
779 mod->syments = maxndx + 1;
789 if (offs[i_strtab] > offs[i_symtab] && mod->syments == 0)
790 mod->syments = ((offs[i_strtab] - offs[i_symtab])
791 / gelf_fsize (mod->main.elf,
794 if (mod->syments > 0)
796 mod->symdata = elf_getdata_rawchunk (mod->main.elf,
798 gelf_fsize (mod->main.elf,
800 mod->syments,
803 if (mod->symdata != NULL)
805 mod->symstrdata = elf_getdata_rawchunk (mod->main.elf,
809 if (mod->symstrdata == NULL)
810 mod->symdata = NULL;
812 if (mod->symdata == NULL)
813 mod->symerr = DWFL_E (LIBELF, elf_errno ());
816 mod->symfile = &mod->main;
817 mod->symerr = DWFL_E_NOERROR;
824 find_dynsym (Dwfl_Module *mod)
827 GElf_Ehdr *ehdr = gelf_getehdr (mod->main.elf, &ehdr_mem);
830 if (unlikely (elf_getphdrnum (mod->main.elf, &phnum) != 0))
836 GElf_Phdr *phdr = gelf_getphdr (mod->main.elf, i, &phdr_mem);
844 Elf_Data *data = elf_getdata_rawchunk (mod->main.elf,
852 size_t n = data->d_size / gelf_fsize (mod->main.elf,
893 translate_offs (0, mod, phnum, addrs, strsz, ehdr);
894 if (mod->symfile == NULL)
895 translate_offs (mod->main_bias, mod, phnum, addrs, strsz, ehdr);
906 find_aux_address_sync (Dwfl_Module *mod)
910 mod->aux_sym.address_sync = mod->main.address_sync;
915 if (unlikely (gelf_getehdr (mod->main.elf, &ehdr_main) == NULL)
916 || unlikely (gelf_getehdr (mod->aux_sym.elf, &ehdr_aux) == NULL))
918 mod->aux_sym.address_sync += ehdr_aux.e_entry - ehdr_main.e_entry;
922 if (mod->aux_sym.address_sync != 0)
923 return find_prelink_address_sync (mod, &mod->aux_sym) == DWFL_E_NOERROR;
933 find_aux_sym (Dwfl_Module *mod __attribute__ ((unused)),
941 Elf *elf = mod->main.elf;
983 mod->aux_sym.elf = elf_memory (buffer, size);
984 if (mod->aux_sym.elf == NULL)
988 mod->aux_sym.fd = -1;
989 mod->aux_sym.elf->flags |= ELF_F_MALLOCED;
990 if (open_elf (mod, &mod->aux_sym) != DWFL_E_NOERROR)
992 if (! find_aux_address_sync (mod))
994 elf_end (mod->aux_sym.elf);
995 mod->aux_sym.elf = NULL;
1002 while ((scn = elf_nextscn (mod->aux_sym.elf, scn)) != NULL)
1014 mod->aux_syments = shdr->sh_size / shdr->sh_entsize;
1015 mod->aux_first_global = shdr->sh_info;
1038 mod->aux_syments = 0;
1039 elf_end (mod->aux_sym.elf);
1040 mod->aux_sym.elf = NULL;
1052 find_symtab (Dwfl_Module *mod)
1054 if (mod->symdata != NULL || mod->aux_symdata != NULL /* Already done. */
1055 || mod->symerr != DWFL_E_NOERROR) /* Cached previous failure. */
1058 __libdwfl_getelf (mod);
1059 mod->symerr = mod->elferr;
1060 if (mod->symerr != DWFL_E_NOERROR)
1067 mod->symerr = load_symtab (&mod->main, &mod->symfile, &symscn,
1068 &xndxscn, &mod->syments, &mod->first_global,
1070 switch (mod->symerr)
1080 mod->symerr = find_debuginfo (mod);
1081 switch (mod->symerr)
1087 mod->symerr = load_symtab (&mod->debug, &mod->symfile, &symscn,
1088 &xndxscn, &mod->syments,
1089 &mod->first_global, &strshndx);
1093 mod->symerr = DWFL_E_NO_SYMTAB;
1097 switch (mod->symerr)
1107 find_aux_sym (mod, &aux_symscn, &aux_xndxscn, &aux_strshndx);
1112 mod->symerr = DWFL_E_NOERROR;
1119 mod->symerr = DWFL_E_NOERROR;
1124 find_dynsym (mod);
1131 if (elf_strptr (mod->symfile->elf, strshndx, 0) == NULL)
1134 mod->symdata = NULL;
1135 mod->syments = 0;
1136 mod->first_global = 0;
1137 mod->symerr = DWFL_E (LIBELF, elf_errno ());
1147 Elf_Scn *symstrscn = elf_getscn (mod->symfile->elf, strshndx);
1157 if (elf_getshdrstrndx (mod->symfile->elf, &shstrndx) < 0)
1160 const char *sname = elf_strptr (mod->symfile->elf, shstrndx, shdr->sh_name);
1173 mod->symstrdata = elf_getdata (symstrscn, NULL);
1174 if (mod->symstrdata == NULL || mod->symstrdata->d_buf == NULL)
1178 mod->symxndxdata = NULL;
1189 mod->symxndxdata = elf_getdata (xndxscn, NULL);
1190 if (mod->symxndxdata == NULL || mod->symxndxdata->d_buf == NULL)
1202 mod->symdata = elf_getdata (symscn, NULL);
1203 if (mod->symdata == NULL || mod->symdata->d_buf == NULL)
1209 || mod->syments > mod->symdata->d_size / shdr->sh_entsize
1210 || (size_t) mod->first_global > mod->syments)
1218 if (elf_strptr (mod->aux_sym.elf, aux_strshndx, 0) == NULL)
1221 mod->aux_syments = 0;
1222 elf_end (mod->aux_sym.elf);
1223 mod->aux_sym.elf = NULL;
1226 find_dynsym (mod);
1230 Elf_Scn *aux_strscn = elf_getscn (mod->aux_sym.elf, aux_strshndx);
1239 if (elf_getshdrstrndx (mod->aux_sym.elf, &aux_shstrndx) < 0)
1242 sname = elf_strptr (mod->aux_sym.elf, aux_shstrndx,
1256 mod->aux_symstrdata = elf_getdata (aux_strscn, NULL);
1257 if (mod->aux_symstrdata == NULL || mod->aux_symstrdata->d_buf == NULL)
1261 mod->aux_symxndxdata = NULL;
1272 mod->aux_symxndxdata = elf_getdata (aux_xndxscn, NULL);
1273 if (mod->aux_symxndxdata == NULL
1274 || mod->aux_symxndxdata->d_buf == NULL)
1286 mod->aux_symdata = elf_getdata (aux_symscn, NULL);
1287 if (mod->aux_symdata == NULL || mod->aux_symdata->d_buf == NULL)
1292 if (mod->aux_syments > mod->aux_symdata->d_size / shdr->sh_entsize
1293 || (size_t) mod->aux_first_global > mod->aux_syments)
1302 __libdwfl_module_getebl (Dwfl_Module *mod)
1304 if (mod->ebl == NULL)
1306 __libdwfl_getelf (mod);
1307 if (mod->elferr != DWFL_E_NOERROR)
1308 return mod->elferr;
1310 mod->ebl = ebl_openbackend (mod->main.elf);
1311 if (mod->ebl == NULL)
1319 load_dw (Dwfl_Module *mod, struct dwfl_file *debugfile)
1321 if (mod->e_type == ET_REL && !debugfile->relocated)
1323 const Dwfl_Callbacks *const cb = mod->dwfl->callbacks;
1329 Dwfl_Error error = __libdwfl_module_getebl (mod);
1333 find_symtab (mod);
1334 Dwfl_Error result = mod->symerr;
1336 result = __libdwfl_relocate (mod, debugfile->elf, true);
1341 mod->dw = INTUSE(dwarf_begin_elf) (debugfile->elf, DWARF_C_READ, NULL);
1342 if (mod->dw == NULL)
1349 if (mod->e_type == ET_REL && !debugfile->relocated)
1352 if (mod->main.fd != -1 && elf_cntl (mod->main.elf, ELF_C_FDREAD) == 0)
1354 close (mod->main.fd);
1355 mod->main.fd = -1;
1367 if (mod->dw->debugdir == NULL && mod->elfdir != NULL
1368 && debugfile == &mod->main)
1369 mod->dw->debugdir = strdup (mod->elfdir);
1372 mod->lazycu = 1;
1379 find_dw (Dwfl_Module *mod)
1381 if (mod->dw != NULL /* Already done. */
1382 || mod->dwerr != DWFL_E_NOERROR) /* Cached previous failure. */
1385 __libdwfl_getelf (mod);
1386 mod->dwerr = mod->elferr;
1387 if (mod->dwerr != DWFL_E_NOERROR)
1391 mod->dwerr = load_dw (mod, &mod->main);
1392 switch (mod->dwerr)
1395 mod->debug.elf = mod->main.elf;
1396 mod->debug.address_sync = mod->main.address_sync;
1401 find_debug_altlink (mod, mod->main.name);
1412 mod->dwerr = find_debuginfo (mod);
1413 switch (mod->dwerr)
1416 mod->dwerr = load_dw (mod, &mod->debug);
1417 if (mod->dwerr == DWFL_E_NOERROR)
1422 find_debug_altlink (mod, mod->debug.name);
1429 mod->dwerr = DWFL_E_NO_DWARF;
1437 mod->dwerr = __libdwfl_canon_error (mod->dwerr);
1441 dwfl_module_getdwarf (Dwfl_Module *mod, Dwarf_Addr *bias)
1443 if (mod == NULL)
1446 find_dw (mod);
1447 if (mod->dwerr == DWFL_E_NOERROR)
1451 if (mod->e_type == ET_REL
1452 && mod->main.relocated && ! mod->debug.relocated)
1454 mod->debug.relocated = true;
1455 if (mod->debug.elf != mod->main.elf)
1456 (void) __libdwfl_relocate (mod, mod->debug.elf, false);
1459 *bias = dwfl_adjusted_dwarf_addr (mod, 0);
1460 return mod->dw;
1463 __libdwfl_seterrno (mod->dwerr);
1469 dwfl_module_getsymtab (Dwfl_Module *mod)
1471 if (mod == NULL)
1474 find_symtab (mod);
1475 if (mod->symerr == DWFL_E_NOERROR)
1477 return (mod->syments + mod->aux_syments
1478 - (mod->syments > 0 && mod->aux_syments > 0 ? 1 : 0));
1480 __libdwfl_seterrno (mod->symerr);
1486 dwfl_module_getsymtab_first_global (Dwfl_Module *mod)
1488 if (mod == NULL)
1491 find_symtab (mod);
1492 if (mod->symerr == DWFL_E_NOERROR)
1499 int skip_aux_zero = (mod->syments > 0 && mod->aux_syments > 0) ? 1 : 0;
1500 return mod->first_global + mod->aux_first_global - skip_aux_zero;
1503 __libdwfl_seterrno (mod->symerr);