1 /* Find debugging and symbol information for a module in libdwfl.
2 Copyright (C) 2005-2012, 2014 Red Hat, Inc.
3 This file is part of elfutils.
5 This file is free software; you can redistribute it and/or modify
6 it under the terms of either
8 * the GNU Lesser General Public License as published by the Free
9 Software Foundation; either version 3 of the License, or (at
10 your option) any later version
14 * the GNU General Public License as published by the Free
15 Software Foundation; either version 2 of the License, or (at
16 your option) any later version
18 or both in parallel, as here.
20 elfutils is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
25 You should have received copies of the GNU General Public License and
26 the GNU Lesser General Public License along with this program. If
27 not, see <http://www.gnu.org/licenses/>. */
34 #include "../libdw/libdwP.h" /* DWARF_E_* values are here. */
35 #include "../libelf/libelfP.h"
37 static inline Dwfl_Error
38 open_elf_file (Elf **elf, int *fd, char **name)
42 /* CBFAIL uses errno if it's set, so clear it first in case we don't
43 set it with an open failure below. */
46 /* If there was a pre-primed file name left that the callback left
47 behind, try to open that file name. */
48 if (*fd < 0 && *name != NULL)
49 *fd = TEMP_FAILURE_RETRY (open64 (*name, O_RDONLY));
54 return __libdw_open_file (fd, elf, true, false);
56 else if (unlikely (elf_kind (*elf) != ELF_K_ELF))
65 /* Elf file already open and looks fine. */
66 return DWFL_E_NOERROR;
69 /* Open libelf FILE->fd and compute the load base of ELF as loaded in MOD.
70 When we return success, FILE->elf and FILE->vaddr are set up. */
71 static inline Dwfl_Error
72 open_elf (Dwfl_Module *mod, struct dwfl_file *file)
74 Dwfl_Error error = open_elf_file (&file->elf, &file->fd, &file->name);
75 if (error != DWFL_E_NOERROR)
78 GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (file->elf, &ehdr_mem);
86 return DWFL_E (LIBELF, elf_errno ());
89 if (ehdr->e_type != ET_REL)
91 /* In any non-ET_REL file, we compute the "synchronization address".
93 We start with the address at the end of the first PT_LOAD
94 segment. When prelink converts REL to RELA in an ET_DYN
95 file, it expands the space between the beginning of the
96 segment and the actual code/data addresses. Since that
97 change wasn't made in the debug file, the distance from
98 p_vaddr to an address of interest (in an st_value or DWARF
99 data) now differs between the main and debug files. The
100 distance from address_sync to an address of interest remains
103 If there are no section headers at all (full stripping), then
104 the end of the first segment is a valid synchronization address.
105 This cannot happen in a prelinked file, since prelink itself
106 relies on section headers for prelinking and for undoing it.
107 (If you do full stripping on a prelinked file, then you get what
108 you deserve--you can neither undo the prelinking, nor expect to
109 line it up with a debug file separated before prelinking.)
111 However, when prelink processes an ET_EXEC file, it can do
112 something different. There it juggles the "special" sections
113 (SHT_DYNSYM et al) to make space for the additional prelink
114 special sections. Sometimes it will do this by moving a special
115 section like .dynstr after the real program sections in the first
116 PT_LOAD segment--i.e. to the end. That changes the end address of
117 the segment, so it no longer lines up correctly and is not a valid
118 synchronization address to use. Because of this, we need to apply
119 a different prelink-savvy means to discover the synchronization
120 address when there is a separate debug file and a prelinked main
121 file. That is done in find_debuginfo, below. */
124 if (unlikely (elf_getphdrnum (file->elf, &phnum) != 0))
127 file->vaddr = file->address_sync = 0;
128 for (size_t i = 0; i < phnum; ++i)
131 GElf_Phdr *ph = gelf_getphdr (file->elf, i, &ph_mem);
132 if (unlikely (ph == NULL))
134 if (ph->p_type == PT_LOAD)
136 file->vaddr = ph->p_vaddr & -ph->p_align;
137 file->address_sync = ph->p_vaddr + ph->p_memsz;
143 /* We only want to set the module e_type explictly once, derived from
144 the main ELF file. (It might be changed for the kernel, because
145 that is special - see below.) open_elf is always called first for
146 the main ELF file, because both find_dw and find_symtab call
147 __libdwfl_getelf first to open the main file. So don't let debug
148 or aux files override the module e_type. The kernel heuristic
149 below could otherwise trigger for non-kernel/non-main files, since
150 their phdrs might not match the actual load addresses. */
151 if (file == &mod->main)
153 mod->e_type = ehdr->e_type;
155 /* Relocatable Linux kernels are ET_EXEC but act like ET_DYN. */
156 if (mod->e_type == ET_EXEC && file->vaddr != mod->low_addr)
157 mod->e_type = ET_DYN;
160 assert (mod->main.elf != NULL);
162 return DWFL_E_NOERROR;
165 /* We have an authoritative build ID for this module MOD, so don't use
166 a file by name that doesn't match that ID. */
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,
176 /* Build ID matches as it should. */
179 case -1: /* ELF error. */
180 mod->elferr = INTUSE(dwfl_errno) ();
183 case 0: /* File has no build ID note. */
184 case 1: /* FIle has a build ID that does not match. */
185 mod->elferr = DWFL_E_WRONG_ID_ELF;
192 /* We get here when it was the right ELF file. Clear it out. */
193 elf_end (mod->main.elf);
194 mod->main.elf = NULL;
195 if (mod->main.fd >= 0)
197 close (mod->main.fd);
202 /* Find the main ELF file for this module and open libelf on it.
203 When we return success, MOD->main.elf and MOD->main.bias are set up. */
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),
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)
222 /* Clear any explicitly reported build ID, just in case it was wrong.
223 We'll fetch it from the file when asked. */
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;
234 /* If the main file might have been prelinked, then we need to
235 discover the correct synchronization address between the main and
236 debug files. Because of prelink's section juggling, we cannot rely
237 on the address_sync computed from PT_LOAD segments (see open_elf).
239 We will attempt to discover a synchronization address based on the
240 section headers instead. But finding a section address that is
241 safe to use requires identifying which sections are SHT_PROGBITS.
242 We can do that in the main file, but in the debug file all the
243 allocated sections have been transformed into SHT_NOBITS so we have
244 lost the means to match them up correctly.
246 The only method left to us is to decode the .gnu.prelink_undo
247 section in the prelinked main file. This shows what the sections
248 looked like before prelink juggled them--when they still had a
249 direct correspondence to the debug file. */
251 find_prelink_address_sync (Dwfl_Module *mod, struct dwfl_file *file)
253 /* The magic section is only identified by name. */
255 if (elf_getshdrstrndx (mod->main.elf, &shstrndx) < 0)
256 return DWFL_E_LIBELF;
259 while ((scn = elf_nextscn (mod->main.elf, scn)) != NULL)
262 GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
263 if (unlikely (shdr == NULL))
264 return DWFL_E_LIBELF;
265 if (shdr->sh_type == SHT_PROGBITS
266 && !(shdr->sh_flags & SHF_ALLOC)
267 && shdr->sh_name != 0)
269 const char *secname = elf_strptr (mod->main.elf, shstrndx,
271 if (unlikely (secname == NULL))
272 return DWFL_E_LIBELF;
273 if (!strcmp (secname, ".gnu.prelink_undo"))
279 /* There was no .gnu.prelink_undo section. */
280 return DWFL_E_NOERROR;
282 Elf_Data *undodata = elf_rawdata (scn, NULL);
283 if (unlikely (undodata == NULL))
284 return DWFL_E_LIBELF;
286 /* Decode the section. It consists of the original ehdr, phdrs,
287 and shdrs (but omits section 0). */
297 .d_size = sizeof ehdr,
298 .d_type = ELF_T_EHDR,
299 .d_version = EV_CURRENT
301 Elf_Data src = *undodata;
302 src.d_size = gelf_fsize (mod->main.elf, ELF_T_EHDR, 1, EV_CURRENT);
303 src.d_type = ELF_T_EHDR;
304 if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
305 elf_getident (mod->main.elf, NULL)[EI_DATA])
307 return DWFL_E_LIBELF;
309 size_t shentsize = gelf_fsize (mod->main.elf, ELF_T_SHDR, 1, EV_CURRENT);
310 size_t phentsize = gelf_fsize (mod->main.elf, ELF_T_PHDR, 1, EV_CURRENT);
314 if (ehdr.e32.e_ident[EI_CLASS] == ELFCLASS32)
316 if (ehdr.e32.e_shentsize != shentsize
317 || ehdr.e32.e_phentsize != phentsize)
318 return DWFL_E_BAD_PRELINK;
319 phnum = ehdr.e32.e_phnum;
320 shnum = ehdr.e32.e_shnum;
324 if (ehdr.e64.e_shentsize != shentsize
325 || ehdr.e64.e_phentsize != phentsize)
326 return DWFL_E_BAD_PRELINK;
327 phnum = ehdr.e64.e_phnum;
328 shnum = ehdr.e64.e_shnum;
331 /* Since prelink does not store the zeroth section header in the undo
332 section, it cannot support SHN_XINDEX encoding. */
333 if (unlikely (shnum >= SHN_LORESERVE)
334 || unlikely (undodata->d_size != (src.d_size
336 + (shnum - 1) * shentsize)))
337 return DWFL_E_BAD_PRELINK;
339 /* We look at the allocated SHT_PROGBITS (or SHT_NOBITS) sections. (Most
340 every file will have some SHT_PROGBITS sections, but it's possible to
341 have one with nothing but .bss, i.e. SHT_NOBITS.) The special sections
342 that can be moved around have different sh_type values--except for
343 .interp, the section that became the PT_INTERP segment. So we exclude
344 the SHT_PROGBITS section whose address matches the PT_INTERP p_vaddr.
345 For this reason, we must examine the phdrs first to find PT_INTERP. */
347 GElf_Addr main_interp = 0;
350 if (unlikely (elf_getphdrnum (mod->main.elf, &main_phnum)))
351 return DWFL_E_LIBELF;
352 for (size_t i = 0; i < main_phnum; ++i)
355 if (unlikely (gelf_getphdr (mod->main.elf, i, &phdr) == NULL))
356 return DWFL_E_LIBELF;
357 if (phdr.p_type == PT_INTERP)
359 main_interp = phdr.p_vaddr;
365 src.d_buf += src.d_size;
366 src.d_type = ELF_T_PHDR;
367 src.d_size = phnum * phentsize;
369 GElf_Addr undo_interp = 0;
373 Elf32_Phdr p32[phnum];
374 Elf64_Phdr p64[phnum];
377 dst.d_size = sizeof phdr;
378 if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
379 ehdr.e32.e_ident[EI_DATA]) == NULL))
380 return DWFL_E_LIBELF;
381 if (ehdr.e32.e_ident[EI_CLASS] == ELFCLASS32)
383 for (uint_fast16_t i = 0; i < phnum; ++i)
384 if (phdr.p32[i].p_type == PT_INTERP)
386 undo_interp = phdr.p32[i].p_vaddr;
392 for (uint_fast16_t i = 0; i < phnum; ++i)
393 if (phdr.p64[i].p_type == PT_INTERP)
395 undo_interp = phdr.p64[i].p_vaddr;
401 if (unlikely ((main_interp == 0) != (undo_interp == 0)))
402 return DWFL_E_BAD_PRELINK;
404 src.d_buf += src.d_size;
405 src.d_type = ELF_T_SHDR;
406 src.d_size = gelf_fsize (mod->main.elf, ELF_T_SHDR, shnum - 1, EV_CURRENT);
410 Elf32_Shdr s32[shnum - 1];
411 Elf64_Shdr s64[shnum - 1];
414 dst.d_size = sizeof shdr;
415 if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
416 ehdr.e32.e_ident[EI_DATA]) == NULL))
417 return DWFL_E_LIBELF;
419 /* Now we can look at the original section headers of the main file
420 before it was prelinked. First we'll apply our method to the main
421 file sections as they are after prelinking, to calculate the
422 synchronization address of the main file. Then we'll apply that
423 same method to the saved section headers, to calculate the matching
424 synchronization address of the debug file.
426 The method is to consider SHF_ALLOC sections that are either
427 SHT_PROGBITS or SHT_NOBITS, excluding the section whose sh_addr
428 matches the PT_INTERP p_vaddr. The special sections that can be
429 moved by prelink have other types, except for .interp (which
430 becomes PT_INTERP). The "real" sections cannot move as such, but
431 .bss can be split into .dynbss and .bss, with the total memory
432 image remaining the same but being spread across the two sections.
433 So we consider the highest section end, which still matches up. */
437 inline void consider_shdr (GElf_Addr interp,
443 if ((sh_flags & SHF_ALLOC)
444 && ((sh_type == SHT_PROGBITS && sh_addr != interp)
445 || sh_type == SHT_NOBITS))
447 const GElf_Addr sh_end = sh_addr + sh_size;
448 if (sh_end > highest)
455 while ((scn = elf_nextscn (mod->main.elf, scn)) != NULL)
458 GElf_Shdr *sh = gelf_getshdr (scn, &sh_mem);
459 if (unlikely (sh == NULL))
460 return DWFL_E_LIBELF;
461 consider_shdr (main_interp, sh->sh_type, sh->sh_flags,
462 sh->sh_addr, sh->sh_size);
464 if (highest > mod->main.vaddr)
466 mod->main.address_sync = highest;
469 if (ehdr.e32.e_ident[EI_CLASS] == ELFCLASS32)
470 for (size_t i = 0; i < shnum - 1; ++i)
471 consider_shdr (undo_interp, shdr.s32[i].sh_type, shdr.s32[i].sh_flags,
472 shdr.s32[i].sh_addr, shdr.s32[i].sh_size);
474 for (size_t i = 0; i < shnum - 1; ++i)
475 consider_shdr (undo_interp, shdr.s64[i].sh_type, shdr.s64[i].sh_flags,
476 shdr.s64[i].sh_addr, shdr.s64[i].sh_size);
478 if (highest > file->vaddr)
479 file->address_sync = highest;
481 return DWFL_E_BAD_PRELINK;
484 return DWFL_E_NOERROR;
487 /* Find the separate debuginfo file for this module and open libelf on it.
488 When we return success, MOD->debug is set up. */
490 find_debuginfo (Dwfl_Module *mod)
492 if (mod->debug.elf != NULL)
493 return DWFL_E_NOERROR;
495 GElf_Word debuglink_crc = 0;
496 const char *debuglink_file;
497 debuglink_file = INTUSE(dwelf_elf_gnu_debuglink) (mod->main.elf,
500 mod->debug.fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
505 Dwfl_Error result = open_elf (mod, &mod->debug);
506 if (result == DWFL_E_NOERROR && mod->debug.address_sync != 0)
507 result = find_prelink_address_sync (mod, &mod->debug);
511 /* Try to find the alternative debug link for the given DWARF and set
512 it if found. Only called when mod->dw is already setup but still
513 might need an alternative (dwz multi) debug file. filename is either
514 the main or debug name from which the Dwarf was created. */
516 find_debug_altlink (Dwfl_Module *mod, const char *filename)
518 assert (mod->dw != NULL);
521 const void *build_id;
522 ssize_t build_id_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw,
526 if (build_id_len > 0)
528 /* We could store altfile in the module, but don't really need it. */
529 char *altfile = NULL;
530 mod->alt_fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
536 /* The (internal) callbacks might just set mod->alt_elf directly
537 because they open the Elf anyway for sanity checking.
538 Otherwise open either the given file name or use the fd
540 Dwfl_Error error = open_elf_file (&mod->alt_elf, &mod->alt_fd,
542 if (error == DWFL_E_NOERROR)
544 mod->alt = INTUSE(dwarf_begin_elf) (mod->alt_elf,
546 if (mod->alt == NULL)
548 elf_end (mod->alt_elf);
554 dwarf_setalt (mod->dw, mod->alt);
557 free (altfile); /* See above, we don't really need it. */
561 /* Try to find a symbol table in FILE.
562 Returns DWFL_E_NOERROR if a proper one is found.
563 Returns DWFL_E_NO_SYMTAB if not, but still sets results for SHT_DYNSYM. */
565 load_symtab (struct dwfl_file *file, struct dwfl_file **symfile,
566 Elf_Scn **symscn, Elf_Scn **xndxscn,
567 size_t *syments, int *first_global, GElf_Word *strshndx)
571 while ((scn = elf_nextscn (file->elf, scn)) != NULL)
573 GElf_Shdr shdr_mem, *shdr = gelf_getshdr (scn, &shdr_mem);
575 switch (shdr->sh_type)
581 *strshndx = shdr->sh_link;
582 *syments = shdr->sh_size / shdr->sh_entsize;
583 *first_global = shdr->sh_info;
584 if (*xndxscn != NULL)
585 return DWFL_E_NOERROR;
591 /* Use this if need be, but keep looking for SHT_SYMTAB. */
594 *strshndx = shdr->sh_link;
595 *syments = shdr->sh_size / shdr->sh_entsize;
596 *first_global = shdr->sh_info;
599 case SHT_SYMTAB_SHNDX:
602 return DWFL_E_NOERROR;
611 /* We found one, though no SHT_SYMTAB_SHNDX to go with it. */
612 return DWFL_E_NOERROR;
614 /* We found no SHT_SYMTAB, so any SHT_SYMTAB_SHNDX was bogus.
615 We might have found an SHT_DYNSYM and set *SYMSCN et al though. */
617 return DWFL_E_NO_SYMTAB;
621 /* Translate addresses into file offsets.
622 OFFS[*] start out zero and remain zero if unresolved. */
624 find_offsets (Elf *elf, size_t phnum, size_t n,
625 GElf_Addr addrs[n], GElf_Off offs[n])
628 for (size_t i = 0; i < phnum; ++i)
631 GElf_Phdr *phdr = gelf_getphdr (elf, i, &phdr_mem);
632 if (phdr != NULL && phdr->p_type == PT_LOAD && phdr->p_memsz > 0)
633 for (size_t j = 0; j < n; ++j)
635 && addrs[j] >= phdr->p_vaddr
636 && addrs[j] - phdr->p_vaddr < phdr->p_filesz)
638 offs[j] = addrs[j] - phdr->p_vaddr + phdr->p_offset;
645 /* Try to find a dynamic symbol table via phdrs. */
647 find_dynsym (Dwfl_Module *mod)
650 GElf_Ehdr *ehdr = gelf_getehdr (mod->main.elf, &ehdr_mem);
653 if (unlikely (elf_getphdrnum (mod->main.elf, &phnum) != 0))
656 for (size_t i = 0; i < phnum; ++i)
659 GElf_Phdr *phdr = gelf_getphdr (mod->main.elf, i, &phdr_mem);
663 if (phdr->p_type == PT_DYNAMIC)
665 /* Examine the dynamic section for the pointers we need. */
667 Elf_Data *data = elf_getdata_rawchunk (mod->main.elf,
668 phdr->p_offset, phdr->p_filesz,
681 GElf_Addr addrs[i_max] = { 0, };
682 GElf_Xword strsz = 0;
683 size_t n = data->d_size / gelf_fsize (mod->main.elf,
684 ELF_T_DYN, 1, EV_CURRENT);
685 for (size_t j = 0; j < n; ++j)
688 GElf_Dyn *dyn = gelf_getdyn (data, j, &dyn_mem);
693 addrs[i_symtab] = dyn->d_un.d_ptr;
697 addrs[i_hash] = dyn->d_un.d_ptr;
701 addrs[i_gnu_hash] = dyn->d_un.d_ptr;
705 addrs[i_strtab] = dyn->d_un.d_ptr;
709 strsz = dyn->d_un.d_val;
721 /* Translate pointers into file offsets. */
722 GElf_Off offs[i_max] = { 0, };
723 find_offsets (mod->main.elf, phnum, i_max, addrs, offs);
725 /* Figure out the size of the symbol table. */
726 if (offs[i_hash] != 0)
728 /* In the original format, .hash says the size of .dynsym. */
730 size_t entsz = SH_ENTSIZE_HASH (ehdr);
731 data = elf_getdata_rawchunk (mod->main.elf,
732 offs[i_hash] + entsz, entsz,
733 entsz == 4 ? ELF_T_WORD
736 mod->syments = (entsz == 4
737 ? *(const GElf_Word *) data->d_buf
738 : *(const GElf_Xword *) data->d_buf);
740 if (offs[i_gnu_hash] != 0 && mod->syments == 0)
742 /* In the new format, we can derive it with some work. */
748 Elf32_Word maskwords;
752 data = elf_getdata_rawchunk (mod->main.elf, offs[i_gnu_hash],
753 sizeof *header, ELF_T_WORD);
756 header = data->d_buf;
757 Elf32_Word nbuckets = header->nbuckets;
758 Elf32_Word symndx = header->symndx;
759 GElf_Off buckets_at = (offs[i_gnu_hash] + sizeof *header
760 + (gelf_getclass (mod->main.elf)
761 * sizeof (Elf32_Word)
762 * header->maskwords));
764 data = elf_getdata_rawchunk (mod->main.elf, buckets_at,
765 nbuckets * sizeof (Elf32_Word),
767 if (data != NULL && symndx < nbuckets)
769 const Elf32_Word *const buckets = data->d_buf;
770 Elf32_Word maxndx = symndx;
771 for (Elf32_Word bucket = 0; bucket < nbuckets; ++bucket)
772 if (buckets[bucket] > maxndx)
773 maxndx = buckets[bucket];
775 GElf_Off hasharr_at = (buckets_at
776 + nbuckets * sizeof (Elf32_Word));
777 hasharr_at += (maxndx - symndx) * sizeof (Elf32_Word);
780 data = elf_getdata_rawchunk (mod->main.elf,
785 && (*(const Elf32_Word *) data->d_buf & 1u))
787 mod->syments = maxndx + 1;
791 hasharr_at += sizeof (Elf32_Word);
792 } while (data != NULL);
796 if (offs[i_strtab] > offs[i_symtab] && mod->syments == 0)
797 mod->syments = ((offs[i_strtab] - offs[i_symtab])
798 / gelf_fsize (mod->main.elf,
799 ELF_T_SYM, 1, EV_CURRENT));
801 if (mod->syments > 0)
803 mod->symdata = elf_getdata_rawchunk (mod->main.elf,
805 gelf_fsize (mod->main.elf,
810 if (mod->symdata != NULL)
812 mod->symstrdata = elf_getdata_rawchunk (mod->main.elf,
816 if (mod->symstrdata == NULL)
819 if (mod->symdata == NULL)
820 mod->symerr = DWFL_E (LIBELF, elf_errno ());
823 mod->symfile = &mod->main;
824 mod->symerr = DWFL_E_NOERROR;
834 /* Try to find the offset between the main file and .gnu_debugdata. */
836 find_aux_address_sync (Dwfl_Module *mod)
838 /* Don't trust the phdrs in the minisymtab elf file to be setup correctly.
839 The address_sync is equal to the main file it is embedded in at first. */
840 mod->aux_sym.address_sync = mod->main.address_sync;
842 /* Adjust address_sync for the difference in entry addresses, attempting to
843 account for ELF relocation changes after aux was split. */
844 GElf_Ehdr ehdr_main, ehdr_aux;
845 if (unlikely (gelf_getehdr (mod->main.elf, &ehdr_main) == NULL)
846 || unlikely (gelf_getehdr (mod->aux_sym.elf, &ehdr_aux) == NULL))
848 mod->aux_sym.address_sync += ehdr_aux.e_entry - ehdr_main.e_entry;
850 /* The shdrs are setup OK to make find_prelink_address_sync () do the right
851 thing, which is possibly more reliable, but it needs .gnu.prelink_undo. */
852 if (mod->aux_sym.address_sync != 0)
853 return find_prelink_address_sync (mod, &mod->aux_sym) == DWFL_E_NOERROR;
859 /* Try to find the auxiliary symbol table embedded in the main elf file
860 section .gnu_debugdata. Only matters if the symbol information comes
861 from the main file dynsym. No harm done if not found. */
863 find_aux_sym (Dwfl_Module *mod __attribute__ ((unused)),
864 Elf_Scn **aux_symscn __attribute__ ((unused)),
865 Elf_Scn **aux_xndxscn __attribute__ ((unused)),
866 GElf_Word *aux_strshndx __attribute__ ((unused)))
868 /* Since a .gnu_debugdata section is compressed using lzma don't do
869 anything unless we have support for that. */
871 Elf *elf = mod->main.elf;
874 if (elf_getshdrstrndx (elf, &shstrndx) < 0)
878 while ((scn = elf_nextscn (elf, scn)) != NULL)
881 GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
885 const char *name = elf_strptr (elf, shstrndx, shdr->sh_name);
889 if (!strcmp (name, ".gnu_debugdata"))
896 /* Found the .gnu_debugdata section. Uncompress the lzma image and
897 turn it into an ELF image. */
898 Elf_Data *rawdata = elf_rawdata (scn, NULL);
905 error = __libdw_unlzma (-1, 0, rawdata->d_buf, rawdata->d_size,
907 if (error == DWFL_E_NOERROR)
909 if (unlikely (size == 0))
913 mod->aux_sym.elf = elf_memory (buffer, size);
914 if (mod->aux_sym.elf == NULL)
918 mod->aux_sym.fd = -1;
919 mod->aux_sym.elf->flags |= ELF_F_MALLOCED;
920 if (open_elf (mod, &mod->aux_sym) != DWFL_E_NOERROR)
922 if (! find_aux_address_sync (mod))
924 elf_end (mod->aux_sym.elf);
925 mod->aux_sym.elf = NULL;
929 /* So far, so good. Get minisymtab table data and cache it. */
930 bool minisymtab = false;
932 while ((scn = elf_nextscn (mod->aux_sym.elf, scn)) != NULL)
934 GElf_Shdr shdr_mem, *shdr = gelf_getshdr (scn, &shdr_mem);
936 switch (shdr->sh_type)
941 *aux_strshndx = shdr->sh_link;
942 mod->aux_syments = shdr->sh_size / shdr->sh_entsize;
943 mod->aux_first_global = shdr->sh_info;
944 if (*aux_xndxscn != NULL)
948 case SHT_SYMTAB_SHNDX:
960 /* We found one, though no SHT_SYMTAB_SHNDX to go with it. */
963 /* We found no SHT_SYMTAB, so everything else is bogus. */
966 mod->aux_syments = 0;
967 elf_end (mod->aux_sym.elf);
968 mod->aux_sym.elf = NULL;
978 /* Try to find a symbol table in either MOD->main.elf or MOD->debug.elf. */
980 find_symtab (Dwfl_Module *mod)
982 if (mod->symdata != NULL || mod->aux_symdata != NULL /* Already done. */
983 || mod->symerr != DWFL_E_NOERROR) /* Cached previous failure. */
986 __libdwfl_getelf (mod);
987 mod->symerr = mod->elferr;
988 if (mod->symerr != DWFL_E_NOERROR)
991 /* First see if the main ELF file has the debugging information. */
992 Elf_Scn *symscn = NULL, *xndxscn = NULL;
993 Elf_Scn *aux_symscn = NULL, *aux_xndxscn = NULL;
994 GElf_Word strshndx, aux_strshndx = 0;
995 mod->symerr = load_symtab (&mod->main, &mod->symfile, &symscn,
996 &xndxscn, &mod->syments, &mod->first_global,
1003 case DWFL_E_NOERROR:
1006 case DWFL_E_NO_SYMTAB:
1007 /* Now we have to look for a separate debuginfo file. */
1008 mod->symerr = find_debuginfo (mod);
1009 switch (mod->symerr)
1014 case DWFL_E_NOERROR:
1015 mod->symerr = load_symtab (&mod->debug, &mod->symfile, &symscn,
1016 &xndxscn, &mod->syments,
1017 &mod->first_global, &strshndx);
1020 case DWFL_E_CB: /* The find_debuginfo hook failed. */
1021 mod->symerr = DWFL_E_NO_SYMTAB;
1025 switch (mod->symerr)
1030 case DWFL_E_NOERROR:
1033 case DWFL_E_NO_SYMTAB:
1034 /* There might be an auxiliary table. */
1035 find_aux_sym (mod, &aux_symscn, &aux_xndxscn, &aux_strshndx);
1039 /* We still have the dynamic symbol table. */
1040 mod->symerr = DWFL_E_NOERROR;
1044 if (aux_symscn != NULL)
1046 /* We still have the auxiliary symbol table. */
1047 mod->symerr = DWFL_E_NOERROR;
1051 /* Last ditch, look for dynamic symbols without section headers. */
1058 /* This does some sanity checks on the string table section. */
1059 if (elf_strptr (mod->symfile->elf, strshndx, 0) == NULL)
1062 mod->symerr = DWFL_E (LIBELF, elf_errno ());
1066 /* Cache the data; MOD->syments and MOD->first_global were set above. */
1068 mod->symstrdata = elf_getdata (elf_getscn (mod->symfile->elf, strshndx),
1070 if (mod->symstrdata == NULL)
1073 if (xndxscn == NULL)
1074 mod->symxndxdata = NULL;
1077 mod->symxndxdata = elf_getdata (xndxscn, NULL);
1078 if (mod->symxndxdata == NULL)
1082 mod->symdata = elf_getdata (symscn, NULL);
1083 if (mod->symdata == NULL)
1086 /* Cache any auxiliary symbol info, when it fails, just ignore aux_sym. */
1087 if (aux_symscn != NULL)
1090 /* This does some sanity checks on the string table section. */
1091 if (elf_strptr (mod->aux_sym.elf, aux_strshndx, 0) == NULL)
1094 mod->aux_syments = 0;
1095 elf_end (mod->aux_sym.elf);
1096 mod->aux_sym.elf = NULL;
1100 mod->aux_symstrdata = elf_getdata (elf_getscn (mod->aux_sym.elf,
1103 if (mod->aux_symstrdata == NULL)
1106 if (aux_xndxscn == NULL)
1107 mod->aux_symxndxdata = NULL;
1110 mod->aux_symxndxdata = elf_getdata (aux_xndxscn, NULL);
1111 if (mod->aux_symxndxdata == NULL)
1115 mod->aux_symdata = elf_getdata (aux_symscn, NULL);
1116 if (mod->aux_symdata == NULL)
1122 /* Try to open a libebl backend for MOD. */
1125 __libdwfl_module_getebl (Dwfl_Module *mod)
1127 if (mod->ebl == NULL)
1129 __libdwfl_getelf (mod);
1130 if (mod->elferr != DWFL_E_NOERROR)
1133 mod->ebl = ebl_openbackend (mod->main.elf);
1134 if (mod->ebl == NULL)
1135 return DWFL_E_LIBEBL;
1137 return DWFL_E_NOERROR;
1140 /* Try to start up libdw on DEBUGFILE. */
1142 load_dw (Dwfl_Module *mod, struct dwfl_file *debugfile)
1144 if (mod->e_type == ET_REL && !debugfile->relocated)
1146 const Dwfl_Callbacks *const cb = mod->dwfl->callbacks;
1148 /* The debugging sections have to be relocated. */
1149 if (cb->section_address == NULL)
1150 return DWFL_E_NOREL;
1152 Dwfl_Error error = __libdwfl_module_getebl (mod);
1153 if (error != DWFL_E_NOERROR)
1157 Dwfl_Error result = mod->symerr;
1158 if (result == DWFL_E_NOERROR)
1159 result = __libdwfl_relocate (mod, debugfile->elf, true);
1160 if (result != DWFL_E_NOERROR)
1163 /* Don't keep the file descriptors around. */
1164 if (mod->main.fd != -1 && elf_cntl (mod->main.elf, ELF_C_FDREAD) == 0)
1166 close (mod->main.fd);
1169 if (debugfile->fd != -1 && elf_cntl (debugfile->elf, ELF_C_FDREAD) == 0)
1171 close (debugfile->fd);
1176 mod->dw = INTUSE(dwarf_begin_elf) (debugfile->elf, DWARF_C_READ, NULL);
1177 if (mod->dw == NULL)
1179 int err = INTUSE(dwarf_errno) ();
1180 return err == DWARF_E_NO_DWARF ? DWFL_E_NO_DWARF : DWFL_E (LIBDW, err);
1183 /* Until we have iterated through all CU's, we might do lazy lookups. */
1186 return DWFL_E_NOERROR;
1189 /* Try to start up libdw on either the main file or the debuginfo file. */
1191 find_dw (Dwfl_Module *mod)
1193 if (mod->dw != NULL /* Already done. */
1194 || mod->dwerr != DWFL_E_NOERROR) /* Cached previous failure. */
1197 __libdwfl_getelf (mod);
1198 mod->dwerr = mod->elferr;
1199 if (mod->dwerr != DWFL_E_NOERROR)
1202 /* First see if the main ELF file has the debugging information. */
1203 mod->dwerr = load_dw (mod, &mod->main);
1206 case DWFL_E_NOERROR:
1207 mod->debug.elf = mod->main.elf;
1208 mod->debug.address_sync = mod->main.address_sync;
1210 /* The Dwarf might need an alt debug file, find that now after
1211 everything about the debug file has been setup (the
1212 find_debuginfo callback might need it). */
1213 find_debug_altlink (mod, mod->main.name);
1216 case DWFL_E_NO_DWARF:
1223 /* Now we have to look for a separate debuginfo file. */
1224 mod->dwerr = find_debuginfo (mod);
1227 case DWFL_E_NOERROR:
1228 mod->dwerr = load_dw (mod, &mod->debug);
1229 if (mod->dwerr == DWFL_E_NOERROR)
1231 /* The Dwarf might need an alt debug file, find that now after
1232 everything about the debug file has been setup (the
1233 find_debuginfo callback might need it). */
1234 find_debug_altlink (mod, mod->debug.name);
1240 case DWFL_E_CB: /* The find_debuginfo hook failed. */
1241 mod->dwerr = DWFL_E_NO_DWARF;
1249 mod->dwerr = __libdwfl_canon_error (mod->dwerr);
1253 dwfl_module_getdwarf (Dwfl_Module *mod, Dwarf_Addr *bias)
1259 if (mod->dwerr == DWFL_E_NOERROR)
1261 /* If dwfl_module_getelf was used previously, then partial apply
1262 relocation to miscellaneous sections in the debug file too. */
1263 if (mod->e_type == ET_REL
1264 && mod->main.relocated && ! mod->debug.relocated)
1266 mod->debug.relocated = true;
1267 if (mod->debug.elf != mod->main.elf)
1268 (void) __libdwfl_relocate (mod, mod->debug.elf, false);
1271 *bias = dwfl_adjusted_dwarf_addr (mod, 0);
1275 __libdwfl_seterrno (mod->dwerr);
1278 INTDEF (dwfl_module_getdwarf)
1281 dwfl_module_getsymtab (Dwfl_Module *mod)
1287 if (mod->symerr == DWFL_E_NOERROR)
1288 /* We will skip the auxiliary zero entry if there is another one. */
1289 return (mod->syments + mod->aux_syments
1290 - (mod->syments > 0 && mod->aux_syments > 0 ? 1 : 0));
1292 __libdwfl_seterrno (mod->symerr);
1295 INTDEF (dwfl_module_getsymtab)
1298 dwfl_module_getsymtab_first_global (Dwfl_Module *mod)
1304 if (mod->symerr == DWFL_E_NOERROR)
1306 /* All local symbols should come before all global symbols. If
1307 we have an auxiliary table make sure all the main locals come
1308 first, then all aux locals, then all main globals and finally all
1309 aux globals. And skip the auxiliary table zero undefined
1311 int skip_aux_zero = (mod->syments > 0 && mod->aux_syments > 0) ? 1 : 0;
1312 return mod->first_global + mod->aux_first_global - skip_aux_zero;
1315 __libdwfl_seterrno (mod->symerr);
1318 INTDEF (dwfl_module_getsymtab_first_global)