Blame libdwfl/libdwflP.h

Packit Service 97d2fb
/* Internal definitions for libdwfl.
Packit Service 97d2fb
   Copyright (C) 2005-2015, 2018 Red Hat, Inc.
Packit Service 97d2fb
   This file is part of elfutils.
Packit Service 97d2fb
Packit Service 97d2fb
   This file is free software; you can redistribute it and/or modify
Packit Service 97d2fb
   it under the terms of either
Packit Service 97d2fb
Packit Service 97d2fb
     * the GNU Lesser General Public License as published by the Free
Packit Service 97d2fb
       Software Foundation; either version 3 of the License, or (at
Packit Service 97d2fb
       your option) any later version
Packit Service 97d2fb
Packit Service 97d2fb
   or
Packit Service 97d2fb
Packit Service 97d2fb
     * the GNU General Public License as published by the Free
Packit Service 97d2fb
       Software Foundation; either version 2 of the License, or (at
Packit Service 97d2fb
       your option) any later version
Packit Service 97d2fb
Packit Service 97d2fb
   or both in parallel, as here.
Packit Service 97d2fb
Packit Service 97d2fb
   elfutils is distributed in the hope that it will be useful, but
Packit Service 97d2fb
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 97d2fb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 97d2fb
   General Public License for more details.
Packit Service 97d2fb
Packit Service 97d2fb
   You should have received copies of the GNU General Public License and
Packit Service 97d2fb
   the GNU Lesser General Public License along with this program.  If
Packit Service 97d2fb
   not, see <http://www.gnu.org/licenses/>.  */
Packit Service 97d2fb
Packit Service 97d2fb
#ifndef _LIBDWFLP_H
Packit Service 97d2fb
#define _LIBDWFLP_H	1
Packit Service 97d2fb
Packit Service 97d2fb
#include <libdwfl.h>
Packit Service 97d2fb
#include <libebl.h>
Packit Service 97d2fb
#include <assert.h>
Packit Service 97d2fb
#include <dirent.h>
Packit Service 97d2fb
#include <errno.h>
Packit Service 97d2fb
#include <stdbool.h>
Packit Service 97d2fb
#include <stdlib.h>
Packit Service 97d2fb
#include <string.h>
Packit Service 97d2fb
Packit Service 97d2fb
#include "../libdw/libdwP.h"	/* We need its INTDECLs.  */
Packit Service 97d2fb
#include "../libdwelf/libdwelfP.h"
Packit Service 97d2fb
Packit Service 97d2fb
#ifdef ENABLE_LIBDEBUGINFOD
Packit Service 97d2fb
#include "../debuginfod/debuginfod.h"
Packit Service 97d2fb
#endif
Packit Service 97d2fb
Packit Service 97d2fb
typedef struct Dwfl_Process Dwfl_Process;
Packit Service 97d2fb
Packit Service 97d2fb
/* gettext helper macros.  */
Packit Service 97d2fb
#define _(Str) dgettext ("elfutils", Str)
Packit Service 97d2fb
Packit Service 97d2fb
#define DWFL_ERRORS							      \
Packit Service 97d2fb
  DWFL_ERROR (NOERROR, N_("no error"))					      \
Packit Service 97d2fb
  DWFL_ERROR (UNKNOWN_ERROR, N_("unknown error"))			      \
Packit Service 97d2fb
  DWFL_ERROR (NOMEM, N_("out of memory"))				      \
Packit Service 97d2fb
  DWFL_ERROR (ERRNO, N_("See errno"))					      \
Packit Service 97d2fb
  DWFL_ERROR (LIBELF, N_("See elf_errno"))				      \
Packit Service 97d2fb
  DWFL_ERROR (LIBDW, N_("See dwarf_errno"))				      \
Packit Service 97d2fb
  DWFL_ERROR (LIBEBL, N_("See ebl_errno (XXX missing)"))		      \
Packit Service 97d2fb
  DWFL_ERROR (ZLIB, N_("gzip decompression failed"))			      \
Packit Service 97d2fb
  DWFL_ERROR (BZLIB, N_("bzip2 decompression failed"))			      \
Packit Service 97d2fb
  DWFL_ERROR (LZMA, N_("LZMA decompression failed"))			      \
Packit Service 97d2fb
  DWFL_ERROR (ZSTD, N_("zstd decompression failed"))			      \
Packit Service 97d2fb
  DWFL_ERROR (UNKNOWN_MACHINE, N_("no support library found for machine"))    \
Packit Service 97d2fb
  DWFL_ERROR (NOREL, N_("Callbacks missing for ET_REL file"))		      \
Packit Service 97d2fb
  DWFL_ERROR (BADRELTYPE, N_("Unsupported relocation type"))		      \
Packit Service 97d2fb
  DWFL_ERROR (BADRELOFF, N_("r_offset is bogus"))			      \
Packit Service 97d2fb
  DWFL_ERROR (BADSTROFF, N_("offset out of range"))			      \
Packit Service 97d2fb
  DWFL_ERROR (RELUNDEF, N_("relocation refers to undefined symbol"))	      \
Packit Service 97d2fb
  DWFL_ERROR (CB, N_("Callback returned failure"))			      \
Packit Service 97d2fb
  DWFL_ERROR (NO_DWARF, N_("No DWARF information found"))		      \
Packit Service 97d2fb
  DWFL_ERROR (NO_SYMTAB, N_("No symbol table found"))			      \
Packit Service 97d2fb
  DWFL_ERROR (NO_PHDR, N_("No ELF program headers"))			      \
Packit Service 97d2fb
  DWFL_ERROR (OVERLAP, N_("address range overlaps an existing module"))	      \
Packit Service 97d2fb
  DWFL_ERROR (ADDR_OUTOFRANGE, N_("address out of range"))		      \
Packit Service 97d2fb
  DWFL_ERROR (NO_MATCH, N_("no matching address range"))		      \
Packit Service 97d2fb
  DWFL_ERROR (TRUNCATED, N_("image truncated"))				      \
Packit Service 97d2fb
  DWFL_ERROR (ALREADY_ELF, N_("ELF file opened"))			      \
Packit Service 97d2fb
  DWFL_ERROR (BADELF, N_("not a valid ELF file"))			      \
Packit Service 97d2fb
  DWFL_ERROR (WEIRD_TYPE, N_("cannot handle DWARF type description"))	      \
Packit Service 97d2fb
  DWFL_ERROR (WRONG_ID_ELF, N_("ELF file does not match build ID"))	      \
Packit Service 97d2fb
  DWFL_ERROR (BAD_PRELINK, N_("corrupt .gnu.prelink_undo section data"))      \
Packit Service 97d2fb
  DWFL_ERROR (LIBEBL_BAD, N_("Internal error due to ebl"))		      \
Packit Service 97d2fb
  DWFL_ERROR (CORE_MISSING, N_("Missing data in core file"))		      \
Packit Service 97d2fb
  DWFL_ERROR (INVALID_REGISTER, N_("Invalid register"))			      \
Packit Service 97d2fb
  DWFL_ERROR (PROCESS_MEMORY_READ, N_("Error reading process memory"))	      \
Packit Service 97d2fb
  DWFL_ERROR (PROCESS_NO_ARCH, N_("Couldn't find architecture of any ELF"))   \
Packit Service 97d2fb
  DWFL_ERROR (PARSE_PROC, N_("Error parsing /proc filesystem"))		      \
Packit Service 97d2fb
  DWFL_ERROR (INVALID_DWARF, N_("Invalid DWARF"))			      \
Packit Service 97d2fb
  DWFL_ERROR (UNSUPPORTED_DWARF, N_("Unsupported DWARF"))		      \
Packit Service 97d2fb
  DWFL_ERROR (NEXT_THREAD_FAIL, N_("Unable to find more threads"))	      \
Packit Service 97d2fb
  DWFL_ERROR (ATTACH_STATE_CONFLICT, N_("Dwfl already has attached state"))   \
Packit Service 97d2fb
  DWFL_ERROR (NO_ATTACH_STATE, N_("Dwfl has no attached state"))	      \
Packit Service 97d2fb
  DWFL_ERROR (NO_UNWIND, N_("Unwinding not supported for this architecture")) \
Packit Service 97d2fb
  DWFL_ERROR (INVALID_ARGUMENT, N_("Invalid argument"))			      \
Packit Service 97d2fb
  DWFL_ERROR (NO_CORE_FILE, N_("Not an ET_CORE ELF file"))
Packit Service 97d2fb
Packit Service 97d2fb
#define DWFL_ERROR(name, text) DWFL_E_##name,
Packit Service 97d2fb
typedef enum { DWFL_ERRORS DWFL_E_NUM } Dwfl_Error;
Packit Service 97d2fb
#undef	DWFL_ERROR
Packit Service 97d2fb
Packit Service 97d2fb
#define OTHER_ERROR(name)	((unsigned int) DWFL_E_##name << 16)
Packit Service 97d2fb
#define DWFL_E(name, errno)	(OTHER_ERROR (name) | (errno))
Packit Service 97d2fb
Packit Service 97d2fb
extern int __libdwfl_canon_error (Dwfl_Error) internal_function;
Packit Service 97d2fb
extern void __libdwfl_seterrno (Dwfl_Error) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Resources we might keep for the user about the core file that the
Packit Service 97d2fb
   Dwfl might have been created from.  Can currently only be set
Packit Service 97d2fb
   through std-argp.  */
Packit Service 97d2fb
struct Dwfl_User_Core
Packit Service 97d2fb
{
Packit Service 97d2fb
  char *executable_for_core;	/* --executable if --core was specified.  */
Packit Service 97d2fb
  Elf *core;                    /* non-NULL if we need to free it.  */
Packit Service 97d2fb
  int fd;                       /* close if >= 0.  */
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
struct Dwfl
Packit Service 97d2fb
{
Packit Service 97d2fb
  const Dwfl_Callbacks *callbacks;
Packit Service 97d2fb
#ifdef ENABLE_LIBDEBUGINFOD
Packit Service 97d2fb
  debuginfod_client *debuginfod;
Packit Service 97d2fb
#endif
Packit Service 97d2fb
  Dwfl_Module *modulelist;    /* List in order used by full traversals.  */
Packit Service 97d2fb
Packit Service 97d2fb
  Dwfl_Process *process;
Packit Service 97d2fb
  Dwfl_Error attacherr;      /* Previous error attaching process.  */
Packit Service 97d2fb
Packit Service 97d2fb
  GElf_Addr offline_next_address;
Packit Service 97d2fb
Packit Service 97d2fb
  GElf_Addr segment_align;	/* Smallest granularity of segments.  */
Packit Service 97d2fb
Packit Service 97d2fb
  /* Binary search table in three parallel malloc'd arrays.  */
Packit Service 97d2fb
  size_t lookup_elts;		/* Elements in use.  */
Packit Service 97d2fb
  size_t lookup_alloc;		/* Elements allococated.  */
Packit Service 97d2fb
  GElf_Addr *lookup_addr;	/* Start address of segment.  */
Packit Service 97d2fb
  Dwfl_Module **lookup_module;	/* Module associated with segment, or null.  */
Packit Service 97d2fb
  int *lookup_segndx;		/* User segment index, or -1.  */
Packit Service 97d2fb
  int next_segndx;
Packit Service 97d2fb
Packit Service 97d2fb
  struct Dwfl_User_Core *user_core;
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
#define OFFLINE_REDZONE		0x10000
Packit Service 97d2fb
Packit Service 97d2fb
struct dwfl_file
Packit Service 97d2fb
{
Packit Service 97d2fb
  char *name;
Packit Service 97d2fb
  int fd;
Packit Service 97d2fb
  bool valid;			/* The build ID note has been matched.  */
Packit Service 97d2fb
  bool relocated;		/* Partial relocation of all sections done.  */
Packit Service 97d2fb
Packit Service 97d2fb
  Elf *elf;
Packit Service 97d2fb
Packit Service 97d2fb
  /* This is the lowest p_vaddr in this ELF file, aligned to p_align.
Packit Service 97d2fb
     For a file without phdrs, this is zero.  */
Packit Service 97d2fb
  GElf_Addr vaddr;
Packit Service 97d2fb
Packit Service 97d2fb
  /* This is an address chosen for synchronization between the main file
Packit Service 97d2fb
     and the debug file.  See dwfl_module_getdwarf.c for how it's chosen.  */
Packit Service 97d2fb
  GElf_Addr address_sync;
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
struct Dwfl_Module
Packit Service 97d2fb
{
Packit Service 97d2fb
  Dwfl *dwfl;
Packit Service 97d2fb
  struct Dwfl_Module *next;	/* Link on Dwfl.modulelist.  */
Packit Service 97d2fb
Packit Service 97d2fb
  void *userdata;
Packit Service 97d2fb
Packit Service 97d2fb
  char *name;			/* Iterator name for this module.  */
Packit Service 97d2fb
  GElf_Addr low_addr, high_addr;
Packit Service 97d2fb
Packit Service 97d2fb
  struct dwfl_file main, debug, aux_sym;
Packit Service 97d2fb
  GElf_Addr main_bias;
Packit Service 97d2fb
  Ebl *ebl;
Packit Service 97d2fb
  GElf_Half e_type;		/* GElf_Ehdr.e_type cache.  */
Packit Service 97d2fb
  Dwfl_Error elferr;		/* Previous failure to open main file.  */
Packit Service 97d2fb
Packit Service 97d2fb
  struct dwfl_relocation *reloc_info; /* Relocatable sections.  */
Packit Service 97d2fb
Packit Service 97d2fb
  struct dwfl_file *symfile;	/* Either main or debug.  */
Packit Service 97d2fb
  Elf_Data *symdata;		/* Data in the ELF symbol table section.  */
Packit Service 97d2fb
  Elf_Data *aux_symdata;	/* Data in the auxiliary ELF symbol table.  */
Packit Service 97d2fb
  size_t syments;		/* sh_size / sh_entsize of that section.  */
Packit Service 97d2fb
  size_t aux_syments;		/* sh_size / sh_entsize of aux_sym section.  */
Packit Service 97d2fb
  int first_global;		/* Index of first global symbol of table.  */
Packit Service 97d2fb
  int aux_first_global;		/* Index of first global of aux_sym table.  */
Packit Service 97d2fb
  Elf_Data *symstrdata;		/* Data for its string table.  */
Packit Service 97d2fb
  Elf_Data *aux_symstrdata;	/* Data for aux_sym string table.  */
Packit Service 97d2fb
  Elf_Data *symxndxdata;	/* Data in the extended section index table. */
Packit Service 97d2fb
  Elf_Data *aux_symxndxdata;	/* Data in the extended auxiliary table. */
Packit Service 97d2fb
Packit Service 97d2fb
  char *elfdir;			/* The dir where we found the main Elf.  */
Packit Service 97d2fb
Packit Service 97d2fb
  Dwarf *dw;			/* libdw handle for its debugging info.  */
Packit Service 97d2fb
  Dwarf *alt;			/* Dwarf used for dwarf_setalt, or NULL.  */
Packit Service 97d2fb
  int alt_fd; 			/* descriptor, only valid when alt != NULL.  */
Packit Service 97d2fb
  Elf *alt_elf; 		/* Elf for alt Dwarf.  */
Packit Service 97d2fb
Packit Service 97d2fb
  Dwfl_Error symerr;		/* Previous failure to load symbols.  */
Packit Service 97d2fb
  Dwfl_Error dwerr;		/* Previous failure to load DWARF.  */
Packit Service 97d2fb
Packit Service 97d2fb
  /* Known CU's in this module.  */
Packit Service 97d2fb
  struct dwfl_cu *first_cu, **cu;
Packit Service 97d2fb
Packit Service 97d2fb
  void *lazy_cu_root;		/* Table indexed by Dwarf_Off of CU.  */
Packit Service 97d2fb
Packit Service 97d2fb
  struct dwfl_arange *aranges;	/* Mapping of addresses in module to CUs.  */
Packit Service 97d2fb
Packit Service 97d2fb
  void *build_id_bits;		/* malloc'd copy of build ID bits.  */
Packit Service 97d2fb
  GElf_Addr build_id_vaddr;	/* Address where they reside, 0 if unknown.  */
Packit Service 97d2fb
  int build_id_len;		/* -1 for prior failure, 0 if unset.  */
Packit Service 97d2fb
Packit Service 97d2fb
  unsigned int ncu;
Packit Service 97d2fb
  unsigned int lazycu;		/* Possible users, deleted when none left.  */
Packit Service 97d2fb
  unsigned int naranges;
Packit Service 97d2fb
Packit Service 97d2fb
  Dwarf_CFI *dwarf_cfi;		/* Cached DWARF CFI for this module.  */
Packit Service 97d2fb
  Dwarf_CFI *eh_cfi;		/* Cached EH CFI for this module.  */
Packit Service 97d2fb
Packit Service 97d2fb
  int segment;			/* Index of first segment table entry.  */
Packit Service 97d2fb
  bool gc;			/* Mark/sweep flag.  */
Packit Service 97d2fb
  bool is_executable;		/* Use Dwfl::executable_for_core?  */
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
/* This holds information common for all the threads/tasks/TIDs of one process
Packit Service 97d2fb
   for backtraces.  */
Packit Service 97d2fb
Packit Service 97d2fb
struct Dwfl_Process
Packit Service 97d2fb
{
Packit Service 97d2fb
  struct Dwfl *dwfl;
Packit Service 97d2fb
  pid_t pid;
Packit Service 97d2fb
  const Dwfl_Thread_Callbacks *callbacks;
Packit Service 97d2fb
  void *callbacks_arg;
Packit Service 97d2fb
  struct ebl *ebl;
Packit Service 97d2fb
  bool ebl_close:1;
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
/* See its typedef in libdwfl.h.  */
Packit Service 97d2fb
Packit Service 97d2fb
struct Dwfl_Thread
Packit Service 97d2fb
{
Packit Service 97d2fb
  Dwfl_Process *process;
Packit Service 97d2fb
  pid_t tid;
Packit Service 97d2fb
  /* Bottom (innermost) frame while we're initializing, NULL afterwards.  */
Packit Service 97d2fb
  Dwfl_Frame *unwound;
Packit Service 97d2fb
  void *callbacks_arg;
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
/* See its typedef in libdwfl.h.  */
Packit Service 97d2fb
Packit Service 97d2fb
struct Dwfl_Frame
Packit Service 97d2fb
{
Packit Service 97d2fb
  Dwfl_Thread *thread;
Packit Service 97d2fb
  /* Previous (outer) frame.  */
Packit Service 97d2fb
  Dwfl_Frame *unwound;
Packit Service 97d2fb
  bool signal_frame : 1;
Packit Service 97d2fb
  bool initial_frame : 1;
Packit Service 97d2fb
  enum
Packit Service 97d2fb
  {
Packit Service 97d2fb
    /* This structure is still being initialized or there was an error
Packit Service 97d2fb
       initializing it.  */
Packit Service 97d2fb
    DWFL_FRAME_STATE_ERROR,
Packit Service 97d2fb
    /* PC field is valid.  */
Packit Service 97d2fb
    DWFL_FRAME_STATE_PC_SET,
Packit Service 97d2fb
    /* PC field is undefined, this means the next (inner) frame was the
Packit Service 97d2fb
       outermost frame.  */
Packit Service 97d2fb
    DWFL_FRAME_STATE_PC_UNDEFINED
Packit Service 97d2fb
  } pc_state;
Packit Service 97d2fb
  /* Either initialized from appropriate REGS element or on some archs
Packit Service 97d2fb
     initialized separately as the return address has no DWARF register.  */
Packit Service 97d2fb
  Dwarf_Addr pc;
Packit Service 97d2fb
  /* (1 << X) bitmask where 0 <= X < ebl_frame_nregs.  */
Packit Service 97d2fb
  uint64_t regs_set[3];
Packit Service 97d2fb
  /* REGS array size is ebl_frame_nregs.
Packit Service 97d2fb
     REGS_SET tells which of the REGS are valid.  */
Packit Service 97d2fb
  Dwarf_Addr regs[];
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
/* Fetch value from Dwfl_Frame->regs indexed by DWARF REGNO.
Packit Service 97d2fb
   No error code is set if the function returns FALSE.  */
Packit Service 97d2fb
bool __libdwfl_frame_reg_get (Dwfl_Frame *state, unsigned regno,
Packit Service 97d2fb
			      Dwarf_Addr *val)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Store value to Dwfl_Frame->regs indexed by DWARF REGNO.
Packit Service 97d2fb
   No error code is set if the function returns FALSE.  */
Packit Service 97d2fb
bool __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno,
Packit Service 97d2fb
			      Dwarf_Addr val)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Information cached about each CU in Dwfl_Module.dw.  */
Packit Service 97d2fb
struct dwfl_cu
Packit Service 97d2fb
{
Packit Service 97d2fb
  /* This caches libdw information about the CU.  It's also the
Packit Service 97d2fb
     address passed back to users, so we take advantage of the
Packit Service 97d2fb
     fact that it's placed first to cast back.  */
Packit Service 97d2fb
  Dwarf_Die die;
Packit Service 97d2fb
Packit Service 97d2fb
  Dwfl_Module *mod;		/* Pointer back to containing module.  */
Packit Service 97d2fb
Packit Service 97d2fb
  struct dwfl_cu *next;		/* CU immediately following in the file.  */
Packit Service 97d2fb
Packit Service 97d2fb
  struct Dwfl_Lines *lines;
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
struct Dwfl_Lines
Packit Service 97d2fb
{
Packit Service 97d2fb
  struct dwfl_cu *cu;
Packit Service 97d2fb
Packit Service 97d2fb
  /* This is what the opaque Dwfl_Line * pointers we pass to users are.
Packit Service 97d2fb
     We need to recover pointers to our struct dwfl_cu and a record in
Packit Service 97d2fb
     libdw's Dwarf_Line table.  To minimize the memory used in addition
Packit Service 97d2fb
     to libdw's Dwarf_Lines buffer, we just point to our own index in
Packit Service 97d2fb
     this table, and have one pointer back to the CU.  The indices here
Packit Service 97d2fb
     match those in libdw's Dwarf_CU.lines->info table.  */
Packit Service 97d2fb
  struct Dwfl_Line
Packit Service 97d2fb
  {
Packit Service 97d2fb
    unsigned int idx;		/* My index in the dwfl_cu.lines table.  */
Packit Service 97d2fb
  } idx[0];
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
static inline struct dwfl_cu *
Packit Service 97d2fb
dwfl_linecu_inline (const Dwfl_Line *line)
Packit Service 97d2fb
{
Packit Service 97d2fb
  const struct Dwfl_Lines *lines = ((const void *) line
Packit Service 97d2fb
				    - offsetof (struct Dwfl_Lines,
Packit Service 97d2fb
						idx[line->idx]));
Packit Service 97d2fb
  return lines->cu;
Packit Service 97d2fb
}
Packit Service 97d2fb
#define dwfl_linecu dwfl_linecu_inline
Packit Service 97d2fb
Packit Service 97d2fb
static inline GElf_Addr
Packit Service 97d2fb
dwfl_adjusted_address (Dwfl_Module *mod, GElf_Addr addr)
Packit Service 97d2fb
{
Packit Service 97d2fb
  return addr + mod->main_bias;
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static inline GElf_Addr
Packit Service 97d2fb
dwfl_deadjust_address (Dwfl_Module *mod, GElf_Addr addr)
Packit Service 97d2fb
{
Packit Service 97d2fb
  return addr - mod->main_bias;
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static inline Dwarf_Addr
Packit Service 97d2fb
dwfl_adjusted_dwarf_addr (Dwfl_Module *mod, Dwarf_Addr addr)
Packit Service 97d2fb
{
Packit Service 97d2fb
  return dwfl_adjusted_address (mod, (addr
Packit Service 97d2fb
				      - mod->debug.address_sync
Packit Service 97d2fb
				      + mod->main.address_sync));
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static inline Dwarf_Addr
Packit Service 97d2fb
dwfl_deadjust_dwarf_addr (Dwfl_Module *mod, Dwarf_Addr addr)
Packit Service 97d2fb
{
Packit Service 97d2fb
  return (dwfl_deadjust_address (mod, addr)
Packit Service 97d2fb
	  - mod->main.address_sync
Packit Service 97d2fb
	  + mod->debug.address_sync);
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static inline Dwarf_Addr
Packit Service 97d2fb
dwfl_adjusted_aux_sym_addr (Dwfl_Module *mod, Dwarf_Addr addr)
Packit Service 97d2fb
{
Packit Service 97d2fb
  return dwfl_adjusted_address (mod, (addr
Packit Service 97d2fb
				      - mod->aux_sym.address_sync
Packit Service 97d2fb
				      + mod->main.address_sync));
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static inline Dwarf_Addr
Packit Service 97d2fb
dwfl_deadjust_aux_sym_addr (Dwfl_Module *mod, Dwarf_Addr addr)
Packit Service 97d2fb
{
Packit Service 97d2fb
  return (dwfl_deadjust_address (mod, addr)
Packit Service 97d2fb
	  - mod->main.address_sync
Packit Service 97d2fb
	  + mod->aux_sym.address_sync);
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static inline GElf_Addr
Packit Service 97d2fb
dwfl_adjusted_st_value (Dwfl_Module *mod, Elf *symelf, GElf_Addr addr)
Packit Service 97d2fb
{
Packit Service 97d2fb
  if (symelf == mod->main.elf)
Packit Service 97d2fb
    return dwfl_adjusted_address (mod, addr);
Packit Service 97d2fb
  if (symelf == mod->debug.elf)
Packit Service 97d2fb
    return dwfl_adjusted_dwarf_addr (mod, addr);
Packit Service 97d2fb
  return dwfl_adjusted_aux_sym_addr (mod, addr);
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
static inline GElf_Addr
Packit Service 97d2fb
dwfl_deadjust_st_value (Dwfl_Module *mod, Elf *symelf, GElf_Addr addr)
Packit Service 97d2fb
{
Packit Service 97d2fb
  if (symelf == mod->main.elf)
Packit Service 97d2fb
    return dwfl_deadjust_address (mod, addr);
Packit Service 97d2fb
  if (symelf == mod->debug.elf)
Packit Service 97d2fb
    return dwfl_deadjust_dwarf_addr (mod, addr);
Packit Service 97d2fb
  return dwfl_deadjust_aux_sym_addr (mod, addr);
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
/* This describes a contiguous address range that lies in a single CU.
Packit Service 97d2fb
   We condense runs of Dwarf_Arange entries for the same CU into this.  */
Packit Service 97d2fb
struct dwfl_arange
Packit Service 97d2fb
{
Packit Service 97d2fb
  struct dwfl_cu *cu;
Packit Service 97d2fb
  size_t arange;		/* Index in Dwarf_Aranges.  */
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
#define __LIBDWFL_REMOTE_MEM_CACHE_SIZE 4096
Packit Service 97d2fb
/* Structure for caching remote memory reads as used by __libdwfl_pid_arg.  */
Packit Service 97d2fb
struct __libdwfl_remote_mem_cache
Packit Service 97d2fb
{
Packit Service 97d2fb
  Dwarf_Addr addr; /* Remote address.  */
Packit Service 97d2fb
  Dwarf_Off len;   /* Zero if cleared, otherwise likely 4K. */
Packit Service 97d2fb
  unsigned char buf[__LIBDWFL_REMOTE_MEM_CACHE_SIZE]; /* The actual cache.  */
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
/* Structure used for keeping track of ptrace attaching a thread.
Packit Service 97d2fb
   Shared by linux-pid-attach and linux-proc-maps.  If it has been setup
Packit Service 97d2fb
   then get the instance through __libdwfl_get_pid_arg.  */
Packit Service 97d2fb
struct __libdwfl_pid_arg
Packit Service 97d2fb
{
Packit Service 97d2fb
  /* /proc/PID/task/.  */
Packit Service 97d2fb
  DIR *dir;
Packit Service 97d2fb
  /* Elf for /proc/PID/exe.  Set to NULL if it couldn't be opened.  */
Packit Service 97d2fb
  Elf *elf;
Packit Service 97d2fb
  /* Remote memory cache, NULL if there is no memory cached.
Packit Service 97d2fb
     Should be cleared on detachment (because that makes the thread
Packit Service 97d2fb
     runnable and the cache invalid).  */
Packit Service 97d2fb
  struct __libdwfl_remote_mem_cache *mem_cache;
Packit Service 97d2fb
  /* fd for /proc/PID/exe.  Set to -1 if it couldn't be opened.  */
Packit Service 97d2fb
  int elf_fd;
Packit Service 97d2fb
  /* It is 0 if not used.  */
Packit Service 97d2fb
  pid_t tid_attached;
Packit Service 97d2fb
  /* Valid only if TID_ATTACHED is not zero.  */
Packit Service 97d2fb
  bool tid_was_stopped;
Packit Service 97d2fb
  /* True if threads are ptrace stopped by caller.  */
Packit Service 97d2fb
  bool assume_ptrace_stopped;
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
/* If DWfl is not NULL and a Dwfl_Process has been setup that has
Packit Service 97d2fb
   Dwfl_Thread_Callbacks set to pid_thread_callbacks, then return the
Packit Service 97d2fb
   callbacks_arg, which will be a struct __libdwfl_pid_arg.  Otherwise
Packit Service 97d2fb
   returns NULL.  */
Packit Service 97d2fb
extern struct __libdwfl_pid_arg *__libdwfl_get_pid_arg (Dwfl *dwfl)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Makes sure the given tid is attached. On success returns true and
Packit Service 97d2fb
   sets tid_was_stopped.  */
Packit Service 97d2fb
extern bool __libdwfl_ptrace_attach (pid_t tid, bool *tid_was_stoppedp)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Detaches a tid that was attached through
Packit Service 97d2fb
   __libdwfl_ptrace_attach. Must be given the tid_was_stopped as set
Packit Service 97d2fb
   by __libdwfl_ptrace_attach.  */
Packit Service 97d2fb
extern void __libdwfl_ptrace_detach (pid_t tid, bool tid_was_stopped)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Internal wrapper for old dwfl_module_getsym and new dwfl_module_getsym_info.
Packit Service 97d2fb
   adjust_st_value set to true returns adjusted SYM st_value, set to false
Packit Service 97d2fb
   it will not adjust SYM at all, but does match against resolved *ADDR. */
Packit Service 97d2fb
extern const char *__libdwfl_getsym (Dwfl_Module *mod, int ndx, GElf_Sym *sym,
Packit Service 97d2fb
				     GElf_Addr *addr, GElf_Word *shndxp,
Packit Service 97d2fb
				     Elf **elfp, Dwarf_Addr *biasp,
Packit Service 97d2fb
				     bool *resolved, bool adjust_st_value)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
extern void __libdwfl_module_free (Dwfl_Module *mod) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Find the main ELF file, update MOD->elferr and/or MOD->main.elf.  */
Packit Service 97d2fb
extern void __libdwfl_getelf (Dwfl_Module *mod) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Process relocations in debugging sections in an ET_REL file.
Packit Service 97d2fb
   FILE must be opened with ELF_C_READ_MMAP_PRIVATE or ELF_C_READ,
Packit Service 97d2fb
   to make it possible to relocate the data in place (or ELF_C_RDWR or
Packit Service 97d2fb
   ELF_C_RDWR_MMAP if you intend to modify the Elf file on disk).  After
Packit Service 97d2fb
   this, dwarf_begin_elf on FILE will read the relocated data.
Packit Service 97d2fb
Packit Service 97d2fb
   When DEBUG is false, apply partial relocation to all sections.  */
Packit Service 97d2fb
extern Dwfl_Error __libdwfl_relocate (Dwfl_Module *mod, Elf *file, bool debug)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Find the section index in mod->main.elf that contains the given
Packit Service 97d2fb
   *ADDR.  Adjusts *ADDR to be section relative on success, returns
Packit Service 97d2fb
   SHN_UNDEF on failure.  */
Packit Service 97d2fb
extern size_t __libdwfl_find_section_ndx (Dwfl_Module *mod, Dwarf_Addr *addr)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Process (simple) relocations in arbitrary section TSCN of an ET_REL file.
Packit Service 97d2fb
   RELOCSCN is SHT_REL or SHT_RELA and TSCN is its sh_info target section.  */
Packit Service 97d2fb
extern Dwfl_Error __libdwfl_relocate_section (Dwfl_Module *mod, Elf *relocated,
Packit Service 97d2fb
					      Elf_Scn *relocscn, Elf_Scn *tscn,
Packit Service 97d2fb
					      bool partial)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Adjust *VALUE from section-relative to absolute.
Packit Service 97d2fb
   MOD->dwfl->callbacks->section_address is called to determine the actual
Packit Service 97d2fb
   address of a loaded section.  */
Packit Service 97d2fb
extern Dwfl_Error __libdwfl_relocate_value (Dwfl_Module *mod, Elf *elf,
Packit Service 97d2fb
					    size_t *shstrndx_cache,
Packit Service 97d2fb
					    Elf32_Word shndx,
Packit Service 97d2fb
					    GElf_Addr *value)
Packit Service 97d2fb
     internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Ensure that MOD->ebl is set up.  */
Packit Service 97d2fb
extern Dwfl_Error __libdwfl_module_getebl (Dwfl_Module *mod) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Install a new Dwarf_CFI in *SLOT (MOD->eh_cfi or MOD->dwarf_cfi).  */
Packit Service 97d2fb
extern Dwarf_CFI *__libdwfl_set_cfi (Dwfl_Module *mod, Dwarf_CFI **slot,
Packit Service 97d2fb
				     Dwarf_CFI *cfi)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Iterate through all the CU's in the module.  Start by passing a null
Packit Service 97d2fb
   LASTCU, and then pass the last *CU returned.  Success return with null
Packit Service 97d2fb
   *CU no more CUs.  */
Packit Service 97d2fb
extern Dwfl_Error __libdwfl_nextcu (Dwfl_Module *mod, struct dwfl_cu *lastcu,
Packit Service 97d2fb
				    struct dwfl_cu **cu) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Find the CU by address.  */
Packit Service 97d2fb
extern Dwfl_Error __libdwfl_addrcu (Dwfl_Module *mod, Dwarf_Addr addr,
Packit Service 97d2fb
				    struct dwfl_cu **cu) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Ensure that CU->lines (and CU->cu->lines) is set up.  */
Packit Service 97d2fb
extern Dwfl_Error __libdwfl_cu_getsrclines (struct dwfl_cu *cu)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Look in ELF for an NT_GNU_BUILD_ID note.  Store it to BUILD_ID_BITS,
Packit Service 97d2fb
   its vaddr in ELF to BUILD_ID_VADDR (it is unrelocated, even if MOD is not
Packit Service 97d2fb
   NULL) and store length to BUILD_ID_LEN.  Returns -1 for errors, 1 if it was
Packit Service 97d2fb
   stored and 0 if no note is found.  MOD may be NULL, MOD must be non-NULL
Packit Service 97d2fb
   only if ELF is ET_REL.  */
Packit Service 97d2fb
extern int __libdwfl_find_elf_build_id (Dwfl_Module *mod, Elf *elf,
Packit Service 97d2fb
					const void **build_id_bits,
Packit Service 97d2fb
					GElf_Addr *build_id_elfaddr,
Packit Service 97d2fb
					int *build_id_len)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Look in ELF for an NT_GNU_BUILD_ID note.  If SET is true, store it
Packit Service 97d2fb
   in MOD and return its length.  If SET is false, instead compare it
Packit Service 97d2fb
   to that stored in MOD and return 2 if they match, 1 if they do not.
Packit Service 97d2fb
   Returns -1 for errors, 0 if no note is found.  */
Packit Service 97d2fb
extern int __libdwfl_find_build_id (Dwfl_Module *mod, bool set, Elf *elf)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Open a main or debuginfo file by its build ID, returns the fd.  */
Packit Service 97d2fb
extern int __libdwfl_open_mod_by_build_id (Dwfl_Module *mod, bool debug,
Packit Service 97d2fb
					   char **file_name) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Same, but takes an explicit build_id, can also be used for alt debug.  */
Packit Service 97d2fb
extern int __libdwfl_open_by_build_id (Dwfl_Module *mod, bool debug,
Packit Service 97d2fb
				       char **file_name, const size_t id_len,
Packit Service 97d2fb
				       const uint8_t *id) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
extern uint32_t __libdwfl_crc32 (uint32_t crc, unsigned char *buf, size_t len)
Packit Service 97d2fb
  attribute_hidden;
Packit Service 97d2fb
extern int __libdwfl_crc32_file (int fd, uint32_t *resp) attribute_hidden;
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Given ELF and some parameters return TRUE if the *P return value parameters
Packit Service 97d2fb
   have been successfully filled in.  Any of the *P parameters can be NULL.  */
Packit Service 97d2fb
extern bool __libdwfl_elf_address_range (Elf *elf, GElf_Addr base,
Packit Service 97d2fb
					 bool add_p_vaddr, bool sanity,
Packit Service 97d2fb
					 GElf_Addr *vaddrp,
Packit Service 97d2fb
					 GElf_Addr *address_syncp,
Packit Service 97d2fb
					 GElf_Addr *startp, GElf_Addr *endp,
Packit Service 97d2fb
					 GElf_Addr *biasp, GElf_Half *e_typep)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Meat of dwfl_report_elf, given elf_begin just called.
Packit Service 97d2fb
   Consumes ELF on success, not on failure.  */
Packit Service 97d2fb
extern Dwfl_Module *__libdwfl_report_elf (Dwfl *dwfl, const char *name,
Packit Service 97d2fb
					  const char *file_name, int fd,
Packit Service 97d2fb
					  Elf *elf, GElf_Addr base,
Packit Service 97d2fb
					  bool add_p_vaddr, bool sanity)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Meat of dwfl_report_offline.  */
Packit Service 97d2fb
extern Dwfl_Module *__libdwfl_report_offline (Dwfl *dwfl, const char *name,
Packit Service 97d2fb
					      const char *file_name,
Packit Service 97d2fb
					      int fd, bool closefd,
Packit Service 97d2fb
					      int (*predicate) (const char *,
Packit Service 97d2fb
								const char *))
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Free PROCESS.  Unlink and free also any structures it references.  */
Packit Service 97d2fb
extern void __libdwfl_process_free (Dwfl_Process *process)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Update STATE->unwound for the unwound frame.
Packit Service 97d2fb
   On error STATE->unwound == NULL
Packit Service 97d2fb
   or STATE->unwound->pc_state == DWFL_FRAME_STATE_ERROR;
Packit Service 97d2fb
   in such case dwfl_errno () is set.
Packit Service 97d2fb
   If STATE->unwound->pc_state == DWFL_FRAME_STATE_PC_UNDEFINED
Packit Service 97d2fb
   then STATE was the last valid frame.  */
Packit Service 97d2fb
extern void __libdwfl_frame_unwind (Dwfl_Frame *state)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Align segment START downwards or END upwards addresses according to DWFL.  */
Packit Service 97d2fb
extern GElf_Addr __libdwfl_segment_start (Dwfl *dwfl, GElf_Addr start)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
extern GElf_Addr __libdwfl_segment_end (Dwfl *dwfl, GElf_Addr end)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Decompression wrappers: decompress whole file into memory.  */
Packit Service 97d2fb
extern Dwfl_Error __libdw_gunzip  (int fd, off_t start_offset,
Packit Service 97d2fb
				   void *mapped, size_t mapped_size,
Packit Service 97d2fb
				   void **whole, size_t *whole_size)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
extern Dwfl_Error __libdw_bunzip2 (int fd, off_t start_offset,
Packit Service 97d2fb
				   void *mapped, size_t mapped_size,
Packit Service 97d2fb
				   void **whole, size_t *whole_size)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
extern Dwfl_Error __libdw_unlzma (int fd, off_t start_offset,
Packit Service 97d2fb
				  void *mapped, size_t mapped_size,
Packit Service 97d2fb
				  void **whole, size_t *whole_size)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
extern Dwfl_Error __libdw_unzstd (int fd, off_t start_offset,
Packit Service 97d2fb
				  void *mapped, size_t mapped_size,
Packit Service 97d2fb
				  void **whole, size_t *whole_size)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Skip the image header before a file image: updates *START_OFFSET.  */
Packit Service 97d2fb
extern Dwfl_Error __libdw_image_header (int fd, off_t *start_offset,
Packit Service 97d2fb
					void *mapped, size_t mapped_size)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Open Elf handle on *FDP.  This handles decompression and checks
Packit Service 97d2fb
   elf_kind.  Succeed only for ELF_K_ELF, or also ELF_K_AR if ARCHIVE_OK.
Packit Service 97d2fb
   Returns DWFL_E_NOERROR and sets *ELFP on success, resets *FDP to -1 if
Packit Service 97d2fb
   it's no longer used.  Resets *FDP on failure too iff CLOSE_ON_FAIL.  */
Packit Service 97d2fb
extern Dwfl_Error __libdw_open_file (int *fdp, Elf **elfp,
Packit Service 97d2fb
				     bool close_on_fail, bool archive_ok)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Same as __libdw_open_file, but never closes the given file
Packit Service 97d2fb
   descriptor and ELF_K_AR is always an acceptable type.  */
Packit Service 97d2fb
extern Dwfl_Error __libdw_open_elf (int fd, Elf **elfp) internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
/* Fetch PT_DYNAMIC P_VADDR from ELF and store it to *VADDRP.  Return success.
Packit Service 97d2fb
   *VADDRP is not modified if the function fails.  */
Packit Service 97d2fb
extern bool __libdwfl_dynamic_vaddr_get (Elf *elf, GElf_Addr *vaddrp)
Packit Service 97d2fb
  internal_function;
Packit Service 97d2fb
Packit Service 97d2fb
#ifdef ENABLE_LIBDEBUGINFOD
Packit Service 97d2fb
/* Internal interface to libdebuginfod (if installed).  */
Packit Service 97d2fb
int
Packit Service 97d2fb
__libdwfl_debuginfod_find_executable (Dwfl *dwfl,
Packit Service 97d2fb
				      const unsigned char *build_id_bits,
Packit Service 97d2fb
				      size_t build_id_len);
Packit Service 97d2fb
int
Packit Service 97d2fb
__libdwfl_debuginfod_find_debuginfo (Dwfl *dwfl,
Packit Service 97d2fb
				     const unsigned char *build_id_bits,
Packit Service 97d2fb
				     size_t build_id_len);
Packit Service 97d2fb
void
Packit Service 97d2fb
__libdwfl_debuginfod_end (debuginfod_client *c);
Packit Service 97d2fb
#endif
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* These are working nicely for --core, but are not ready to be
Packit Service 97d2fb
   exported interfaces quite yet.  */
Packit Service 97d2fb
Packit Service 97d2fb
/* Type of callback function ...
Packit Service 97d2fb
 */
Packit Service 97d2fb
typedef bool Dwfl_Memory_Callback (Dwfl *dwfl, int segndx,
Packit Service 97d2fb
				   void **buffer, size_t *buffer_available,
Packit Service 97d2fb
				   GElf_Addr vaddr, size_t minread, void *arg);
Packit Service 97d2fb
Packit Service 97d2fb
/* Type of callback function ...
Packit Service 97d2fb
 */
Packit Service 97d2fb
typedef bool Dwfl_Module_Callback (Dwfl_Module *mod, void **userdata,
Packit Service 97d2fb
				   const char *name, Dwarf_Addr base,
Packit Service 97d2fb
				   void **buffer, size_t *buffer_available,
Packit Service 97d2fb
				   GElf_Off cost, GElf_Off worthwhile,
Packit Service 97d2fb
				   GElf_Off whole, GElf_Off contiguous,
Packit Service 97d2fb
				   void *arg, Elf **elfp);
Packit Service 97d2fb
Packit Service 97d2fb
/* One shared library (or executable) info from DT_DEBUG link map.  */
Packit Service 97d2fb
struct r_debug_info_module
Packit Service 97d2fb
{
Packit Service 97d2fb
  struct r_debug_info_module *next;
Packit Service 97d2fb
  /* FD is -1 iff ELF is NULL.  */
Packit Service 97d2fb
  int fd;
Packit Service 97d2fb
  Elf *elf;
Packit Service 97d2fb
  GElf_Addr l_ld;
Packit Service 97d2fb
  /* START and END are both zero if not valid.  */
Packit Service 97d2fb
  GElf_Addr start, end;
Packit Service 97d2fb
  bool disk_file_has_build_id;
Packit Service 97d2fb
  char name[0];
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
/* Information gathered from DT_DEBUG by dwfl_link_map_report hinted to
Packit Service 97d2fb
   dwfl_segment_report_module.  */
Packit Service 97d2fb
struct r_debug_info
Packit Service 97d2fb
{
Packit Service 97d2fb
  struct r_debug_info_module *module;
Packit Service 97d2fb
};
Packit Service 97d2fb
Packit Service 97d2fb
/* ...
Packit Service 97d2fb
 */
Packit Service 97d2fb
extern int dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
Packit Service 97d2fb
				       Dwfl_Memory_Callback *memory_callback,
Packit Service 97d2fb
				       void *memory_callback_arg,
Packit Service 97d2fb
				       Dwfl_Module_Callback *read_eagerly,
Packit Service 97d2fb
				       void *read_eagerly_arg,
Packit Service 97d2fb
				       const void *note_file,
Packit Service 97d2fb
				       size_t note_file_size,
Packit Service 97d2fb
				       const struct r_debug_info *r_debug_info);
Packit Service 97d2fb
Packit Service 97d2fb
/* Report a module for entry in the dynamic linker's struct link_map list.
Packit Service 97d2fb
   For each link_map entry, if an existing module resides at its address,
Packit Service 97d2fb
   this just modifies that module's name and suggested file name.  If
Packit Service 97d2fb
   no such module exists, this calls dwfl_report_elf on the l_name string.
Packit Service 97d2fb
Packit Service 97d2fb
   If AUXV is not null, it points to AUXV_SIZE bytes of auxiliary vector
Packit Service 97d2fb
   data as contained in an NT_AUXV note or read from a /proc/pid/auxv
Packit Service 97d2fb
   file.  When this is available, it guides the search.  If AUXV is null
Packit Service 97d2fb
   or the memory it points to is not accessible, then this search can
Packit Service 97d2fb
   only find where to begin if the correct executable file was
Packit Service 97d2fb
   previously reported and preloaded as with dwfl_report_elf.
Packit Service 97d2fb
Packit Service 97d2fb
   Fill in R_DEBUG_INFO if it is not NULL.  It should be cleared by the
Packit Service 97d2fb
   caller, this function does not touch fields it does not need to modify.
Packit Service 97d2fb
   If R_DEBUG_INFO is not NULL then no modules get added to DWFL, caller
Packit Service 97d2fb
   has to add them from filled in R_DEBUG_INFO.
Packit Service 97d2fb
Packit Service 97d2fb
   Returns the number of modules found, or -1 for errors.  */
Packit Service 97d2fb
extern int dwfl_link_map_report (Dwfl *dwfl, const void *auxv, size_t auxv_size,
Packit Service 97d2fb
				 Dwfl_Memory_Callback *memory_callback,
Packit Service 97d2fb
				 void *memory_callback_arg,
Packit Service 97d2fb
				 struct r_debug_info *r_debug_info);
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Avoid PLT entries.  */
Packit Service 97d2fb
INTDECL (dwfl_begin)
Packit Service 97d2fb
INTDECL (dwfl_errmsg)
Packit Service 97d2fb
INTDECL (dwfl_errno)
Packit Service 97d2fb
INTDECL (dwfl_addrmodule)
Packit Service 97d2fb
INTDECL (dwfl_addrsegment)
Packit Service 97d2fb
INTDECL (dwfl_addrdwarf)
Packit Service 97d2fb
INTDECL (dwfl_addrdie)
Packit Service 97d2fb
INTDECL (dwfl_core_file_attach)
Packit Service 97d2fb
INTDECL (dwfl_core_file_report)
Packit Service 97d2fb
INTDECL (dwfl_getmodules)
Packit Service 97d2fb
INTDECL (dwfl_module_addrdie)
Packit Service 97d2fb
INTDECL (dwfl_module_address_section)
Packit Service 97d2fb
INTDECL (dwfl_module_addrinfo)
Packit Service 97d2fb
INTDECL (dwfl_module_addrsym)
Packit Service 97d2fb
INTDECL (dwfl_module_build_id)
Packit Service 97d2fb
INTDECL (dwfl_module_getdwarf)
Packit Service 97d2fb
INTDECL (dwfl_module_getelf)
Packit Service 97d2fb
INTDECL (dwfl_module_getsym)
Packit Service 97d2fb
INTDECL (dwfl_module_getsym_info)
Packit Service 97d2fb
INTDECL (dwfl_module_getsymtab)
Packit Service 97d2fb
INTDECL (dwfl_module_getsymtab_first_global)
Packit Service 97d2fb
INTDECL (dwfl_module_getsrc)
Packit Service 97d2fb
INTDECL (dwfl_module_report_build_id)
Packit Service 97d2fb
INTDECL (dwfl_report_elf)
Packit Service 97d2fb
INTDECL (dwfl_report_begin)
Packit Service 97d2fb
INTDECL (dwfl_report_begin_add)
Packit Service 97d2fb
INTDECL (dwfl_report_module)
Packit Service 97d2fb
INTDECL (dwfl_report_segment)
Packit Service 97d2fb
INTDECL (dwfl_report_offline)
Packit Service 97d2fb
INTDECL (dwfl_report_end)
Packit Service 97d2fb
INTDECL (dwfl_build_id_find_elf)
Packit Service 97d2fb
INTDECL (dwfl_build_id_find_debuginfo)
Packit Service 97d2fb
INTDECL (dwfl_standard_find_debuginfo)
Packit Service 97d2fb
INTDECL (dwfl_link_map_report)
Packit Service 97d2fb
INTDECL (dwfl_linux_kernel_find_elf)
Packit Service 97d2fb
INTDECL (dwfl_linux_kernel_module_section_address)
Packit Service 97d2fb
INTDECL (dwfl_linux_proc_attach)
Packit Service 97d2fb
INTDECL (dwfl_linux_proc_report)
Packit Service 97d2fb
INTDECL (dwfl_linux_proc_maps_report)
Packit Service 97d2fb
INTDECL (dwfl_linux_proc_find_elf)
Packit Service 97d2fb
INTDECL (dwfl_linux_kernel_report_kernel)
Packit Service 97d2fb
INTDECL (dwfl_linux_kernel_report_modules)
Packit Service 97d2fb
INTDECL (dwfl_linux_kernel_report_offline)
Packit Service 97d2fb
INTDECL (dwfl_offline_section_address)
Packit Service 97d2fb
INTDECL (dwfl_module_relocate_address)
Packit Service 97d2fb
INTDECL (dwfl_module_dwarf_cfi)
Packit Service 97d2fb
INTDECL (dwfl_module_eh_cfi)
Packit Service 97d2fb
INTDECL (dwfl_attach_state)
Packit Service 97d2fb
INTDECL (dwfl_pid)
Packit Service 97d2fb
INTDECL (dwfl_thread_dwfl)
Packit Service 97d2fb
INTDECL (dwfl_thread_tid)
Packit Service 97d2fb
INTDECL (dwfl_frame_thread)
Packit Service 97d2fb
INTDECL (dwfl_thread_state_registers)
Packit Service 97d2fb
INTDECL (dwfl_thread_state_register_pc)
Packit Service 97d2fb
INTDECL (dwfl_getthread_frames)
Packit Service 97d2fb
INTDECL (dwfl_getthreads)
Packit Service 97d2fb
INTDECL (dwfl_thread_getframes)
Packit Service 97d2fb
INTDECL (dwfl_frame_pc)
Packit Service 97d2fb
Packit Service 97d2fb
/* Leading arguments standard to callbacks passed a Dwfl_Module.  */
Packit Service 97d2fb
#define MODCB_ARGS(mod)	(mod), &(mod)->userdata, (mod)->name, (mod)->low_addr
Packit Service 97d2fb
#define CBFAIL		(errno ? DWFL_E (ERRNO, errno) : DWFL_E_CB);
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* The default used by dwfl_standard_find_debuginfo.  */
Packit Service 97d2fb
#define DEFAULT_DEBUGINFO_PATH ":.debug:/usr/lib/debug"
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
#endif	/* libdwflP.h */