Home | History | Annotate | Download | only in libdwfl
      1 /* Find debugging and symbol information for a module in libdwfl.
      2    Copyright (C) 2005-2012, 2014, 2015 Red Hat, Inc.
      3    This file is part of elfutils.
      4 
      5    This file is free software; you can redistribute it and/or modify
      6    it under the terms of either
      7 
      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
     11 
     12    or
     13 
     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
     17 
     18    or both in parallel, as here.
     19 
     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.
     24 
     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/>.  */
     28 
     29 #include "libdwflP.h"
     30 #include <inttypes.h>
     31 #include <fcntl.h>
     32 #include <string.h>
     33 #include <unistd.h>
     34 #include "../libdw/libdwP.h"	/* DWARF_E_* values are here.  */
     35 #include "../libelf/libelfP.h"
     36 
     37 static inline Dwfl_Error
     38 open_elf_file (Elf **elf, int *fd, char **name)
     39 {
     40   if (*elf == NULL)
     41     {
     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.  */
     44       errno = 0;
     45 
     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 (open (*name, O_RDONLY));
     50 
     51       if (*fd < 0)
     52 	return CBFAIL;
     53 
     54       return __libdw_open_file (fd, elf, true, false);
     55     }
     56   else if (unlikely (elf_kind (*elf) != ELF_K_ELF))
     57     {
     58       elf_end (*elf);
     59       *elf = NULL;
     60       close (*fd);
     61       *fd = -1;
     62       return DWFL_E_BADELF;
     63     }
     64 
     65   /* Elf file already open and looks fine.  */
     66   return DWFL_E_NOERROR;
     67 }
     68 
     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)
     73 {
     74   Dwfl_Error error = open_elf_file (&file->elf, &file->fd, &file->name);
     75   if (error != DWFL_E_NOERROR)
     76     return error;
     77 
     78   GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (file->elf, &ehdr_mem);
     79   if (ehdr == NULL)
     80     {
     81     elf_error:
     82       elf_end (file->elf);
     83       file->elf = NULL;
     84       close (file->fd);
     85       file->fd = -1;
     86       return DWFL_E (LIBELF, elf_errno ());
     87     }
     88 
     89   if (ehdr->e_type != ET_REL)
     90     {
     91       /* In any non-ET_REL file, we compute the "synchronization address".
     92 
     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
    101 	 consistent.
    102 
    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.)
    110 
    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.  */
    122 
    123       size_t phnum;
    124       if (unlikely (elf_getphdrnum (file->elf, &phnum) != 0))
    125 	goto elf_error;
    126 
    127       file->vaddr = file->address_sync = 0;
    128       for (size_t i = 0; i < phnum; ++i)
    129 	{
    130 	  GElf_Phdr ph_mem;
    131 	  GElf_Phdr *ph = gelf_getphdr (file->elf, i, &ph_mem);
    132 	  if (unlikely (ph == NULL))
    133 	    goto elf_error;
    134 	  if (ph->p_type == PT_LOAD)
    135 	    {
    136 	      file->vaddr = ph->p_vaddr & -ph->p_align;
    137 	      file->address_sync = ph->p_vaddr + ph->p_memsz;
    138 	      break;
    139 	    }
    140 	}
    141     }
    142 
    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)
    152     {
    153       mod->e_type = ehdr->e_type;
    154 
    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;
    158     }
    159   else
    160     assert (mod->main.elf != NULL);
    161 
    162   return DWFL_E_NOERROR;
    163 }
    164 
    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.  */
    167 static void
    168 mod_verify_build_id (Dwfl_Module *mod)
    169 {
    170   assert (mod->build_id_len > 0);
    171 
    172   switch (__builtin_expect (__libdwfl_find_build_id (mod, false,
    173 						     mod->main.elf), 2))
    174     {
    175     case 2:
    176       /* Build ID matches as it should. */
    177       return;
    178 
    179     case -1:			/* ELF error.  */
    180       mod->elferr = INTUSE(dwfl_errno) ();
    181       break;
    182 
    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;
    186       break;
    187 
    188     default:
    189       abort ();
    190     }
    191 
    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)
    196     {
    197       close (mod->main.fd);
    198       mod->main.fd = -1;
    199     }
    200 }
    201 
    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.  */
    204 void
    205 internal_function
    206 __libdwfl_getelf (Dwfl_Module *mod)
    207 {
    208   if (mod->main.elf != NULL	/* Already done.  */
    209       || mod->elferr != DWFL_E_NOERROR)	/* Cached failure.  */
    210     return;
    211 
    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)
    218     return;
    219 
    220   if (!mod->main.valid)
    221     {
    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;
    227     }
    228   else if (fallback)
    229     mod_verify_build_id (mod);
    230 
    231   mod->main_bias = mod->e_type == ET_REL ? 0 : mod->low_addr - mod->main.vaddr;
    232 }
    233 
    234 static inline void
    235 consider_shdr (GElf_Addr interp,
    236                GElf_Word sh_type,
    237                GElf_Xword sh_flags,
    238                GElf_Addr sh_addr,
    239                GElf_Xword sh_size,
    240                GElf_Addr *phighest)
    241 {
    242   if ((sh_flags & SHF_ALLOC)
    243       && ((sh_type == SHT_PROGBITS && sh_addr != interp)
    244           || sh_type == SHT_NOBITS))
    245     {
    246       const GElf_Addr sh_end = sh_addr + sh_size;
    247       if (sh_end > *phighest)
    248         *phighest = sh_end;
    249     }
    250 }
    251 
    252 /* If the main file might have been prelinked, then we need to
    253    discover the correct synchronization address between the main and
    254    debug files.  Because of prelink's section juggling, we cannot rely
    255    on the address_sync computed from PT_LOAD segments (see open_elf).
    256 
    257    We will attempt to discover a synchronization address based on the
    258    section headers instead.  But finding a section address that is
    259    safe to use requires identifying which sections are SHT_PROGBITS.
    260    We can do that in the main file, but in the debug file all the
    261    allocated sections have been transformed into SHT_NOBITS so we have
    262    lost the means to match them up correctly.
    263 
    264    The only method left to us is to decode the .gnu.prelink_undo
    265    section in the prelinked main file.  This shows what the sections
    266    looked like before prelink juggled them--when they still had a
    267    direct correspondence to the debug file.  */
    268 static Dwfl_Error
    269 find_prelink_address_sync (Dwfl_Module *mod, struct dwfl_file *file)
    270 {
    271   /* The magic section is only identified by name.  */
    272   size_t shstrndx;
    273   if (elf_getshdrstrndx (mod->main.elf, &shstrndx) < 0)
    274     return DWFL_E_LIBELF;
    275 
    276   Elf_Scn *scn = NULL;
    277   while ((scn = elf_nextscn (mod->main.elf, scn)) != NULL)
    278     {
    279       GElf_Shdr shdr_mem;
    280       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
    281       if (unlikely (shdr == NULL))
    282 	return DWFL_E_LIBELF;
    283       if (shdr->sh_type == SHT_PROGBITS
    284 	  && !(shdr->sh_flags & SHF_ALLOC)
    285 	  && shdr->sh_name != 0)
    286 	{
    287 	  const char *secname = elf_strptr (mod->main.elf, shstrndx,
    288 					    shdr->sh_name);
    289 	  if (unlikely (secname == NULL))
    290 	    return DWFL_E_LIBELF;
    291 	  if (!strcmp (secname, ".gnu.prelink_undo"))
    292 	    break;
    293 	}
    294     }
    295 
    296   if (scn == NULL)
    297     /* There was no .gnu.prelink_undo section.  */
    298     return DWFL_E_NOERROR;
    299 
    300   Elf_Data *undodata = elf_rawdata (scn, NULL);
    301   if (unlikely (undodata == NULL))
    302     return DWFL_E_LIBELF;
    303 
    304   /* Decode the section.  It consists of the original ehdr, phdrs,
    305      and shdrs (but omits section 0).  */
    306 
    307   union
    308   {
    309     Elf32_Ehdr e32;
    310     Elf64_Ehdr e64;
    311   } ehdr;
    312   Elf_Data dst =
    313     {
    314       .d_buf = &ehdr,
    315       .d_size = sizeof ehdr,
    316       .d_type = ELF_T_EHDR,
    317       .d_version = EV_CURRENT
    318     };
    319   Elf_Data src = *undodata;
    320   src.d_size = gelf_fsize (mod->main.elf, ELF_T_EHDR, 1, EV_CURRENT);
    321   src.d_type = ELF_T_EHDR;
    322   if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
    323 			       elf_getident (mod->main.elf, NULL)[EI_DATA])
    324 		== NULL))
    325     return DWFL_E_LIBELF;
    326 
    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);
    329 
    330   uint_fast16_t phnum;
    331   uint_fast16_t shnum;
    332   if (ehdr.e32.e_ident[EI_CLASS] == ELFCLASS32)
    333     {
    334       if (ehdr.e32.e_shentsize != shentsize
    335 	  || ehdr.e32.e_phentsize != phentsize)
    336 	return DWFL_E_BAD_PRELINK;
    337       phnum = ehdr.e32.e_phnum;
    338       shnum = ehdr.e32.e_shnum;
    339     }
    340   else
    341     {
    342       if (ehdr.e64.e_shentsize != shentsize
    343 	  || ehdr.e64.e_phentsize != phentsize)
    344 	return DWFL_E_BAD_PRELINK;
    345       phnum = ehdr.e64.e_phnum;
    346       shnum = ehdr.e64.e_shnum;
    347     }
    348 
    349   /* Since prelink does not store the zeroth section header in the undo
    350      section, it cannot support SHN_XINDEX encoding.  */
    351   if (unlikely (shnum >= SHN_LORESERVE)
    352       || unlikely (undodata->d_size != (src.d_size
    353 					+ phnum * phentsize
    354 					+ (shnum - 1) * shentsize)))
    355     return DWFL_E_BAD_PRELINK;
    356 
    357   /* We look at the allocated SHT_PROGBITS (or SHT_NOBITS) sections.  (Most
    358      every file will have some SHT_PROGBITS sections, but it's possible to
    359      have one with nothing but .bss, i.e. SHT_NOBITS.)  The special sections
    360      that can be moved around have different sh_type values--except for
    361      .interp, the section that became the PT_INTERP segment.  So we exclude
    362      the SHT_PROGBITS section whose address matches the PT_INTERP p_vaddr.
    363      For this reason, we must examine the phdrs first to find PT_INTERP.  */
    364 
    365   GElf_Addr main_interp = 0;
    366   {
    367     size_t main_phnum;
    368     if (unlikely (elf_getphdrnum (mod->main.elf, &main_phnum)))
    369       return DWFL_E_LIBELF;
    370     for (size_t i = 0; i < main_phnum; ++i)
    371       {
    372 	GElf_Phdr phdr;
    373 	if (unlikely (gelf_getphdr (mod->main.elf, i, &phdr) == NULL))
    374 	  return DWFL_E_LIBELF;
    375 	if (phdr.p_type == PT_INTERP)
    376 	  {
    377 	    main_interp = phdr.p_vaddr;
    378 	    break;
    379 	  }
    380       }
    381   }
    382 
    383   src.d_buf += src.d_size;
    384   src.d_type = ELF_T_PHDR;
    385   src.d_size = phnum * phentsize;
    386 
    387   GElf_Addr undo_interp = 0;
    388   bool class32 = ehdr.e32.e_ident[EI_CLASS] == ELFCLASS32;
    389   {
    390     size_t phdr_size = class32 ? sizeof (Elf32_Phdr) : sizeof (Elf64_Phdr);
    391     if (unlikely (phnum > SIZE_MAX / phdr_size))
    392       return DWFL_E_NOMEM;
    393     const size_t phdrs_bytes = phnum * phdr_size;
    394     void *phdrs = malloc (phdrs_bytes);
    395     if (unlikely (phdrs == NULL))
    396       return DWFL_E_NOMEM;
    397     dst.d_buf = phdrs;
    398     dst.d_size = phdrs_bytes;
    399     if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
    400 				 ehdr.e32.e_ident[EI_DATA]) == NULL))
    401       {
    402 	free (phdrs);
    403 	return DWFL_E_LIBELF;
    404       }
    405     if (class32)
    406       {
    407 	Elf32_Phdr (*p32)[phnum] = phdrs;
    408 	for (uint_fast16_t i = 0; i < phnum; ++i)
    409 	  if ((*p32)[i].p_type == PT_INTERP)
    410 	    {
    411 	      undo_interp = (*p32)[i].p_vaddr;
    412 	      break;
    413 	    }
    414       }
    415     else
    416       {
    417 	Elf64_Phdr (*p64)[phnum] = phdrs;
    418 	for (uint_fast16_t i = 0; i < phnum; ++i)
    419 	  if ((*p64)[i].p_type == PT_INTERP)
    420 	    {
    421 	      undo_interp = (*p64)[i].p_vaddr;
    422 	      break;
    423 	    }
    424       }
    425     free (phdrs);
    426   }
    427 
    428   if (unlikely ((main_interp == 0) != (undo_interp == 0)))
    429     return DWFL_E_BAD_PRELINK;
    430 
    431   src.d_buf += src.d_size;
    432   src.d_type = ELF_T_SHDR;
    433   src.d_size = gelf_fsize (mod->main.elf, ELF_T_SHDR, shnum - 1, EV_CURRENT);
    434 
    435   size_t shdr_size = class32 ? sizeof (Elf32_Shdr) : sizeof (Elf64_Shdr);
    436   if (unlikely (shnum - 1  > SIZE_MAX / shdr_size))
    437     return DWFL_E_NOMEM;
    438   const size_t shdrs_bytes = (shnum - 1) * shdr_size;
    439   void *shdrs = malloc (shdrs_bytes);
    440   if (unlikely (shdrs == NULL))
    441     return DWFL_E_NOMEM;
    442   dst.d_buf = shdrs;
    443   dst.d_size = shdrs_bytes;
    444   if (unlikely (gelf_xlatetom (mod->main.elf, &dst, &src,
    445 			       ehdr.e32.e_ident[EI_DATA]) == NULL))
    446     {
    447       free (shdrs);
    448       return DWFL_E_LIBELF;
    449     }
    450 
    451   /* Now we can look at the original section headers of the main file
    452      before it was prelinked.  First we'll apply our method to the main
    453      file sections as they are after prelinking, to calculate the
    454      synchronization address of the main file.  Then we'll apply that
    455      same method to the saved section headers, to calculate the matching
    456      synchronization address of the debug file.
    457 
    458      The method is to consider SHF_ALLOC sections that are either
    459      SHT_PROGBITS or SHT_NOBITS, excluding the section whose sh_addr
    460      matches the PT_INTERP p_vaddr.  The special sections that can be
    461      moved by prelink have other types, except for .interp (which
    462      becomes PT_INTERP).  The "real" sections cannot move as such, but
    463      .bss can be split into .dynbss and .bss, with the total memory
    464      image remaining the same but being spread across the two sections.
    465      So we consider the highest section end, which still matches up.  */
    466 
    467   GElf_Addr highest;
    468 
    469   highest = 0;
    470   scn = NULL;
    471   while ((scn = elf_nextscn (mod->main.elf, scn)) != NULL)
    472     {
    473       GElf_Shdr sh_mem;
    474       GElf_Shdr *sh = gelf_getshdr (scn, &sh_mem);
    475       if (unlikely (sh == NULL))
    476 	{
    477 	  free (shdrs);
    478 	  return DWFL_E_LIBELF;
    479 	}
    480       consider_shdr (main_interp, sh->sh_type, sh->sh_flags,
    481 		     sh->sh_addr, sh->sh_size, &highest);
    482     }
    483   if (highest > mod->main.vaddr)
    484     {
    485       mod->main.address_sync = highest;
    486 
    487       highest = 0;
    488       if (class32)
    489 	{
    490 	  Elf32_Shdr (*s32)[shnum - 1] = shdrs;
    491 	  for (size_t i = 0; i < shnum - 1; ++i)
    492 	    consider_shdr (undo_interp, (*s32)[i].sh_type,
    493 			   (*s32)[i].sh_flags, (*s32)[i].sh_addr,
    494 			   (*s32)[i].sh_size, &highest);
    495 	}
    496       else
    497 	{
    498 	  Elf64_Shdr (*s64)[shnum - 1] = shdrs;
    499 	  for (size_t i = 0; i < shnum - 1; ++i)
    500 	    consider_shdr (undo_interp, (*s64)[i].sh_type,
    501 			   (*s64)[i].sh_flags, (*s64)[i].sh_addr,
    502 			   (*s64)[i].sh_size, &highest);
    503 	}
    504 
    505       if (highest > file->vaddr)
    506 	file->address_sync = highest;
    507       else
    508 	{
    509 	  free (shdrs);
    510 	  return DWFL_E_BAD_PRELINK;
    511 	}
    512     }
    513 
    514   free (shdrs);
    515 
    516   return DWFL_E_NOERROR;
    517 }
    518 
    519 /* Find the separate debuginfo file for this module and open libelf on it.
    520    When we return success, MOD->debug is set up.  */
    521 static Dwfl_Error
    522 find_debuginfo (Dwfl_Module *mod)
    523 {
    524   if (mod->debug.elf != NULL)
    525     return DWFL_E_NOERROR;
    526 
    527   GElf_Word debuglink_crc = 0;
    528   const char *debuglink_file;
    529   debuglink_file = INTUSE(dwelf_elf_gnu_debuglink) (mod->main.elf,
    530 						    &debuglink_crc);
    531 
    532   mod->debug.fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
    533 							   mod->main.name,
    534 							   debuglink_file,
    535 							   debuglink_crc,
    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);
    540   return result;
    541 }
    542 
    543 /* Try to find the alternative debug link for the given DWARF and set
    544    it if found.  Only called when mod->dw is already setup but still
    545    might need an alternative (dwz multi) debug file.  filename is either
    546    the main or debug name from which the Dwarf was created. */
    547 static void
    548 find_debug_altlink (Dwfl_Module *mod, const char *filename)
    549 {
    550   assert (mod->dw != NULL);
    551 
    552   const char *altname;
    553   const void *build_id;
    554   ssize_t build_id_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw,
    555 							       &altname,
    556 							       &build_id);
    557 
    558   if (build_id_len > 0)
    559     {
    560       /* We could store altfile in the module, but don't really need it.  */
    561       char *altfile = NULL;
    562       mod->alt_fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
    563 							     filename,
    564 							     altname,
    565 							     0,
    566 							     &altfile);
    567 
    568       /* The (internal) callbacks might just set mod->alt_elf directly
    569 	 because they open the Elf anyway for sanity checking.
    570 	 Otherwise open either the given file name or use the fd
    571 	 returned.  */
    572       Dwfl_Error error = open_elf_file (&mod->alt_elf, &mod->alt_fd,
    573 					&altfile);
    574       if (error == DWFL_E_NOERROR)
    575 	{
    576 	  mod->alt = INTUSE(dwarf_begin_elf) (mod->alt_elf,
    577 					      DWARF_C_READ, NULL);
    578 	  if (mod->alt == NULL)
    579 	    {
    580 	      elf_end (mod->alt_elf);
    581 	      mod->alt_elf = NULL;
    582 	      close (mod->alt_fd);
    583 	      mod->alt_fd = -1;
    584 	    }
    585 	  else
    586 	    dwarf_setalt (mod->dw, mod->alt);
    587 	}
    588 
    589       free (altfile); /* See above, we don't really need it.  */
    590     }
    591 }
    592 
    593 /* Try to find a symbol table in FILE.
    594    Returns DWFL_E_NOERROR if a proper one is found.
    595    Returns DWFL_E_NO_SYMTAB if not, but still sets results for SHT_DYNSYM.  */
    596 static Dwfl_Error
    597 load_symtab (struct dwfl_file *file, struct dwfl_file **symfile,
    598 	     Elf_Scn **symscn, Elf_Scn **xndxscn,
    599 	     size_t *syments, int *first_global, GElf_Word *strshndx)
    600 {
    601   bool symtab = false;
    602   Elf_Scn *scn = NULL;
    603   while ((scn = elf_nextscn (file->elf, scn)) != NULL)
    604     {
    605       GElf_Shdr shdr_mem, *shdr = gelf_getshdr (scn, &shdr_mem);
    606       if (shdr != NULL)
    607 	switch (shdr->sh_type)
    608 	  {
    609 	  case SHT_SYMTAB:
    610 	    if (shdr->sh_entsize == 0)
    611 	      break;
    612 	    symtab = true;
    613 	    *symscn = scn;
    614 	    *symfile = file;
    615 	    *strshndx = shdr->sh_link;
    616 	    *syments = shdr->sh_size / shdr->sh_entsize;
    617 	    *first_global = shdr->sh_info;
    618 	    if (*xndxscn != NULL)
    619 	      return DWFL_E_NOERROR;
    620 	    break;
    621 
    622 	  case SHT_DYNSYM:
    623 	    if (symtab)
    624 	      break;
    625 	    /* Use this if need be, but keep looking for SHT_SYMTAB.  */
    626 	    if (shdr->sh_entsize == 0)
    627 	      break;
    628 	    *symscn = scn;
    629 	    *symfile = file;
    630 	    *strshndx = shdr->sh_link;
    631 	    *syments = shdr->sh_size / shdr->sh_entsize;
    632 	    *first_global = shdr->sh_info;
    633 	    break;
    634 
    635 	  case SHT_SYMTAB_SHNDX:
    636 	    *xndxscn = scn;
    637 	    if (symtab)
    638 	      return DWFL_E_NOERROR;
    639 	    break;
    640 
    641 	  default:
    642 	    break;
    643 	  }
    644     }
    645 
    646   if (symtab)
    647     /* We found one, though no SHT_SYMTAB_SHNDX to go with it.  */
    648     return DWFL_E_NOERROR;
    649 
    650   /* We found no SHT_SYMTAB, so any SHT_SYMTAB_SHNDX was bogus.
    651      We might have found an SHT_DYNSYM and set *SYMSCN et al though.  */
    652   *xndxscn = NULL;
    653   return DWFL_E_NO_SYMTAB;
    654 }
    655 
    656 
    657 /* Translate addresses into file offsets.
    658    OFFS[*] start out zero and remain zero if unresolved.  */
    659 static void
    660 find_offsets (Elf *elf, GElf_Addr main_bias, size_t phnum, size_t n,
    661 	      GElf_Addr addrs[n], GElf_Off offs[n])
    662 {
    663   size_t unsolved = n;
    664   for (size_t i = 0; i < phnum; ++i)
    665     {
    666       GElf_Phdr phdr_mem;
    667       GElf_Phdr *phdr = gelf_getphdr (elf, i, &phdr_mem);
    668       if (phdr != NULL && phdr->p_type == PT_LOAD && phdr->p_memsz > 0)
    669 	for (size_t j = 0; j < n; ++j)
    670 	  if (offs[j] == 0
    671 	      && addrs[j] >= phdr->p_vaddr + main_bias
    672 	      && addrs[j] - (phdr->p_vaddr + main_bias) < phdr->p_filesz)
    673 	    {
    674 	      offs[j] = addrs[j] - (phdr->p_vaddr + main_bias) + phdr->p_offset;
    675 	      if (--unsolved == 0)
    676 		break;
    677 	    }
    678     }
    679 }
    680 
    681 /* Various addresses we might want to pull from the dynamic segment.  */
    682 enum
    683 {
    684   i_symtab,
    685   i_strtab,
    686   i_hash,
    687   i_gnu_hash,
    688   i_max
    689 };
    690 
    691 /* Translate pointers into file offsets.  ADJUST is either zero
    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
    694    symbol table.  */
    695 static void
    696 translate_offs (GElf_Addr adjust,
    697                 Dwfl_Module *mod, size_t phnum,
    698                 GElf_Addr addrs[i_max], GElf_Xword strsz,
    699                 GElf_Ehdr *ehdr)
    700 {
    701   GElf_Off offs[i_max] = { 0, };
    702   find_offsets (mod->main.elf, adjust, phnum, i_max, addrs, offs);
    703 
    704   /* Figure out the size of the symbol table.  */
    705   if (offs[i_hash] != 0)
    706     {
    707       /* In the original format, .hash says the size of .dynsym.  */
    708 
    709       size_t entsz = SH_ENTSIZE_HASH (ehdr);
    710       Elf_Data *data = elf_getdata_rawchunk (mod->main.elf,
    711 					     offs[i_hash] + entsz, entsz,
    712 					     (entsz == 4
    713 					      ? ELF_T_WORD : ELF_T_XWORD));
    714       if (data != NULL)
    715 	mod->syments = (entsz == 4
    716 			? *(const GElf_Word *) data->d_buf
    717 			: *(const GElf_Xword *) data->d_buf);
    718     }
    719   if (offs[i_gnu_hash] != 0 && mod->syments == 0)
    720     {
    721       /* In the new format, we can derive it with some work.  */
    722 
    723       const struct
    724       {
    725         Elf32_Word nbuckets;
    726         Elf32_Word symndx;
    727         Elf32_Word maskwords;
    728         Elf32_Word shift2;
    729       } *header;
    730 
    731       Elf_Data *data = elf_getdata_rawchunk (mod->main.elf, offs[i_gnu_hash],
    732 					     sizeof *header, ELF_T_WORD);
    733       if (data != NULL)
    734         {
    735           header = data->d_buf;
    736           Elf32_Word nbuckets = header->nbuckets;
    737           Elf32_Word symndx = header->symndx;
    738           GElf_Off buckets_at = (offs[i_gnu_hash] + sizeof *header
    739 				 + (gelf_getclass (mod->main.elf)
    740 				    * sizeof (Elf32_Word)
    741 				    * header->maskwords));
    742 
    743           // elf_getdata_rawchunk takes a size_t, make sure it
    744           // doesn't overflow.
    745 #if SIZE_MAX <= UINT32_MAX
    746           if (nbuckets > SIZE_MAX / sizeof (Elf32_Word))
    747             data = NULL;
    748           else
    749 #endif
    750             data = elf_getdata_rawchunk (mod->main.elf, buckets_at,
    751 					   nbuckets * sizeof (Elf32_Word),
    752 					   ELF_T_WORD);
    753 	  if (data != NULL && symndx < nbuckets)
    754 	    {
    755 	      const Elf32_Word *const buckets = data->d_buf;
    756 	      Elf32_Word maxndx = symndx;
    757 	      for (Elf32_Word bucket = 0; bucket < nbuckets; ++bucket)
    758 		if (buckets[bucket] > maxndx)
    759 		  maxndx = buckets[bucket];
    760 
    761 	      GElf_Off hasharr_at = (buckets_at
    762 				     + nbuckets * sizeof (Elf32_Word));
    763 	      hasharr_at += (maxndx - symndx) * sizeof (Elf32_Word);
    764 	      do
    765 		{
    766 		  data = elf_getdata_rawchunk (mod->main.elf,
    767 					       hasharr_at,
    768 					       sizeof (Elf32_Word),
    769 					       ELF_T_WORD);
    770 		  if (data != NULL
    771 		      && (*(const Elf32_Word *) data->d_buf & 1u))
    772 		    {
    773 		      mod->syments = maxndx + 1;
    774 		      break;
    775 		    }
    776 		  ++maxndx;
    777 		  hasharr_at += sizeof (Elf32_Word);
    778 		}
    779 	      while (data != NULL);
    780 	    }
    781 	}
    782     }
    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,
    786 				  ELF_T_SYM, 1, EV_CURRENT));
    787 
    788   if (mod->syments > 0)
    789     {
    790       mod->symdata = elf_getdata_rawchunk (mod->main.elf,
    791 					   offs[i_symtab],
    792 					   gelf_fsize (mod->main.elf,
    793 						       ELF_T_SYM,
    794 						       mod->syments,
    795 						       EV_CURRENT),
    796 						       ELF_T_SYM);
    797       if (mod->symdata != NULL)
    798 	{
    799 	  mod->symstrdata = elf_getdata_rawchunk (mod->main.elf,
    800 						  offs[i_strtab],
    801 						  strsz,
    802 						  ELF_T_BYTE);
    803 	  if (mod->symstrdata == NULL)
    804 	    mod->symdata = NULL;
    805 	}
    806       if (mod->symdata == NULL)
    807 	mod->symerr = DWFL_E (LIBELF, elf_errno ());
    808       else
    809 	{
    810 	  mod->symfile = &mod->main;
    811 	  mod->symerr = DWFL_E_NOERROR;
    812 	}
    813     }
    814 }
    815 
    816 /* Try to find a dynamic symbol table via phdrs.  */
    817 static void
    818 find_dynsym (Dwfl_Module *mod)
    819 {
    820   GElf_Ehdr ehdr_mem;
    821   GElf_Ehdr *ehdr = gelf_getehdr (mod->main.elf, &ehdr_mem);
    822 
    823   size_t phnum;
    824   if (unlikely (elf_getphdrnum (mod->main.elf, &phnum) != 0))
    825     return;
    826 
    827   for (size_t i = 0; i < phnum; ++i)
    828     {
    829       GElf_Phdr phdr_mem;
    830       GElf_Phdr *phdr = gelf_getphdr (mod->main.elf, i, &phdr_mem);
    831       if (phdr == NULL)
    832 	break;
    833 
    834       if (phdr->p_type == PT_DYNAMIC)
    835 	{
    836 	  /* Examine the dynamic section for the pointers we need.  */
    837 
    838 	  Elf_Data *data = elf_getdata_rawchunk (mod->main.elf,
    839 						 phdr->p_offset, phdr->p_filesz,
    840 						 ELF_T_DYN);
    841 	  if (data == NULL)
    842 	    continue;
    843 
    844 	  GElf_Addr addrs[i_max] = { 0, };
    845 	  GElf_Xword strsz = 0;
    846 	  size_t n = data->d_size / gelf_fsize (mod->main.elf,
    847 						ELF_T_DYN, 1, EV_CURRENT);
    848 	  for (size_t j = 0; j < n; ++j)
    849 	    {
    850 	      GElf_Dyn dyn_mem;
    851 	      GElf_Dyn *dyn = gelf_getdyn (data, j, &dyn_mem);
    852 	      if (dyn != NULL)
    853 		switch (dyn->d_tag)
    854 		  {
    855 		  case DT_SYMTAB:
    856 		    addrs[i_symtab] = dyn->d_un.d_ptr;
    857 		    continue;
    858 
    859 		  case DT_HASH:
    860 		    addrs[i_hash] = dyn->d_un.d_ptr;
    861 		    continue;
    862 
    863 		  case DT_GNU_HASH:
    864 		    addrs[i_gnu_hash] = dyn->d_un.d_ptr;
    865 		    continue;
    866 
    867 		  case DT_STRTAB:
    868 		    addrs[i_strtab] = dyn->d_un.d_ptr;
    869 		    continue;
    870 
    871 		  case DT_STRSZ:
    872 		    strsz = dyn->d_un.d_val;
    873 		    continue;
    874 
    875 		  default:
    876 		    continue;
    877 
    878 		  case DT_NULL:
    879 		    break;
    880 		  }
    881 	      break;
    882 	    }
    883 
    884 	  /* First try unadjusted, like ELF files from disk, vdso.
    885 	     Then try for already adjusted dynamic section, like ELF
    886 	     from remote memory.  */
    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);
    890 
    891 	  return;
    892 	}
    893     }
    894 }
    895 
    896 
    897 #if USE_LZMA
    898 /* Try to find the offset between the main file and .gnu_debugdata.  */
    899 static bool
    900 find_aux_address_sync (Dwfl_Module *mod)
    901 {
    902   /* Don't trust the phdrs in the minisymtab elf file to be setup correctly.
    903      The address_sync is equal to the main file it is embedded in at first.  */
    904   mod->aux_sym.address_sync = mod->main.address_sync;
    905 
    906   /* Adjust address_sync for the difference in entry addresses, attempting to
    907      account for ELF relocation changes after aux was split.  */
    908   GElf_Ehdr ehdr_main, ehdr_aux;
    909   if (unlikely (gelf_getehdr (mod->main.elf, &ehdr_main) == NULL)
    910       || unlikely (gelf_getehdr (mod->aux_sym.elf, &ehdr_aux) == NULL))
    911     return false;
    912   mod->aux_sym.address_sync += ehdr_aux.e_entry - ehdr_main.e_entry;
    913 
    914   /* The shdrs are setup OK to make find_prelink_address_sync () do the right
    915      thing, which is possibly more reliable, but it needs .gnu.prelink_undo.  */
    916   if (mod->aux_sym.address_sync != 0)
    917     return find_prelink_address_sync (mod, &mod->aux_sym) == DWFL_E_NOERROR;
    918 
    919   return true;
    920 }
    921 #endif
    922 
    923 /* Try to find the auxiliary symbol table embedded in the main elf file
    924    section .gnu_debugdata.  Only matters if the symbol information comes
    925    from the main file dynsym.  No harm done if not found.  */
    926 static void
    927 find_aux_sym (Dwfl_Module *mod __attribute__ ((unused)),
    928 	      Elf_Scn **aux_symscn __attribute__ ((unused)),
    929 	      Elf_Scn **aux_xndxscn __attribute__ ((unused)),
    930 	      GElf_Word *aux_strshndx __attribute__ ((unused)))
    931 {
    932   /* Since a .gnu_debugdata section is compressed using lzma don't do
    933      anything unless we have support for that.  */
    934 #if USE_LZMA
    935   Elf *elf = mod->main.elf;
    936 
    937   size_t shstrndx;
    938   if (elf_getshdrstrndx (elf, &shstrndx) < 0)
    939     return;
    940 
    941   Elf_Scn *scn = NULL;
    942   while ((scn = elf_nextscn (elf, scn)) != NULL)
    943     {
    944       GElf_Shdr shdr_mem;
    945       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
    946       if (shdr == NULL)
    947 	return;
    948 
    949       const char *name = elf_strptr (elf, shstrndx, shdr->sh_name);
    950       if (name == NULL)
    951 	return;
    952 
    953       if (!strcmp (name, ".gnu_debugdata"))
    954 	break;
    955     }
    956 
    957   if (scn == NULL)
    958     return;
    959 
    960   /* Found the .gnu_debugdata section.  Uncompress the lzma image and
    961      turn it into an ELF image.  */
    962   Elf_Data *rawdata = elf_rawdata (scn, NULL);
    963   if (rawdata == NULL)
    964     return;
    965 
    966   Dwfl_Error error;
    967   void *buffer = NULL;
    968   size_t size = 0;
    969   error = __libdw_unlzma (-1, 0, rawdata->d_buf, rawdata->d_size,
    970 			  &buffer, &size);
    971   if (error == DWFL_E_NOERROR)
    972     {
    973       if (unlikely (size == 0))
    974 	free (buffer);
    975       else
    976 	{
    977 	  mod->aux_sym.elf = elf_memory (buffer, size);
    978 	  if (mod->aux_sym.elf == NULL)
    979 	    free (buffer);
    980 	  else
    981 	    {
    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)
    985 		return;
    986 	      if (! find_aux_address_sync (mod))
    987 		{
    988 		  elf_end (mod->aux_sym.elf);
    989 		  mod->aux_sym.elf = NULL;
    990 		  return;
    991 		}
    992 
    993 	      /* So far, so good. Get minisymtab table data and cache it. */
    994 	      bool minisymtab = false;
    995 	      scn = NULL;
    996 	      while ((scn = elf_nextscn (mod->aux_sym.elf, scn)) != NULL)
    997 		{
    998 		  GElf_Shdr shdr_mem, *shdr = gelf_getshdr (scn, &shdr_mem);
    999 		  if (shdr != NULL)
   1000 		    switch (shdr->sh_type)
   1001 		      {
   1002 		      case SHT_SYMTAB:
   1003 			minisymtab = true;
   1004 			*aux_symscn = scn;
   1005 			*aux_strshndx = shdr->sh_link;
   1006 			mod->aux_syments = shdr->sh_size / shdr->sh_entsize;
   1007 			mod->aux_first_global = shdr->sh_info;
   1008 			if (*aux_xndxscn != NULL)
   1009 			  return;
   1010 			break;
   1011 
   1012 		      case SHT_SYMTAB_SHNDX:
   1013 			*aux_xndxscn = scn;
   1014 			if (minisymtab)
   1015 			  return;
   1016 			break;
   1017 
   1018 		      default:
   1019 			break;
   1020 		      }
   1021 		}
   1022 
   1023 	      if (minisymtab)
   1024 		/* We found one, though no SHT_SYMTAB_SHNDX to go with it.  */
   1025 		return;
   1026 
   1027 	      /* We found no SHT_SYMTAB, so everything else is bogus.  */
   1028 	      *aux_xndxscn = NULL;
   1029 	      *aux_strshndx = 0;
   1030 	      mod->aux_syments = 0;
   1031 	      elf_end (mod->aux_sym.elf);
   1032 	      mod->aux_sym.elf = NULL;
   1033 	      return;
   1034 	    }
   1035 	}
   1036     }
   1037   else
   1038     free (buffer);
   1039 #endif
   1040 }
   1041 
   1042 /* Try to find a symbol table in either MOD->main.elf or MOD->debug.elf.  */
   1043 static void
   1044 find_symtab (Dwfl_Module *mod)
   1045 {
   1046   if (mod->symdata != NULL || mod->aux_symdata != NULL	/* Already done.  */
   1047       || mod->symerr != DWFL_E_NOERROR) /* Cached previous failure.  */
   1048     return;
   1049 
   1050   __libdwfl_getelf (mod);
   1051   mod->symerr = mod->elferr;
   1052   if (mod->symerr != DWFL_E_NOERROR)
   1053     return;
   1054 
   1055   /* First see if the main ELF file has the debugging information.  */
   1056   Elf_Scn *symscn = NULL, *xndxscn = NULL;
   1057   Elf_Scn *aux_symscn = NULL, *aux_xndxscn = NULL;
   1058   GElf_Word strshndx, aux_strshndx = 0;
   1059   mod->symerr = load_symtab (&mod->main, &mod->symfile, &symscn,
   1060 			     &xndxscn, &mod->syments, &mod->first_global,
   1061 			     &strshndx);
   1062   switch (mod->symerr)
   1063     {
   1064     default:
   1065       return;
   1066 
   1067     case DWFL_E_NOERROR:
   1068       break;
   1069 
   1070     case DWFL_E_NO_SYMTAB:
   1071       /* Now we have to look for a separate debuginfo file.  */
   1072       mod->symerr = find_debuginfo (mod);
   1073       switch (mod->symerr)
   1074 	{
   1075 	default:
   1076 	  return;
   1077 
   1078 	case DWFL_E_NOERROR:
   1079 	  mod->symerr = load_symtab (&mod->debug, &mod->symfile, &symscn,
   1080 				     &xndxscn, &mod->syments,
   1081 				     &mod->first_global, &strshndx);
   1082 	  break;
   1083 
   1084 	case DWFL_E_CB:		/* The find_debuginfo hook failed.  */
   1085 	  mod->symerr = DWFL_E_NO_SYMTAB;
   1086 	  break;
   1087 	}
   1088 
   1089       switch (mod->symerr)
   1090 	{
   1091 	default:
   1092 	  return;
   1093 
   1094 	case DWFL_E_NOERROR:
   1095 	  break;
   1096 
   1097 	case DWFL_E_NO_SYMTAB:
   1098 	  /* There might be an auxiliary table.  */
   1099 	  find_aux_sym (mod, &aux_symscn, &aux_xndxscn, &aux_strshndx);
   1100 
   1101 	  if (symscn != NULL)
   1102 	    {
   1103 	      /* We still have the dynamic symbol table.  */
   1104 	      mod->symerr = DWFL_E_NOERROR;
   1105 	      break;
   1106 	    }
   1107 
   1108 	  if (aux_symscn != NULL)
   1109 	    {
   1110 	      /* We still have the auxiliary symbol table.  */
   1111 	      mod->symerr = DWFL_E_NOERROR;
   1112 	      goto aux_cache;
   1113 	    }
   1114 
   1115 	  /* Last ditch, look for dynamic symbols without section headers.  */
   1116 	  find_dynsym (mod);
   1117 	  return;
   1118 	}
   1119       break;
   1120     }
   1121 
   1122   /* This does some sanity checks on the string table section.  */
   1123   if (elf_strptr (mod->symfile->elf, strshndx, 0) == NULL)
   1124     {
   1125     elferr:
   1126       mod->symdata = NULL;
   1127       mod->syments = 0;
   1128       mod->first_global = 0;
   1129       mod->symerr = DWFL_E (LIBELF, elf_errno ());
   1130       goto aux_cleanup; /* This cleans up some more and tries find_dynsym.  */
   1131     }
   1132 
   1133   /* Cache the data; MOD->syments and MOD->first_global were set
   1134      above.  If any of the sections is compressed, uncompress it
   1135      first.  Only the string data setion could theoretically be
   1136      compressed GNU style (as .zdebug_str).  Everything else only ELF
   1137      gabi style (SHF_COMPRESSED).  */
   1138 
   1139   Elf_Scn *symstrscn = elf_getscn (mod->symfile->elf, strshndx);
   1140   if (symstrscn == NULL)
   1141     goto elferr;
   1142 
   1143   GElf_Shdr shdr_mem;
   1144   GElf_Shdr *shdr = gelf_getshdr (symstrscn, &shdr_mem);
   1145   if (shdr == NULL)
   1146     goto elferr;
   1147 
   1148   size_t shstrndx;
   1149   if (elf_getshdrstrndx (mod->symfile->elf, &shstrndx) < 0)
   1150     goto elferr;
   1151 
   1152   const char *sname = elf_strptr (mod->symfile->elf, shstrndx, shdr->sh_name);
   1153   if (sname == NULL)
   1154     goto elferr;
   1155 
   1156   if (strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
   1157     /* Try to uncompress, but it might already have been, an error
   1158        might just indicate, already uncompressed.  */
   1159     elf_compress_gnu (symstrscn, 0, 0);
   1160 
   1161   if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
   1162     if (elf_compress (symstrscn, 0, 0) < 0)
   1163       goto elferr;
   1164 
   1165   mod->symstrdata = elf_getdata (symstrscn, NULL);
   1166   if (mod->symstrdata == NULL || mod->symstrdata->d_buf == NULL)
   1167     goto elferr;
   1168 
   1169   if (xndxscn == NULL)
   1170     mod->symxndxdata = NULL;
   1171   else
   1172     {
   1173       shdr = gelf_getshdr (xndxscn, &shdr_mem);
   1174       if (shdr == NULL)
   1175 	goto elferr;
   1176 
   1177       if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
   1178 	if (elf_compress (xndxscn, 0, 0) < 0)
   1179 	  goto elferr;
   1180 
   1181       mod->symxndxdata = elf_getdata (xndxscn, NULL);
   1182       if (mod->symxndxdata == NULL || mod->symxndxdata->d_buf == NULL)
   1183 	goto elferr;
   1184     }
   1185 
   1186   shdr = gelf_getshdr (symscn, &shdr_mem);
   1187   if (shdr == NULL)
   1188     goto elferr;
   1189 
   1190   if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
   1191     if (elf_compress (symscn, 0, 0) < 0)
   1192       goto elferr;
   1193 
   1194   mod->symdata = elf_getdata (symscn, NULL);
   1195   if (mod->symdata == NULL || mod->symdata->d_buf == NULL)
   1196     goto elferr;
   1197 
   1198   // Sanity check number of symbols.
   1199   shdr = gelf_getshdr (symscn, &shdr_mem);
   1200   if (shdr == NULL || shdr->sh_entsize == 0
   1201       || mod->syments > mod->symdata->d_size / shdr->sh_entsize
   1202       || (size_t) mod->first_global > mod->syments)
   1203     goto elferr;
   1204 
   1205   /* Cache any auxiliary symbol info, when it fails, just ignore aux_sym.  */
   1206   if (aux_symscn != NULL)
   1207     {
   1208   aux_cache:
   1209       /* This does some sanity checks on the string table section.  */
   1210       if (elf_strptr (mod->aux_sym.elf, aux_strshndx, 0) == NULL)
   1211 	{
   1212 	aux_cleanup:
   1213 	  mod->aux_syments = 0;
   1214 	  elf_end (mod->aux_sym.elf);
   1215 	  mod->aux_sym.elf = NULL;
   1216 	  /* We thought we had something through shdrs, but it failed...
   1217 	     Last ditch, look for dynamic symbols without section headers.  */
   1218 	  find_dynsym (mod);
   1219 	  return;
   1220 	}
   1221 
   1222       Elf_Scn *aux_strscn = elf_getscn (mod->aux_sym.elf, aux_strshndx);
   1223       if (aux_strscn == NULL)
   1224 	goto elferr;
   1225 
   1226       shdr = gelf_getshdr (aux_strscn, &shdr_mem);
   1227       if (shdr == NULL)
   1228 	goto elferr;
   1229 
   1230       size_t aux_shstrndx;
   1231       if (elf_getshdrstrndx (mod->aux_sym.elf, &aux_shstrndx) < 0)
   1232 	goto elferr;
   1233 
   1234       sname = elf_strptr (mod->aux_sym.elf, aux_shstrndx,
   1235 				      shdr->sh_name);
   1236       if (sname == NULL)
   1237 	goto elferr;
   1238 
   1239       if (strncmp (sname, ".zdebug", strlen (".zdebug")) == 0)
   1240 	/* Try to uncompress, but it might already have been, an error
   1241 	   might just indicate, already uncompressed.  */
   1242 	elf_compress_gnu (aux_strscn, 0, 0);
   1243 
   1244       if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
   1245 	if (elf_compress (aux_strscn, 0, 0) < 0)
   1246 	  goto elferr;
   1247 
   1248       mod->aux_symstrdata = elf_getdata (aux_strscn, NULL);
   1249       if (mod->aux_symstrdata == NULL || mod->aux_symstrdata->d_buf == NULL)
   1250 	goto aux_cleanup;
   1251 
   1252       if (aux_xndxscn == NULL)
   1253 	mod->aux_symxndxdata = NULL;
   1254       else
   1255 	{
   1256 	  shdr = gelf_getshdr (aux_xndxscn, &shdr_mem);
   1257 	  if (shdr == NULL)
   1258 	    goto elferr;
   1259 
   1260 	  if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
   1261 	    if (elf_compress (aux_xndxscn, 0, 0) < 0)
   1262 	      goto elferr;
   1263 
   1264 	  mod->aux_symxndxdata = elf_getdata (aux_xndxscn, NULL);
   1265 	  if (mod->aux_symxndxdata == NULL
   1266 	      || mod->aux_symxndxdata->d_buf == NULL)
   1267 	    goto aux_cleanup;
   1268 	}
   1269 
   1270       shdr = gelf_getshdr (aux_symscn, &shdr_mem);
   1271       if (shdr == NULL)
   1272 	goto elferr;
   1273 
   1274       if ((shdr->sh_flags & SHF_COMPRESSED) != 0)
   1275 	if (elf_compress (aux_symscn, 0, 0) < 0)
   1276 	  goto elferr;
   1277 
   1278       mod->aux_symdata = elf_getdata (aux_symscn, NULL);
   1279       if (mod->aux_symdata == NULL || mod->aux_symdata->d_buf == NULL)
   1280 	goto aux_cleanup;
   1281 
   1282       // Sanity check number of aux symbols.
   1283       shdr = gelf_getshdr (aux_symscn, &shdr_mem);
   1284       if (mod->aux_syments > mod->aux_symdata->d_size / shdr->sh_entsize
   1285 	  || (size_t) mod->aux_first_global > mod->aux_syments)
   1286 	goto aux_cleanup;
   1287     }
   1288 }
   1289 
   1290 
   1291 /* Try to open a libebl backend for MOD.  */
   1292 Dwfl_Error
   1293 internal_function
   1294 __libdwfl_module_getebl (Dwfl_Module *mod)
   1295 {
   1296   if (mod->ebl == NULL)
   1297     {
   1298       __libdwfl_getelf (mod);
   1299       if (mod->elferr != DWFL_E_NOERROR)
   1300 	return mod->elferr;
   1301 
   1302       mod->ebl = ebl_openbackend (mod->main.elf);
   1303       if (mod->ebl == NULL)
   1304 	return DWFL_E_LIBEBL;
   1305     }
   1306   return DWFL_E_NOERROR;
   1307 }
   1308 
   1309 /* Try to start up libdw on DEBUGFILE.  */
   1310 static Dwfl_Error
   1311 load_dw (Dwfl_Module *mod, struct dwfl_file *debugfile)
   1312 {
   1313   if (mod->e_type == ET_REL && !debugfile->relocated)
   1314     {
   1315       const Dwfl_Callbacks *const cb = mod->dwfl->callbacks;
   1316 
   1317       /* The debugging sections have to be relocated.  */
   1318       if (cb->section_address == NULL)
   1319 	return DWFL_E_NOREL;
   1320 
   1321       Dwfl_Error error = __libdwfl_module_getebl (mod);
   1322       if (error != DWFL_E_NOERROR)
   1323 	return error;
   1324 
   1325       find_symtab (mod);
   1326       Dwfl_Error result = mod->symerr;
   1327       if (result == DWFL_E_NOERROR)
   1328 	result = __libdwfl_relocate (mod, debugfile->elf, true);
   1329       if (result != DWFL_E_NOERROR)
   1330 	return result;
   1331 
   1332       /* Don't keep the file descriptors around.  */
   1333       if (mod->main.fd != -1 && elf_cntl (mod->main.elf, ELF_C_FDREAD) == 0)
   1334 	{
   1335 	  close (mod->main.fd);
   1336 	  mod->main.fd = -1;
   1337 	}
   1338       if (debugfile->fd != -1 && elf_cntl (debugfile->elf, ELF_C_FDREAD) == 0)
   1339 	{
   1340 	  close (debugfile->fd);
   1341 	  debugfile->fd = -1;
   1342 	}
   1343     }
   1344 
   1345   mod->dw = INTUSE(dwarf_begin_elf) (debugfile->elf, DWARF_C_READ, NULL);
   1346   if (mod->dw == NULL)
   1347     {
   1348       int err = INTUSE(dwarf_errno) ();
   1349       return err == DWARF_E_NO_DWARF ? DWFL_E_NO_DWARF : DWFL_E (LIBDW, err);
   1350     }
   1351 
   1352   /* Until we have iterated through all CU's, we might do lazy lookups.  */
   1353   mod->lazycu = 1;
   1354 
   1355   return DWFL_E_NOERROR;
   1356 }
   1357 
   1358 /* Try to start up libdw on either the main file or the debuginfo file.  */
   1359 static void
   1360 find_dw (Dwfl_Module *mod)
   1361 {
   1362   if (mod->dw != NULL		/* Already done.  */
   1363       || mod->dwerr != DWFL_E_NOERROR) /* Cached previous failure.  */
   1364     return;
   1365 
   1366   __libdwfl_getelf (mod);
   1367   mod->dwerr = mod->elferr;
   1368   if (mod->dwerr != DWFL_E_NOERROR)
   1369     return;
   1370 
   1371   /* First see if the main ELF file has the debugging information.  */
   1372   mod->dwerr = load_dw (mod, &mod->main);
   1373   switch (mod->dwerr)
   1374     {
   1375     case DWFL_E_NOERROR:
   1376       mod->debug.elf = mod->main.elf;
   1377       mod->debug.address_sync = mod->main.address_sync;
   1378 
   1379       /* The Dwarf might need an alt debug file, find that now after
   1380 	 everything about the debug file has been setup (the
   1381 	 find_debuginfo callback might need it).  */
   1382       find_debug_altlink (mod, mod->main.name);
   1383       return;
   1384 
   1385     case DWFL_E_NO_DWARF:
   1386       break;
   1387 
   1388     default:
   1389       goto canonicalize;
   1390     }
   1391 
   1392   /* Now we have to look for a separate debuginfo file.  */
   1393   mod->dwerr = find_debuginfo (mod);
   1394   switch (mod->dwerr)
   1395     {
   1396     case DWFL_E_NOERROR:
   1397       mod->dwerr = load_dw (mod, &mod->debug);
   1398       if (mod->dwerr == DWFL_E_NOERROR)
   1399 	{
   1400 	  /* The Dwarf might need an alt debug file, find that now after
   1401 	     everything about the debug file has been setup (the
   1402 	     find_debuginfo callback might need it).  */
   1403 	  find_debug_altlink (mod, mod->debug.name);
   1404 	  return;
   1405 	}
   1406 
   1407       break;
   1408 
   1409     case DWFL_E_CB:		/* The find_debuginfo hook failed.  */
   1410       mod->dwerr = DWFL_E_NO_DWARF;
   1411       return;
   1412 
   1413     default:
   1414       break;
   1415     }
   1416 
   1417  canonicalize:
   1418   mod->dwerr = __libdwfl_canon_error (mod->dwerr);
   1419 }
   1420 
   1421 Dwarf *
   1422 dwfl_module_getdwarf (Dwfl_Module *mod, Dwarf_Addr *bias)
   1423 {
   1424   if (mod == NULL)
   1425     return NULL;
   1426 
   1427   find_dw (mod);
   1428   if (mod->dwerr == DWFL_E_NOERROR)
   1429     {
   1430       /* If dwfl_module_getelf was used previously, then partial apply
   1431 	 relocation to miscellaneous sections in the debug file too.  */
   1432       if (mod->e_type == ET_REL
   1433 	  && mod->main.relocated && ! mod->debug.relocated)
   1434 	{
   1435 	  mod->debug.relocated = true;
   1436 	  if (mod->debug.elf != mod->main.elf)
   1437 	    (void) __libdwfl_relocate (mod, mod->debug.elf, false);
   1438 	}
   1439 
   1440       *bias = dwfl_adjusted_dwarf_addr (mod, 0);
   1441       return mod->dw;
   1442     }
   1443 
   1444   __libdwfl_seterrno (mod->dwerr);
   1445   return NULL;
   1446 }
   1447 INTDEF (dwfl_module_getdwarf)
   1448 
   1449 int
   1450 dwfl_module_getsymtab (Dwfl_Module *mod)
   1451 {
   1452   if (mod == NULL)
   1453     return -1;
   1454 
   1455   find_symtab (mod);
   1456   if (mod->symerr == DWFL_E_NOERROR)
   1457     /* We will skip the auxiliary zero entry if there is another one.  */
   1458     return (mod->syments + mod->aux_syments
   1459 	    - (mod->syments > 0 && mod->aux_syments > 0 ? 1 : 0));
   1460 
   1461   __libdwfl_seterrno (mod->symerr);
   1462   return -1;
   1463 }
   1464 INTDEF (dwfl_module_getsymtab)
   1465 
   1466 int
   1467 dwfl_module_getsymtab_first_global (Dwfl_Module *mod)
   1468 {
   1469   if (mod == NULL)
   1470     return -1;
   1471 
   1472   find_symtab (mod);
   1473   if (mod->symerr == DWFL_E_NOERROR)
   1474     {
   1475       /* All local symbols should come before all global symbols.  If
   1476 	 we have an auxiliary table make sure all the main locals come
   1477 	 first, then all aux locals, then all main globals and finally all
   1478 	 aux globals.  And skip the auxiliary table zero undefined
   1479 	 entry.  */
   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;
   1482     }
   1483 
   1484   __libdwfl_seterrno (mod->symerr);
   1485   return -1;
   1486 }
   1487 INTDEF (dwfl_module_getsymtab_first_global)
   1488