/* Sniff out modules from ELF headers visible in memory segments.
   Copyright (C) 2008-2012, 2014, 2015, 2018 Red Hat, Inc.
   Copyright (C) 2021 Mark J. Wielaard <mark@klomp.org>
   This file is part of elfutils.

   This file is free software; you can redistribute it and/or modify
   it under the terms of either

     * the GNU Lesser General Public License as published by the Free
       Software Foundation; either version 3 of the License, or (at
       your option) any later version

   or

     * the GNU General Public License as published by the Free
       Software Foundation; either version 2 of the License, or (at
       your option) any later version

   or both in parallel, as here.

   elfutils is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received copies of the GNU General Public License and
   the GNU Lesser General Public License along with this program.  If
   not, see <http://www.gnu.org/licenses/>.  */

#include <config.h>
#include "../libelf/libelfP.h"	/* For NOTE_ALIGN4 and NOTE_ALIGN8.  */
#undef	_
#include "libdwflP.h"
#include "common.h"

#include <elf.h>
#include <gelf.h>
#include <inttypes.h>
#include <endian.h>
#include <unistd.h>
#include <fcntl.h>

#include <system.h>


/* A good size for the initial read from memory, if it's not too costly.
   This more than covers the phdrs and note segment in the average 64-bit
   binary.  */

#define INITIAL_READ	1024

#if BYTE_ORDER == LITTLE_ENDIAN
# define MY_ELFDATA	ELFDATA2LSB
#else
# define MY_ELFDATA	ELFDATA2MSB
#endif

struct elf_build_id
{
  void *memory;
  size_t len;
  GElf_Addr vaddr;
};

struct read_state
{
  Dwfl *dwfl;
  Dwfl_Memory_Callback *memory_callback;
  void *memory_callback_arg;
  void **buffer;
  size_t *buffer_available;
};

/* Return user segment index closest to ADDR but not above it.
   If NEXT, return the closest to ADDR but not below it.  */
static int
addr_segndx (Dwfl *dwfl, size_t segment, GElf_Addr addr, bool next)
{
  int ndx = -1;
  do
    {
      if (dwfl->lookup_segndx[segment] >= 0)
	ndx = dwfl->lookup_segndx[segment];
      if (++segment >= dwfl->lookup_elts - 1)
	return next ? ndx + 1 : ndx;
    }
  while (dwfl->lookup_addr[segment] < addr);

  if (next)
    {
      while (dwfl->lookup_segndx[segment] < 0)
	if (++segment >= dwfl->lookup_elts - 1)
	  return ndx + 1;
      ndx = dwfl->lookup_segndx[segment];
    }

  return ndx;
}

/* Return whether there is SZ bytes available at PTR till END.  */

static bool
buf_has_data (const void *ptr, const void *end, size_t sz)
{
  return ptr < end && (size_t) (end - ptr) >= sz;
}

/* Read SZ bytes into *RETP from *PTRP (limited by END) in format EI_DATA.
   Function comes from src/readelf.c .  */

static bool
buf_read_ulong (unsigned char ei_data, size_t sz,
		const void **ptrp, const void *end, uint64_t *retp)
{
  if (! buf_has_data (*ptrp, end, sz))
    return false;

  union
  {
    uint64_t u64;
    uint32_t u32;
  } u;

  memcpy (&u, *ptrp, sz);
  (*ptrp) += sz;

  if (retp == NULL)
    return true;

  if (MY_ELFDATA != ei_data)
    {
      if (sz == 4)
	CONVERT (u.u32);
      else
	CONVERT (u.u64);
    }
  if (sz == 4)
    *retp = u.u32;
  else
    *retp = u.u64;
  return true;
}

/* Try to find matching entry for module from address MODULE_START to
   MODULE_END in NT_FILE note located at NOTE_FILE of NOTE_FILE_SIZE
   bytes in format EI_CLASS and EI_DATA.  */

static const char *
handle_file_note (GElf_Addr module_start, GElf_Addr module_end,
		  unsigned char ei_class, unsigned char ei_data,
		  const void *note_file, size_t note_file_size)
{
  if (note_file == NULL)
    return NULL;

  size_t sz;
  switch (ei_class)
    {
    case ELFCLASS32:
      sz = 4;
      break;
    case ELFCLASS64:
      sz = 8;
      break;
    default:
      return NULL;
    }

  const void *ptr = note_file;
  const void *end = note_file + note_file_size;
  uint64_t count;
  if (! buf_read_ulong (ei_data, sz, &ptr, end, &count))
    return NULL;
  if (! buf_read_ulong (ei_data, sz, &ptr, end, NULL)) // page_size
    return NULL;

  uint64_t maxcount = (size_t) (end - ptr) / (3 * sz);
  if (count > maxcount)
    return NULL;

  /* Where file names are stored.  */
  const char *fptr = ptr + 3 * count * sz;

  ssize_t firstix = -1;
  ssize_t lastix = -1;
  for (size_t mix = 0; mix < count; mix++)
    {
      uint64_t mstart, mend, moffset;
      if (! buf_read_ulong (ei_data, sz, &ptr, fptr, &mstart)
	  || ! buf_read_ulong (ei_data, sz, &ptr, fptr, &mend)
	  || ! buf_read_ulong (ei_data, sz, &ptr, fptr, &moffset))
	return NULL;
      if (mstart == module_start && moffset == 0)
	firstix = lastix = mix;
      if (firstix != -1 && mstart < module_end)
	lastix = mix;
      if (mend >= module_end)
	break;
    }
  if (firstix == -1)
    return NULL;

  const char *retval = NULL;
  for (ssize_t mix = 0; mix <= lastix; mix++)
    {
      const char *fnext = memchr (fptr, 0, (const char *) end - fptr);
      if (fnext == NULL)
	return NULL;
      if (mix == firstix)
	retval = fptr;
      if (firstix < mix && mix <= lastix && strcmp (fptr, retval) != 0)
	return NULL;
      fptr = fnext + 1;
    }
  return retval;
}

/* Return true iff we are certain ELF cannot match BUILD_ID of
   BUILD_ID_LEN bytes.  Pass DISK_FILE_HAS_BUILD_ID as false if it is
   certain ELF does not contain build-id (it is only a performance hit
   to pass it always as true).  */

static bool
invalid_elf (Elf *elf, bool disk_file_has_build_id,
             struct elf_build_id *build_id)
{
  if (! disk_file_has_build_id && build_id->len > 0)
    {
      /* Module found in segments with build-id is more reliable
	 than a module found via DT_DEBUG on disk without any
	 build-id.   */
      return true;
    }
  if (disk_file_has_build_id && build_id->len > 0)
    {
      const void *elf_build_id;
      ssize_t elf_build_id_len;

      /* If there is a build id in the elf file, check it.  */
      elf_build_id_len = INTUSE(dwelf_elf_gnu_build_id) (elf, &elf_build_id);
      if (elf_build_id_len > 0)
	{
	  if (build_id->len != (size_t) elf_build_id_len
	      || memcmp (build_id->memory, elf_build_id, build_id->len) != 0)
	    return true;
	}
    }
  return false;
}

static void
finish_portion (struct read_state *read_state,
		void **data, size_t *data_size)
{
  if (*data_size != 0 && *data != NULL)
    (*read_state->memory_callback) (read_state->dwfl, -1, data, data_size,
				    0, 0, read_state->memory_callback_arg);
}

static inline bool
read_portion (struct read_state *read_state,
	      void **data, size_t *data_size,
	      GElf_Addr start, size_t segment,
	      GElf_Addr vaddr, size_t filesz)
{
  /* Check whether we will have to read the segment data, or if it
     can be returned from the existing buffer.  */
  if (filesz > *read_state->buffer_available
      || vaddr - start > *read_state->buffer_available - filesz
      /* If we're in string mode, then don't consider the buffer we have
	 sufficient unless it contains the terminator of the string.  */
      || (filesz == 0 && memchr (vaddr - start + *read_state->buffer, '\0',
				 (*read_state->buffer_available
				  - (vaddr - start))) == NULL))
    {
      *data = NULL;
      *data_size = filesz;
      return !(*read_state->memory_callback) (read_state->dwfl,
					      addr_segndx (read_state->dwfl,
							   segment, vaddr,
							   false),
					      data, data_size, vaddr, filesz,
					      read_state->memory_callback_arg);
    }

  /* We already have this whole note segment from our initial read.  */
  *data = vaddr - start + (*read_state->buffer);
  *data_size = 0;
  return false;
}

int
dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
			    Dwfl_Memory_Callback *memory_callback,
			    void *memory_callback_arg,
			    Dwfl_Module_Callback *read_eagerly,
			    void *read_eagerly_arg,
			    size_t maxread,
			    const void *note_file, size_t note_file_size,
			    const struct r_debug_info *r_debug_info)
{
  size_t segment = ndx;
  struct read_state read_state;

  if (segment >= dwfl->lookup_elts)
    segment = dwfl->lookup_elts - 1;

  while (segment > 0
	 && (dwfl->lookup_segndx[segment] > ndx
	     || dwfl->lookup_segndx[segment] == -1))
    --segment;

  while (dwfl->lookup_segndx[segment] < ndx)
    if (++segment == dwfl->lookup_elts)
      return 0;

  GElf_Addr start = dwfl->lookup_addr[segment];

  /* First read in the file header and check its sanity.  */

  void *buffer = NULL;
  size_t buffer_available = INITIAL_READ;
  Elf *elf = NULL;
  int fd = -1;

  read_state.dwfl = dwfl;
  read_state.memory_callback = memory_callback;
  read_state.memory_callback_arg = memory_callback_arg;
  read_state.buffer = &buffer;
  read_state.buffer_available = &buffer_available;

  /* We might have to reserve some memory for the phdrs.  Set to NULL
     here so we can always safely free it.  */
  void *phdrsp = NULL;

  /* Collect the build ID bits here.  */
  struct elf_build_id build_id;
  build_id.memory = NULL;
  build_id.len = 0;
  build_id.vaddr = 0;

  if (! (*memory_callback) (dwfl, ndx, &buffer, &buffer_available,
			    start, sizeof (Elf64_Ehdr), memory_callback_arg)
      || memcmp (buffer, ELFMAG, SELFMAG) != 0)
    goto out;

  /* Extract the information we need from the file header.  */
  const unsigned char *e_ident;
  unsigned char ei_class;
  unsigned char ei_data;
  uint16_t e_type;
  union
  {
    Elf32_Ehdr e32;
    Elf64_Ehdr e64;
  } ehdr;
  GElf_Off phoff;
  uint_fast16_t phnum;
  uint_fast16_t phentsize;
  GElf_Off shdrs_end;
  Elf_Data xlatefrom =
    {
      .d_type = ELF_T_EHDR,
      .d_buf = (void *) buffer,
      .d_version = EV_CURRENT,
    };
  Elf_Data xlateto =
    {
      .d_type = ELF_T_EHDR,
      .d_buf = &ehdr,
      .d_size = sizeof ehdr,
      .d_version = EV_CURRENT,
    };
  e_ident = ((const unsigned char *) buffer);
  ei_class = e_ident[EI_CLASS];
  ei_data = e_ident[EI_DATA];
  /* buffer may be unaligned, in which case xlatetom would not work.
     xlatetom does work when the in and out d_buf are equal (but not
     for any other overlap).  */
  size_t ehdr_align = (ei_class == ELFCLASS32
		       ? __alignof__ (Elf32_Ehdr)
		       : __alignof__ (Elf64_Ehdr));
  if (((uintptr_t) buffer & (ehdr_align - 1)) != 0)
    {
      memcpy (&ehdr, buffer,
	      (ei_class == ELFCLASS32
	       ? sizeof (Elf32_Ehdr)
	       : sizeof (Elf64_Ehdr)));
      xlatefrom.d_buf = &ehdr;
    }
  switch (ei_class)
    {
    case ELFCLASS32:
      xlatefrom.d_size = sizeof (Elf32_Ehdr);
      if (elf32_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL)
	goto out;
      e_type = ehdr.e32.e_type;
      phoff = ehdr.e32.e_phoff;
      phnum = ehdr.e32.e_phnum;
      phentsize = ehdr.e32.e_phentsize;
      if (phentsize != sizeof (Elf32_Phdr))
	goto out;
      /* NOTE if the number of sections is > 0xff00 then e_shnum
	 is zero and the actual number would come from the section
	 zero sh_size field. We ignore this here because getting shdrs
	 is just a nice bonus (see below in the type == PT_LOAD case
	 where we trim the last segment).  */
      shdrs_end = ehdr.e32.e_shoff + ehdr.e32.e_shnum * sizeof (Elf32_Shdr);
      break;

    case ELFCLASS64:
      xlatefrom.d_size = sizeof (Elf64_Ehdr);
      if (elf64_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL)
	goto out;
      e_type = ehdr.e64.e_type;
      phoff = ehdr.e64.e_phoff;
      phnum = ehdr.e64.e_phnum;
      phentsize = ehdr.e64.e_phentsize;
      if (phentsize != sizeof (Elf64_Phdr))
	goto out;
      /* See the NOTE above for shdrs_end and ehdr.e32.e_shnum.  */
      shdrs_end = ehdr.e64.e_shoff + ehdr.e64.e_shnum * sizeof (Elf64_Shdr);
      break;

    default:
      goto out;
    }

  /* The file header tells where to find the program headers.
     These are what we need to find the boundaries of the module.
     Without them, we don't have a module to report.  */

  if (phnum == 0)
    goto out;

  xlatefrom.d_type = xlateto.d_type = ELF_T_PHDR;
  xlatefrom.d_size = phnum * phentsize;

  void *ph_buffer = NULL;
  size_t ph_buffer_size = 0;
  if (read_portion (&read_state, &ph_buffer, &ph_buffer_size,
		    start, segment,
		    start + phoff, xlatefrom.d_size))
    goto out;

  /* ph_buffer_size will be zero if we got everything from the initial
     buffer, otherwise it will be the size of the new buffer that
     could be read.  */
  if (ph_buffer_size != 0)
    {
      phnum = ph_buffer_size / phentsize;
      if (phnum == 0)
	goto out;
      xlatefrom.d_size = ph_buffer_size;
    }

  xlatefrom.d_buf = ph_buffer;

  bool class32 = ei_class == ELFCLASS32;
  size_t phdr_size = class32 ? sizeof (Elf32_Phdr) : sizeof (Elf64_Phdr);
  if (unlikely (phnum > SIZE_MAX / phdr_size))
    goto out;
  const size_t phdrsp_bytes = phnum * phdr_size;
  phdrsp = malloc (phdrsp_bytes);
  if (unlikely (phdrsp == NULL))
    goto out;

  xlateto.d_buf = phdrsp;
  xlateto.d_size = phdrsp_bytes;

  /* ph_ buffer may be unaligned, in which case xlatetom would not work.
     xlatetom does work when the in and out d_buf are equal (but not
     for any other overlap).  */
  size_t phdr_align = (class32
		       ? __alignof__ (Elf32_Phdr)
		       : __alignof__ (Elf64_Phdr));
  if (((uintptr_t) ph_buffer & (phdr_align - 1)) != 0)
    {
      memcpy (phdrsp, ph_buffer, phdrsp_bytes);
      xlatefrom.d_buf = phdrsp;
    }

  /* Track the bounds of the file visible in memory.  */
  GElf_Off file_trimmed_end = 0; /* Proper p_vaddr + p_filesz end.  */
  GElf_Off file_end = 0;	 /* Rounded up to effective page size.  */
  GElf_Off contiguous = 0;	 /* Visible as contiguous file from START.  */
  GElf_Off total_filesz = 0;	 /* Total size of data to read.  */

  /* Collect the bias between START and the containing PT_LOAD's p_vaddr.  */
  GElf_Addr bias = 0;
  bool found_bias = false;

  /* Collect the unbiased bounds of the module here.  */
  GElf_Addr module_start = -1l;
  GElf_Addr module_end = 0;
  GElf_Addr module_address_sync = 0;

  /* If we see PT_DYNAMIC, record it here.  */
  GElf_Addr dyn_vaddr = 0;
  GElf_Xword dyn_filesz = 0;

  Elf32_Phdr *p32 = phdrsp;
  Elf64_Phdr *p64 = phdrsp;
  if ((ei_class == ELFCLASS32
       && elf32_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL)
      || (ei_class == ELFCLASS64
          && elf64_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL))
    {
      found_bias = false; /* Trigger error check */
    }
  else
    {
      /* Consider each of the program headers we've read from the image.  */
      for (uint_fast16_t i = 0; i < phnum; ++i)
        {
          bool is32 = (ei_class == ELFCLASS32);
          GElf_Word type = is32 ? p32[i].p_type : p64[i].p_type;
          GElf_Addr vaddr = is32 ? p32[i].p_vaddr : p64[i].p_vaddr;
          GElf_Xword memsz = is32 ? p32[i].p_memsz : p64[i].p_memsz;
          GElf_Off offset = is32 ? p32[i].p_offset : p64[i].p_offset;
          GElf_Xword filesz = is32 ? p32[i].p_filesz : p64[i].p_filesz;
          GElf_Xword align = is32 ? p32[i].p_align : p64[i].p_align;

          if (type == PT_DYNAMIC)
            {
              dyn_vaddr = vaddr;
              dyn_filesz = filesz;
            }
          else if (type == PT_NOTE)
            {
              /* If we have already seen a build ID, we don't care any more.  */
              if (build_id.memory != NULL || filesz == 0)
                continue; /* Next header */

              /* We calculate from the p_offset of the note segment,
               because we don't yet know the bias for its p_vaddr.  */
              const GElf_Addr note_vaddr = start + offset;
              void *data;
              size_t data_size;
              if (read_portion (&read_state, &data, &data_size,
				start, segment, note_vaddr, filesz))
                continue; /* Next header */

              /* data_size will be zero if we got everything from the initial
                 buffer, otherwise it will be the size of the new buffer that
                 could be read.  */
              if (data_size != 0)
                filesz = data_size;

	      if (filesz > SIZE_MAX / sizeof (Elf32_Nhdr))
		continue;

              assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));

              void *notes;
              if (ei_data == MY_ELFDATA
		  && (uintptr_t) data == (align == 8
					  ? NOTE_ALIGN8 ((uintptr_t) data)
					  : NOTE_ALIGN4 ((uintptr_t) data)))
                notes = data;
              else
                {
                  const unsigned int xencoding = ehdr.e32.e_ident[EI_DATA];

		  if (filesz > SIZE_MAX / sizeof (Elf32_Nhdr))
		    continue;
                  notes = malloc (filesz);
                  if (unlikely (notes == NULL))
                    continue; /* Next header */
                  xlatefrom.d_type = xlateto.d_type = (align == 8
                                                       ? ELF_T_NHDR8
						       : ELF_T_NHDR);
                  xlatefrom.d_buf = (void *) data;
                  xlatefrom.d_size = filesz;
                  xlateto.d_buf = notes;
                  xlateto.d_size = filesz;

		  /* data may be unaligned, in which case xlatetom would not work.
		     xlatetom does work when the in and out d_buf are equal (but not
		     for any other overlap).  */
		  if ((uintptr_t) data != (align == 8
					   ? NOTE_ALIGN8 ((uintptr_t) data)
					   : NOTE_ALIGN4 ((uintptr_t) data)))
		    {
		      memcpy (notes, data, filesz);
		      xlatefrom.d_buf = notes;
		    }

                  if (elf32_xlatetom (&xlateto, &xlatefrom, xencoding) == NULL)
                    {
                      free (notes);
                      finish_portion (&read_state, &data, &data_size);
                      continue;
                    }
                }

              const GElf_Nhdr *nh = notes;
              size_t len = 0;
              while (filesz - len > sizeof (*nh))
                {
		  len += sizeof (*nh);

		  size_t namesz = nh->n_namesz;
		  namesz = align == 8 ? NOTE_ALIGN8 (namesz) : NOTE_ALIGN4 (namesz);
		  if (namesz > filesz - len || len + namesz < namesz)
		    break;

		  void *note_name = notes + len;
		  len += namesz;

		  size_t descsz = nh->n_descsz;
		  descsz = align == 8 ? NOTE_ALIGN8 (descsz) : NOTE_ALIGN4 (descsz);
		  if (descsz > filesz - len || len + descsz < descsz)
		    break;

		  void *note_desc = notes + len;
		  len += descsz;

		  /* We don't handle very short or really large build-ids.  We need at
		     at least 3 and allow for up to 64 (normally ids are 20 long).  */
#define MIN_BUILD_ID_BYTES 3
#define MAX_BUILD_ID_BYTES 64
		  if (nh->n_type == NT_GNU_BUILD_ID
		      && nh->n_descsz >= MIN_BUILD_ID_BYTES
		      && nh->n_descsz <= MAX_BUILD_ID_BYTES
		      && nh->n_namesz == sizeof "GNU"
		      && !memcmp (note_name, "GNU", sizeof "GNU"))
		    {
		      build_id.vaddr = (note_desc
					- (const void *) notes
					+ note_vaddr);
		      build_id.len = nh->n_descsz;
		      build_id.memory = malloc (build_id.len);
		      if (likely (build_id.memory != NULL))
			memcpy (build_id.memory, note_desc, build_id.len);
		      break;
		    }

		  nh = (void *) notes + len;
		}

              if (notes != data)
                free (notes);
              finish_portion (&read_state, &data, &data_size);
            }
          else if (type == PT_LOAD)
            {
              align = (dwfl->segment_align > 1
                       ? dwfl->segment_align : (align ?: 1));

              GElf_Addr vaddr_end = (vaddr + memsz + align - 1) & -align;
              GElf_Addr filesz_vaddr = (filesz < memsz
                                        ? vaddr + filesz : vaddr_end);
              GElf_Off filesz_offset = filesz_vaddr - vaddr + offset;

              if (file_trimmed_end < offset + filesz)
                {
                  file_trimmed_end = offset + filesz;

                  /* Trim the last segment so we don't bother with zeros
                     in the last page that are off the end of the file.
                     However, if the extra bit in that page includes the
                     section headers, keep them.  */
                  if (shdrs_end <= filesz_offset
                      && shdrs_end > file_trimmed_end)
                    {
                      filesz += shdrs_end - file_trimmed_end;
                      file_trimmed_end = shdrs_end;
                    }
                }

              total_filesz += filesz;

              if (file_end < filesz_offset)
                {
                  file_end = filesz_offset;
                  if (filesz_vaddr - start == filesz_offset)
                    contiguous = file_end;
                }

              if (!found_bias && (offset & -align) == 0
                  && likely (filesz_offset >= phoff + phnum * phentsize))
                {
                  bias = start - vaddr;
                  found_bias = true;
                }

              if ((vaddr & -align) < module_start)
                {
                  module_start = vaddr & -align;
                  module_address_sync = vaddr + memsz;
                }

              if (module_end < vaddr_end)
                module_end = vaddr_end;
            }
        }
    }

  finish_portion (&read_state, &ph_buffer, &ph_buffer_size);

  /* We must have seen the segment covering offset 0, or else the ELF
     header we read at START was not produced by these program headers.  */
  if (unlikely (!found_bias))
    goto out;

  /* Now we know enough to report a module for sure: its bounds.  */
  module_start += bias;
  module_end += bias;

  dyn_vaddr += bias;

  /* NAME found from link map has precedence over DT_SONAME possibly read
     below.  */
  bool name_is_final = false;

  /* Try to match up DYN_VADDR against L_LD as found in link map.
     Segments sniffing may guess invalid address as the first read-only memory
     mapping may not be dumped to the core file (if ELF headers are not dumped)
     and the ELF header is dumped first with the read/write mapping of the same
     file at higher addresses.  */
  if (r_debug_info != NULL)
    for (const struct r_debug_info_module *module = r_debug_info->module;
	 module != NULL; module = module->next)
      if (module_start <= module->l_ld && module->l_ld < module_end)
	{
	  /* L_LD read from link map must be right while DYN_VADDR is unsafe.
	     Therefore subtract DYN_VADDR and add L_LD to get a possibly
	     corrective displacement for all addresses computed so far.  */
	  GElf_Addr fixup = module->l_ld - dyn_vaddr;
	  if ((fixup & (dwfl->segment_align - 1)) == 0
	      && module_start + fixup <= module->l_ld
	      && module->l_ld < module_end + fixup)
	    {
	      module_start += fixup;
	      module_end += fixup;
	      dyn_vaddr += fixup;
	      bias += fixup;
	      if (module->name[0] != '\0')
		{
		  name = basename (module->name);
		  name_is_final = true;
		}
	      break;
	    }
	}

  if (r_debug_info != NULL)
    {
      bool skip_this_module = false;
      for (struct r_debug_info_module *module = r_debug_info->module;
	   module != NULL; module = module->next)
	if ((module_end > module->start && module_start < module->end)
	    || dyn_vaddr == module->l_ld)
	  {
	    if (module->elf != NULL
	        && invalid_elf (module->elf, module->disk_file_has_build_id,
				&build_id))
	      {
		elf_end (module->elf);
		close (module->fd);
		module->elf = NULL;
		module->fd = -1;
	      }
	    if (module->elf != NULL)
	      {
		/* Ignore this found module if it would conflict in address
		   space with any already existing module of DWFL.  */
		skip_this_module = true;
	      }
	  }
      if (skip_this_module)
	goto out;
    }

  const char *file_note_name = handle_file_note (module_start, module_end,
						 ei_class, ei_data,
						 note_file, note_file_size);
  if (file_note_name)
    {
      name = file_note_name;
      name_is_final = true;
      bool invalid = false;
      fd = open (name, O_RDONLY);
      if (fd >= 0)
	{
	  Dwfl_Error error = __libdw_open_file (&fd, &elf, true, false);
	  if (error == DWFL_E_NOERROR)
	    invalid = invalid_elf (elf, true /* disk_file_has_build_id */,
                                   &build_id);
	}
      if (invalid)
	{
	  /* The file was there, but the build_id didn't match.  We
	     still want to report the module, but need to get the ELF
	     some other way if possible.  */
	  close (fd);
	  fd = -1;
	  elf_end (elf);
	  elf = NULL;
	}
    }

  /* Our return value now says to skip the segments contained
     within the module.  */
  ndx = addr_segndx (dwfl, segment, module_end, true);

  /* Examine its .dynamic section to get more interesting details.
     If it has DT_SONAME, we'll use that as the module name.
     If it has a DT_DEBUG, then it's actually a PIE rather than a DSO.
     We need its DT_STRTAB and DT_STRSZ to decipher DT_SONAME,
     and they also tell us the essential portion of the file
     for fetching symbols.  */
  GElf_Addr soname_stroff = 0;
  GElf_Addr dynstr_vaddr = 0;
  GElf_Xword dynstrsz = 0;
  bool execlike = false;
  const size_t dyn_entsize = (ei_class == ELFCLASS32
			      ? sizeof (Elf32_Dyn) : sizeof (Elf64_Dyn));
  void *dyn_data = NULL;
  size_t dyn_data_size = 0;
  if (dyn_filesz != 0 && dyn_filesz % dyn_entsize == 0
      && ! read_portion (&read_state, &dyn_data, &dyn_data_size,
			 start, segment, dyn_vaddr, dyn_filesz))
    {
      /* dyn_data_size will be zero if we got everything from the initial
         buffer, otherwise it will be the size of the new buffer that
         could be read.  */
      if (dyn_data_size != 0)
	dyn_filesz = dyn_data_size;

      if ((dyn_filesz / dyn_entsize) == 0
	  || dyn_filesz > (SIZE_MAX / dyn_entsize))
	goto out;
      void *dyns = malloc (dyn_filesz);
      Elf32_Dyn *d32 = dyns;
      Elf64_Dyn *d64 = dyns;
      if (unlikely (dyns == NULL))
	goto out;

      xlatefrom.d_type = xlateto.d_type = ELF_T_DYN;
      xlatefrom.d_buf = (void *) dyn_data;
      xlatefrom.d_size = dyn_filesz;
      xlateto.d_buf = dyns;
      xlateto.d_size = dyn_filesz;

      /* dyn_data may be unaligned, in which case xlatetom would not work.
	 xlatetom does work when the in and out d_buf are equal (but not
	 for any other overlap).  */
      bool is32 = (ei_class == ELFCLASS32);
      size_t dyn_align = (is32
			  ? __alignof__ (Elf32_Dyn)
			  : __alignof__ (Elf64_Dyn));
      if (((uintptr_t) dyn_data & (dyn_align - 1)) != 0)
	{
	  memcpy (dyns, dyn_data, dyn_filesz);
	  xlatefrom.d_buf = dyns;
	}

      if ((is32 && elf32_xlatetom (&xlateto, &xlatefrom, ei_data) != NULL)
          || (!is32 && elf64_xlatetom (&xlateto, &xlatefrom, ei_data) != NULL))
        {
          size_t n = (is32
		      ? (dyn_filesz / sizeof (Elf32_Dyn))
		      : (dyn_filesz / sizeof (Elf64_Dyn)));
          for (size_t i = 0; i < n; ++i)
            {
              GElf_Sxword tag = is32 ? d32[i].d_tag : d64[i].d_tag;
              GElf_Xword val = is32 ? d32[i].d_un.d_val : d64[i].d_un.d_val;

              if (tag == DT_DEBUG)
                execlike = true;
              else if (tag == DT_SONAME)
                soname_stroff = val;
              else if (tag == DT_STRTAB)
                dynstr_vaddr = val;
              else if (tag == DT_STRSZ)
                dynstrsz = val;
              else
                continue;

              if (soname_stroff != 0 && dynstr_vaddr != 0 && dynstrsz != 0)
                break;
            }
        }
      free (dyns);
    }
  finish_portion (&read_state, &dyn_data, &dyn_data_size);

  /* We'll use the name passed in or a stupid default if not DT_SONAME.  */
  if (name == NULL)
    name = e_type == ET_EXEC ? "[exe]" : execlike ? "[pie]" : "[dso]";

  void *soname = NULL;
  size_t soname_size = 0;
  if (! name_is_final && dynstrsz != 0 && dynstr_vaddr != 0)
    {
      /* We know the bounds of the .dynstr section.

	 The DYNSTR_VADDR pointer comes from the .dynamic section
	 (DT_STRTAB, detected above).  Ordinarily the dynamic linker
	 will have adjusted this pointer in place so it's now an
	 absolute address.  But sometimes .dynamic is read-only (in
	 vDSOs and odd architectures), and sometimes the adjustment
	 just hasn't happened yet in the memory image we looked at.
	 So treat DYNSTR_VADDR as an absolute address if it falls
	 within the module bounds, or try applying the phdr bias
	 when that adjusts it to fall within the module bounds.  */

      if ((dynstr_vaddr < module_start || dynstr_vaddr >= module_end)
	  && dynstr_vaddr + bias >= module_start
	  && dynstr_vaddr + bias < module_end)
	dynstr_vaddr += bias;

      if (unlikely (dynstr_vaddr + dynstrsz > module_end))
	dynstrsz = 0;

      /* Try to get the DT_SONAME string.  */
      if (soname_stroff != 0 && soname_stroff + 1 < dynstrsz
	  && ! read_portion (&read_state, &soname, &soname_size,
			     start, segment,
			     dynstr_vaddr + soname_stroff, 0))
	name = soname;
    }

  /* Now that we have chosen the module's name and bounds, report it.
     If we found a build ID, report that too.  */

  Dwfl_Module *mod = INTUSE(dwfl_report_module) (dwfl, name,
						 module_start, module_end);

  // !execlike && ET_EXEC is PIE.
  // execlike && !ET_EXEC is a static executable.
  if (mod != NULL && (execlike || ehdr.e32.e_type == ET_EXEC))
    mod->is_executable = true;

  if (likely (mod != NULL) && build_id.memory != NULL
      && unlikely (INTUSE(dwfl_module_report_build_id) (mod,
							build_id.memory,
							build_id.len,
							build_id.vaddr)))
    {
      mod->gc = true;
      mod = NULL;
    }

  /* At this point we do not need BUILD_ID or NAME any more.
     They have been copied.  */
  free (build_id.memory);
  build_id.memory = NULL;
  finish_portion (&read_state, &soname, &soname_size);

  if (unlikely (mod == NULL))
    {
      ndx = -1;
      goto out;
    }

  /* We have reported the module.  Now let the caller decide whether we
     should read the whole thing in right now.  */

  const GElf_Off cost = (contiguous < file_trimmed_end ? total_filesz
			 : buffer_available >= contiguous ? 0
			 : contiguous - buffer_available);
  const GElf_Off worthwhile = ((dynstr_vaddr == 0 || dynstrsz == 0) ? 0
			       : dynstr_vaddr + dynstrsz - start);
  const GElf_Off whole = MAX (file_trimmed_end, shdrs_end);

  if (elf == NULL
      && (*read_eagerly) (MODCB_ARGS (mod), &buffer, &buffer_available,
			  cost, worthwhile, whole, contiguous,
			  read_eagerly_arg, &elf)
      && elf == NULL)
    {
      /* The caller wants to read the whole file in right now, but hasn't
	 done it for us.  Fill in a local image of the virtual file.  */

      if (file_trimmed_end > maxread)
	file_trimmed_end = maxread;

      void *contents = calloc (1, file_trimmed_end);
      if (unlikely (contents == NULL))
	goto out;

      if (contiguous < file_trimmed_end)
	{
	  /* We can't use the memory image verbatim as the file image.
	     So we'll be reading into a local image of the virtual file.  */
          for (uint_fast16_t i = 0; i < phnum; ++i)
            {
              bool is32 = (ei_class == ELFCLASS32);
              GElf_Word type = is32 ? p32[i].p_type : p64[i].p_type;

              if (type != PT_LOAD)
                continue;

              GElf_Addr vaddr = is32 ? p32[i].p_vaddr : p64[i].p_vaddr;
              GElf_Off offset = is32 ? p32[i].p_offset : p64[i].p_offset;
              GElf_Xword filesz = is32 ? p32[i].p_filesz : p64[i].p_filesz;

              /* Don't try to read beyond the actual end of file.  */
              if (offset >= file_trimmed_end)
                continue;

              void *into = contents + offset;
              size_t read_size = MIN (filesz, file_trimmed_end - offset);
              (*memory_callback) (dwfl, addr_segndx (dwfl, segment,
                                                     vaddr + bias, false),
                                  &into, &read_size, vaddr + bias, read_size,
                                  memory_callback_arg);
            }
	}
      else
	{
	  /* The whole file sits contiguous in memory,
	     but the caller didn't want to just do it.  */

	  const size_t have = MIN (buffer_available, file_trimmed_end);
	  memcpy (contents, buffer, have);

	  if (have < file_trimmed_end)
            {
	      void *into = contents + have;
	      size_t read_size = file_trimmed_end - have;
	      (*memory_callback) (dwfl,
				  addr_segndx (dwfl, segment,
					       start + have, false),
				  &into, &read_size, start + have,
				  read_size, memory_callback_arg);
            }
	}

      elf = elf_memory (contents, file_trimmed_end);
      if (unlikely (elf == NULL))
	free (contents);
      else
	elf->flags |= ELF_F_MALLOCED;
    }

  if (elf != NULL && mod->main.elf == NULL)
    {
      /* Install the file in the module.  */
      mod->main.elf = elf;
      mod->main.fd = fd;
      elf = NULL;
      fd = -1;
      mod->main.vaddr = module_start - bias;
      mod->main.address_sync = module_address_sync;
      mod->main_bias = bias;
    }

out:
  if (build_id.memory != NULL)
    free (build_id.memory);
  free (phdrsp);
  if (buffer != NULL)
    (*memory_callback) (dwfl, -1, &buffer, &buffer_available, 0, 0,
                        memory_callback_arg);

  if (elf != NULL)
    elf_end (elf);
  if (fd != -1)
    close (fd);
  return ndx;
}
