1cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Internal definitions for libdwfl.
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Copyright (C) 2005, 2006, 2007, 2008 Red Hat, Inc.
3cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
4cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
5cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
8cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   In addition, as a special exception, Red Hat, Inc. gives You the
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   additional right to link the code of Red Hat elfutils with code licensed
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   under any Open Source Initiative certified open source license
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   (http://www.opensource.org/licenses/index.php) which requires the
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   distribution of source code with any binary distribution and to
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   distribute linked combinations of the two.  Non-GPL Code permitted under
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this exception must only link to the code of Red Hat elfutils through
25cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   those well defined interfaces identified in the file named EXCEPTION
26cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   found in the source code files (the "Approved Interfaces").  The files
27cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   of Non-GPL Code may instantiate templates or use macros or inline
28cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   functions from the Approved Interfaces without causing the resulting
29cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   work to be covered by the GNU General Public License.  Only Red Hat,
30cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc. may make changes or additions to the list of Approved Interfaces.
31cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat's grant of this exception is conditioned upon your not adding
32cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   any new exceptions.  If you wish to add a new Approved Interface or
33cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   exception, please contact Red Hat.  You must obey the GNU General Public
34cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   License in all respects for all of the Red Hat elfutils code and other
35cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   code used in conjunction with Red Hat elfutils except the Non-GPL Code
36cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   covered by this exception.  If you modify this file, you may extend this
37cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   exception to your version of the file, but you are not obligated to do
38cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   so.  If you do not wish to provide this exception without modification,
39cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   you must delete this exception statement from your version and license
40cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this file solely under the GPL without exception.
41cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
42cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
43cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
44cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
45cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
46cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
47cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
48cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
49cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
50cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#ifndef _LIBDWFLP_H
51cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define _LIBDWFLP_H	1
52cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
53cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#ifndef PACKAGE_NAME
54cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# include <config.h>
55cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#endif
56cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <libdwfl.h>
57cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <libebl.h>
58cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <assert.h>
59cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <errno.h>
60cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <stdbool.h>
61cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <stdlib.h>
62cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include <string.h>
63cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
64cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#include "../libdw/libdwP.h"	/* We need its INTDECLs.  */
65cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
66cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* gettext helper macros.  */
67cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define _(Str) dgettext ("elfutils", Str)
68cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
69cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define DWFL_ERRORS							      \
70cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (NOERROR, N_("no error"))					      \
71cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (UNKNOWN_ERROR, N_("unknown error"))			      \
72cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (NOMEM, N_("out of memory"))				      \
73cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (ERRNO, N_("See errno"))					      \
74cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (LIBELF, N_("See elf_errno"))				      \
75cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (LIBDW, N_("See dwarf_errno"))				      \
76cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (LIBEBL, N_("See ebl_errno (XXX missing)"))		      \
77cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (UNKNOWN_MACHINE, N_("no support library found for machine"))    \
78cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (NOREL, N_("Callbacks missing for ET_REL file"))		      \
79cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (BADRELTYPE, N_("Unsupported relocation type"))		      \
80cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (BADRELOFF, N_("r_offset is bogus"))			      \
81cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (BADSTROFF, N_("offset out of range"))			      \
82cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (RELUNDEF, N_("relocation refers to undefined symbol"))	      \
83cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (CB, N_("Callback returned failure"))			      \
84cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (NO_DWARF, N_("No DWARF information found"))		      \
85cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (NO_SYMTAB, N_("No symbol table found"))			      \
86cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (NO_PHDR, N_("No ELF program headers"))			      \
87cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (OVERLAP, N_("address range overlaps an existing module"))	      \
88cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (ADDR_OUTOFRANGE, N_("address out of range"))		      \
89cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (NO_MATCH, N_("no matching address range"))		      \
90cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (TRUNCATED, N_("image truncated"))				      \
91cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (ALREADY_ELF, N_("ELF file opened"))			      \
92cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (BADELF, N_("not a valid ELF file"))			      \
93cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  DWFL_ERROR (WEIRD_TYPE, N_("cannot handle DWARF type description"))
94cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
95cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define DWFL_ERROR(name, text) DWFL_E_##name,
96cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengtypedef enum { DWFL_ERRORS DWFL_E_NUM } Dwfl_Error;
97cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#undef	DWFL_ERROR
98cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
99cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define OTHER_ERROR(name)	((unsigned int) DWFL_E_##name << 16)
100cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define DWFL_E(name, errno)	(OTHER_ERROR (name) | (errno))
101cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
102cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __libdwfl_canon_error (Dwfl_Error) internal_function;
103cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern void __libdwfl_seterrno (Dwfl_Error) internal_function;
104cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
105cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstruct Dwfl
106cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
107cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  const Dwfl_Callbacks *callbacks;
108cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
109cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwfl_Module *modulelist;    /* List in order used by full traversals.  */
110cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
111cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  GElf_Addr offline_next_address;
112cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
113cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  GElf_Addr segment_align;	/* Smallest granularity of segments.  */
114cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
115cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* Binary search table in three parallel malloc'd arrays.  */
116cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  size_t lookup_elts;		/* Elements in use.  */
117cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  size_t lookup_alloc;		/* Elements allococated.  */
118cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  GElf_Addr *lookup_addr;	/* Start address of segment.  */
119cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwfl_Module **lookup_module;	/* Module associated with segment, or null.  */
120cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  int *lookup_segndx;		/* User segment index, or -1.  */
121cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
122cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* Cache from last dwfl_report_segment call.  */
123cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  const void *lookup_tail_ident;
124cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  GElf_Off lookup_tail_vaddr;
125cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  GElf_Off lookup_tail_offset;
126cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  int lookup_tail_ndx;
127cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng};
128cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
129cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define OFFLINE_REDZONE		0x10000
130cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
131cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstruct dwfl_file
132cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
133cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  char *name;
134cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  int fd;
135cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool valid;			/* The build ID note has been matched.  */
136cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool relocated;		/* Partial relocation of all sections done.  */
137cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
138cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Elf *elf;
139cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  GElf_Addr bias;		/* Actual load address - p_vaddr.  */
140cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng};
141cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
142cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstruct Dwfl_Module
143cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
144cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwfl *dwfl;
145cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct Dwfl_Module *next;	/* Link on Dwfl.modulelist.  */
146cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
147cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  void *userdata;
148cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
149cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  char *name;			/* Iterator name for this module.  */
150cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  GElf_Addr low_addr, high_addr;
151cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
152cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  void *build_id_bits;		/* malloc'd copy of build ID bits.  */
153cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  GElf_Addr build_id_vaddr;	/* Address where they reside, 0 if unknown.  */
154cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  int build_id_len;		/* -1 for prior failure, 0 if unset.  */
155cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
156cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct dwfl_file main, debug;
157cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Ebl *ebl;
158cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  GElf_Half e_type;		/* GElf_Ehdr.e_type cache.  */
159cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwfl_Error elferr;		/* Previous failure to open main file.  */
160cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
161cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct dwfl_relocation *reloc_info; /* Relocatable sections.  */
162cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
163cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct dwfl_file *symfile;	/* Either main or debug.  */
164cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Elf_Data *symdata;		/* Data in the ELF symbol table section.  */
165cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  size_t syments;		/* sh_size / sh_entsize of that section.  */
166cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Elf_Data *symstrdata;		/* Data for its string table.  */
167cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Elf_Data *symxndxdata;	/* Data in the extended section index table. */
168cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwfl_Error symerr;		/* Previous failure to load symbols.  */
169cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
170cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf *dw;			/* libdw handle for its debugging info.  */
171cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwfl_Error dwerr;		/* Previous failure to load info.  */
172cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
173cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* Known CU's in this module.  */
174cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct dwfl_cu *first_cu, **cu;
175cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  unsigned int ncu;
176cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
177cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  void *lazy_cu_root;		/* Table indexed by Dwarf_Off of CU.  */
178cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  unsigned int lazycu;		/* Possible users, deleted when none left.  */
179cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
180cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct dwfl_arange *aranges;	/* Mapping of addresses in module to CUs.  */
181cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  unsigned int naranges;
182cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
183cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  int segment;			/* Index of first segment table entry.  */
184cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  bool gc;			/* Mark/sweep flag.  */
185cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng};
186cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
187cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
188cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
189cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Information cached about each CU in Dwfl_Module.dw.  */
190cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstruct dwfl_cu
191cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
192cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* This caches libdw information about the CU.  It's also the
193cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     address passed back to users, so we take advantage of the
194cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     fact that it's placed first to cast back.  */
195cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwarf_Die die;
196cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
197cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  Dwfl_Module *mod;		/* Pointer back to containing module.  */
198cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
199cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct dwfl_cu *next;		/* CU immediately following in the file.  */
200cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
201cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct Dwfl_Lines *lines;
202cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng};
203cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
204cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstruct Dwfl_Lines
205cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
206cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct dwfl_cu *cu;
207cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
208cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  /* This is what the opaque Dwfl_Line * pointers we pass to users are.
209cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     We need to recover pointers to our struct dwfl_cu and a record in
210cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     libdw's Dwarf_Line table.  To minimize the memory used in addition
211cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     to libdw's Dwarf_Lines buffer, we just point to our own index in
212cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     this table, and have one pointer back to the CU.  The indices here
213cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     match those in libdw's Dwarf_CU.lines->info table.  */
214cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct Dwfl_Line
215cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  {
216cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    unsigned int idx;		/* My index in the dwfl_cu.lines table.  */
217cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  } idx[0];
218cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng};
219cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
220cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstatic inline struct dwfl_cu *
221cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengdwfl_linecu_inline (const Dwfl_Line *line)
222cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
223cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  const struct Dwfl_Lines *lines = ((const void *) line
224cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				    - offsetof (struct Dwfl_Lines,
225cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng						idx[line->idx]));
226cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  return lines->cu;
227cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
228cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define dwfl_linecu dwfl_linecu_inline
229cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
230cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* This describes a contiguous address range that lies in a single CU.
231cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   We condense runs of Dwarf_Arange entries for the same CU into this.  */
232cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstruct dwfl_arange
233cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
234cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct dwfl_cu *cu;
235cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  size_t arange;		/* Index in Dwarf_Aranges.  */
236cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng};
237cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
238cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
239cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
240cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern void __libdwfl_module_free (Dwfl_Module *mod) internal_function;
241cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
242cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
243cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Process relocations in debugging sections in an ET_REL file.
244cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   FILE must be opened with ELF_C_READ_MMAP_PRIVATE or ELF_C_READ,
245cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   to make it possible to relocate the data in place (or ELF_C_RDWR or
246cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   ELF_C_RDWR_MMAP if you intend to modify the Elf file on disk).  After
247cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this, dwarf_begin_elf on FILE will read the relocated data.
248cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
249cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   When DEBUG is false, apply partial relocation to all sections.  */
250cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Dwfl_Error __libdwfl_relocate (Dwfl_Module *mod, Elf *file, bool debug)
251cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  internal_function;
252cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
253cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Process (simple) relocations in arbitrary section TSCN of an ET_REL file.
254cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   RELOCSCN is SHT_REL or SHT_RELA and TSCN is its sh_info target section.  */
255cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Dwfl_Error __libdwfl_relocate_section (Dwfl_Module *mod, Elf *relocated,
256cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					      Elf_Scn *relocscn, Elf_Scn *tscn,
257cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					      bool partial)
258cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  internal_function;
259cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
260cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Adjust *VALUE from section-relative to absolute.
261cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MOD->dwfl->callbacks->section_address is called to determine the actual
262cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   address of a loaded section.  */
263cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Dwfl_Error __libdwfl_relocate_value (Dwfl_Module *mod, Elf *elf,
264cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					    size_t *shstrndx_cache,
265cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					    Elf32_Word shndx,
266cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					    GElf_Addr *value)
267cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng     internal_function;
268cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
269cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
270cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Ensure that MOD->ebl is set up.  */
271cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Dwfl_Error __libdwfl_module_getebl (Dwfl_Module *mod) internal_function;
272cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
273cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Iterate through all the CU's in the module.  Start by passing a null
274cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   LASTCU, and then pass the last *CU returned.  Success return with null
275cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   *CU no more CUs.  */
276cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Dwfl_Error __libdwfl_nextcu (Dwfl_Module *mod, struct dwfl_cu *lastcu,
277cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				    struct dwfl_cu **cu) internal_function;
278cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
279cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Find the CU by address.  */
280cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Dwfl_Error __libdwfl_addrcu (Dwfl_Module *mod, Dwarf_Addr addr,
281cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				    struct dwfl_cu **cu) internal_function;
282cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
283cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Ensure that CU->lines (and CU->cu->lines) is set up.  */
284cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Dwfl_Error __libdwfl_cu_getsrclines (struct dwfl_cu *cu)
285cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  internal_function;
286cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
287cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Look in ELF for an NT_GNU_BUILD_ID note.  If SET is true, store it
288cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   in MOD and return its length.  If SET is false, instead compare it
289cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   to that stored in MOD and return 2 if they match, 1 if they do not.
290cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Returns -1 for errors, 0 if no note is found.  */
291cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __libdwfl_find_build_id (Dwfl_Module *mod, bool set, Elf *elf)
292cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  internal_function;
293cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
294cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Open a main or debuginfo file by its build ID, returns the fd.  */
295cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __libdwfl_open_by_build_id (Dwfl_Module *mod, bool debug,
296cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				       char **file_name) internal_function;
297cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
298cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern uint32_t __libdwfl_crc32 (uint32_t crc, unsigned char *buf, size_t len)
299cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  attribute_hidden;
300cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int __libdwfl_crc32_file (int fd, uint32_t *resp) attribute_hidden;
301cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
302cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
303cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Meat of dwfl_report_elf, given elf_begin just called.
304cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Consumes ELF on success, not on failure.  */
305cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Dwfl_Module *__libdwfl_report_elf (Dwfl *dwfl, const char *name,
306cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					  const char *file_name, int fd,
307cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					  Elf *elf, GElf_Addr base)
308cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  internal_function;
309cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
310cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Meat of dwfl_report_offline.  */
311cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern Dwfl_Module *__libdwfl_report_offline (Dwfl *dwfl, const char *name,
312cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					      const char *file_name,
313cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					      int fd, bool closefd,
314cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng					      int (*predicate) (const char *,
315cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng								const char *))
316cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  internal_function;
317cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
318cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
319cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* These are working nicely for --core, but are not ready to be
320cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   exported interfaces quite yet.  */
321cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
322cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Type of callback function ...
323cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng */
324cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengtypedef bool Dwfl_Memory_Callback (Dwfl *dwfl, int segndx,
325cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				   void **buffer, size_t *buffer_available,
326cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				   GElf_Addr vaddr, size_t minread, void *arg);
327cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
328cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Type of callback function ...
329cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng */
330cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengtypedef bool Dwfl_Module_Callback (Dwfl_Module *mod, void **userdata,
331cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				   const char *name, Dwarf_Addr base,
332cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				   void **buffer, size_t *buffer_available,
333cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				   GElf_Off cost, GElf_Off worthwhile,
334cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				   GElf_Off whole, GElf_Off contiguous,
335cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				   void *arg, Elf **elfp);
336cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
337cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* ...
338cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng */
339cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
340cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				       Dwfl_Memory_Callback *memory_callback,
341cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				       void *memory_callback_arg,
342cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				       Dwfl_Module_Callback *read_eagerly,
343cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				       void *read_eagerly_arg);
344cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
345cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Report a module for entry in the dynamic linker's struct link_map list.
346cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   For each link_map entry, if an existing module resides at its address,
347cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   this just modifies that module's name and suggested file name.  If
348cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   no such module exists, this calls dwfl_report_elf on the l_name string.
349cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
350cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   If AUXV is not null, it points to AUXV_SIZE bytes of auxiliary vector
351cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   data as contained in an NT_AUXV note or read from a /proc/pid/auxv
352cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   file.  When this is available, it guides the search.  If AUXV is null
353cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   or the memory it points to is not accessible, then this search can
354cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   only find where to begin if the correct executable file was
355cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   previously reported and preloaded as with dwfl_report_elf.
356cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
357cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Returns the number of modules found, or -1 for errors.  */
358cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int dwfl_link_map_report (Dwfl *dwfl, const void *auxv, size_t auxv_size,
359cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				 Dwfl_Memory_Callback *memory_callback,
360cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng				 void *memory_callback_arg);
361cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
362cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Examine an ET_CORE file and report modules based on its contents.  */
363cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengextern int dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const GElf_Ehdr *ehdr);
364cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
365cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
366cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Avoid PLT entries.  */
367cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_begin)
368cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_errmsg)
369cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_addrmodule)
370cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_addrsegment)
371cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_addrdwarf)
372cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_addrdie)
373cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_core_file_report)
374cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_getmodules)
375cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_addrdie)
376cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_address_section)
377cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_addrsym)
378cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_build_id)
379cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_getdwarf)
380cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_getelf)
381cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_getsym)
382cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_getsymtab)
383cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_getsrc)
384cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_report_build_id)
385cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_report_elf)
386cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_report_begin)
387cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_report_begin_add)
388cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_report_module)
389cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_report_segment)
390cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_report_offline)
391cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_report_end)
392cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_build_id_find_elf)
393cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_build_id_find_debuginfo)
394cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_standard_find_debuginfo)
395cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_link_map_report)
396cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_linux_kernel_find_elf)
397cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_linux_kernel_module_section_address)
398cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_linux_proc_report)
399cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_linux_proc_maps_report)
400cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_linux_proc_find_elf)
401cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_linux_kernel_report_kernel)
402cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_linux_kernel_report_modules)
403cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_linux_kernel_report_offline)
404cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_offline_section_address)
405cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengINTDECL (dwfl_module_relocate_address)
406cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
407cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Leading arguments standard to callbacks passed a Dwfl_Module.  */
408cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define MODCB_ARGS(mod)	(mod), &(mod)->userdata, (mod)->name, (mod)->low_addr
409cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define CBFAIL		(errno ? DWFL_E (ERRNO, errno) : DWFL_E_CB);
410cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
411cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
412cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* The default used by dwfl_standard_find_debuginfo.  */
413cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define DEFAULT_DEBUGINFO_PATH ":.debug:/usr/lib/debug"
414cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
415cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
416cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#endif	/* libdwflP.h */
417