libdwflP.h revision 4959bf89d92b59ba72bea5786d7b3f9b5564f750
1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Internal definitions for libdwfl.
2b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   Copyright (C) 2005 Red Hat, Inc.
3b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   This program is Open Source software; you can redistribute it and/or
5b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   modify it under the terms of the Open Software License version 1.0 as
6b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   published by the Open Source Initiative.
7b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
8b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   You should have received a copy of the Open Software License along
9b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   with this program; if not, you may obtain a copy of the Open Software
10b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   License version 1.0 from http://www.opensource.org/licenses/osl.php or
11b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
12b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   3001 King Ranch Road, Ukiah, CA 95482.   */
13b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
14b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#ifndef _LIBDWFLP_H
15b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define _LIBDWFLP_H	1
16b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
17b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#ifndef PACKAGE
18b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper# include <config.h>
19b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#endif
20b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <libdwfl.h>
21b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <libebl.h>
22b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <assert.h>
23b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <errno.h>
24b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdbool.h>
25b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdlib.h>
26b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <string.h>
27b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
284959bf89d92b59ba72bea5786d7b3f9b5564f750Roland McGrath#include "../libdw/libdwP.h"	/* We need its INTDECLs.  */
294959bf89d92b59ba72bea5786d7b3f9b5564f750Roland McGrath
30b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* gettext helper macros.  */
31b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define _(Str) dgettext ("elfutils", Str)
32b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
33b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define DWFL_ERRORS							      \
34b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (NOERROR, N_("no error"))					      \
35b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (UNKNOWN_ERROR, N_("unknown error"))			      \
36b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (NOMEM, N_("out of memory"))				      \
37b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (ERRNO, N_("See errno"))					      \
38b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (LIBELF, N_("See elf_errno"))				      \
39b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (LIBDW, N_("See dwarf_errno"))				      \
40b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (LIBEBL, N_("See ebl_errno (XXX missing)"))		      \
41b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (NOREL, N_("Callbacks missing for ET_REL file"))		      \
42b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (BADRELTYPE, N_("Unsupported relocation type"))		      \
43b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (BADRELOFF, N_("r_offset is bogus"))			      \
44b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (BADSTROFF, N_("offset out of range"))			      \
45b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (RELUNDEF, N_("relocation refers to undefined symbol"))	      \
46b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (CB, N_("Callback returned failure"))			      \
47b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (NO_DWARF, N_("No DWARF information found"))		      \
48b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (NO_SYMTAB, N_("No symbol table found"))			      \
49b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (NO_PHDR, N_("No ELF program headers"))			      \
50b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (OVERLAP, N_("address range overlaps an existing module"))	      \
51b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (ADDR_OUTOFRANGE, N_("address out of range"))		      \
52b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (NO_MATCH, N_("no matching address range"))		      \
53b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (TRUNCATED, N_("image truncated"))				      \
54b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  DWFL_ERROR (BADELF, N_("not a valid ELF file"))
55b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
56b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define DWFL_ERROR(name, text) DWFL_E_##name,
57b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppertypedef enum { DWFL_ERRORS DWFL_E_NUM } Dwfl_Error;
58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#undef	DWFL_ERROR
59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
60b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define OTHER_ERROR(name)	((unsigned int) DWFL_E_##name << 16)
61b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define DWFL_E(name, errno)	(OTHER_ERROR (name) | (errno))
62b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
63b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern int __libdwfl_canon_error (Dwfl_Error error) internal_function;
64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern void __libdwfl_seterrno (Dwfl_Error error) internal_function;
65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwfl
67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  const Dwfl_Callbacks *callbacks;
69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwfl_Module *modulelist;    /* List in order used by full traversals.  */
71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwfl_Module **modules;
73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t nmodules;
74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
75b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
76b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct dwfl_file
77b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
78b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  char *name;
79b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int fd;
80b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
81b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Elf *elf;
82b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Addr bias;		/* Actual load address - p_vaddr.  */
83b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
84b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
85b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwfl_Module
86b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
87b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwfl *dwfl;
88b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct Dwfl_Module *next;	/* Link on Dwfl.moduelist.  */
89b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
90b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  void *userdata;
91b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
92b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  char *name;			/* Iterator name for this module.  */
93b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Addr low_addr, high_addr;
94b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
95b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct dwfl_file main, debug;
96b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Ebl *ebl;
97b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  bool isrel;			/* True iff this is an ET_REL file.  */
98b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwfl_Error elferr;		/* Previous failure to open main file.  */
99b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
100b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct dwfl_file *symfile;	/* Either main or debug.  */
101b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Elf_Data *symdata;		/* Data in the ELF symbol table section.  */
102b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t syments;		/* sh_size / sh_entsize of that section.  */
103b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  const Elf_Data *symstrdata;	/* Data for its string table.  */
104b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Elf_Data *symxndxdata;	/* Data in the extended section index table. */
105b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwfl_Error symerr;		/* Previous failure to load symbols.  */
106b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
107b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf *dw;			/* libdw handle for its debugging info.  */
108b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwfl_Error dwerr;		/* Previous failure to load info.  */
109b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
110b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Known CU's in this module.  */
111b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct dwfl_cu *first_cu, **cu;
112b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unsigned int ncu;
113b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
114b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  void *lazy_cu_root;		/* Table indexed by Dwarf_Off of CU.  */
115b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unsigned int lazycu;		/* Possible users, deleted when none left.  */
116b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
117b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct dwfl_arange *aranges;	/* Mapping of addresses in module to CUs.  */
118b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unsigned int naranges;
119b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
120b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  bool gc;			/* Mark/sweep flag.  */
121b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
122b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
123b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
124b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
125b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Information cached about each CU in Dwfl_Module.dw.  */
126b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct dwfl_cu
127b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
128b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* This caches libdw information about the CU.  It's also the
129b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     address passed back to users, so we take advantage of the
130b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     fact that it's placed first to cast back.  */
131b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Die die;
132b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
133b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwfl_Module *mod;		/* Pointer back to containing module.  */
134b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
135b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct dwfl_cu *next;		/* CU immediately following in the file.  */
136b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
137b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct Dwfl_Lines *lines;
138b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
139b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
140b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct Dwfl_Lines
141b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
142b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct dwfl_cu *cu;
143b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
144b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* This is what the opaque Dwfl_Line * pointers we pass to users are.
145b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     We need to recover pointers to our struct dwfl_cu and a record in
146b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     libdw's Dwarf_Line table.  To minimize the memory used in addition
147b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     to libdw's Dwarf_Lines buffer, we just point to our own index in
148b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     this table, and have one pointer back to the CU.  The indices here
149b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     match those in libdw's Dwarf_CU.lines->info table.  */
150b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct Dwfl_Line
151b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
152b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    unsigned int idx;		/* My index in the dwfl_cu.lines table.  */
153b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  } idx[0];
154b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
155b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
156b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic inline struct dwfl_cu *
157b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperdwfl_linecu (const Dwfl_Line *line)
158b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
159b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  const struct Dwfl_Lines *lines = ((const void *) line
160b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper				    - offsetof (struct Dwfl_Lines,
161b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper						idx[line->idx]));
162b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return lines->cu;
163b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
164b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
165b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* This describes a contiguous address range that lies in a single CU.
166b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   We condense runs of Dwarf_Arange entries for the same CU into this.  */
167b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstruct dwfl_arange
168b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
169b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  struct dwfl_cu *cu;
170b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t arange;		/* Index in Dwarf_Aranges.  */
171b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper};
172b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
173b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
174b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
175b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
176b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern void __libdwfl_module_free (Dwfl_Module *mod) internal_function;
177b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
178b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
179b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Process relocations in debugging sections in an ET_REL file.
180b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   MOD->debug.elf must be opened with ELF_C_READ_MMAP_PRIVATE or ELF_C_READ,
181b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   to make it possible to relocate the data in place (or ELF_C_RDWR or
182b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   ELF_C_RDWR_MMAP if you intend to modify the Elf file on disk).  After
183b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   this, dwarf_begin_elf on MOD->debug.elf will read the relocated data.  */
184b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern Dwfl_Error __libdwfl_relocate (Dwfl_Module *) internal_function;
185b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
186b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Adjust *VALUE from section-relative to absolute.
187b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   MOD->dwfl->callbacks->section_address is called to determine the actual
188b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   address of a loaded section.  */
189b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern Dwfl_Error __libdwfl_relocate_value (Dwfl_Module *mod,
190b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					    size_t m_shstrndx,
191b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					    Elf32_Word shndx,
192b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					    GElf_Addr *value)
193b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     internal_function;
194b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
195b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Iterate through all the CU's in the module.  Start by passing a null
196b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   LASTCU, and then pass the last *CU returned.  Success return with null
197b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   *CU no more CUs.  */
198b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern Dwfl_Error __libdwfl_nextcu (Dwfl_Module *mod, struct dwfl_cu *lastcu,
199b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper				    struct dwfl_cu **cu) internal_function;
200b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
201b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Find the CU by address.  */
202b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern Dwfl_Error __libdwfl_addrcu (Dwfl_Module *mod, Dwarf_Addr addr,
203b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper				    struct dwfl_cu **cu) internal_function;
204b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
205b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Ensure that CU->lines (and CU->cu->lines) is set up.  */
206b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperextern Dwfl_Error __libdwfl_cu_getsrclines (struct dwfl_cu *cu)
207b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper     internal_function;
208b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
209b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
21018618fd74777576cc20dce341bb71be327f9ed48Ulrich Drepperextern uint32_t __libdwfl_crc32 (uint32_t crc, unsigned char *buf, size_t len)
21118618fd74777576cc20dce341bb71be327f9ed48Ulrich Drepper     attribute_hidden;
21218618fd74777576cc20dce341bb71be327f9ed48Ulrich Drepperextern int __libdwfl_crc32_file (int fd, uint32_t *resp) attribute_hidden;
21318618fd74777576cc20dce341bb71be327f9ed48Ulrich Drepper
214b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
215b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
216b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Avoid PLT entries.  */
217b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_begin)
218b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_errmsg)
219b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_addrmodule)
220b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_addrdwarf)
221b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_addrdie)
222b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_module_addrdie)
223b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_module_getdwarf)
224b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_module_getelf)
225b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_module_getsrc)
226b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_report_elf)
227b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_report_begin)
228b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_report_module)
229b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_report_end)
230b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_standard_find_debuginfo)
231b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_linux_kernel_find_elf)
232b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_linux_kernel_module_section_address)
233b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_linux_proc_report)
234b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_linux_proc_find_elf)
235b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_linux_kernel_report_kernel)
236b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDECL (dwfl_linux_kernel_report_modules)
237b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
238b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Leading arguments standard to callbacks passed a Dwfl_Module.  */
239b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define MODCB_ARGS(mod)	(mod), &(mod)->userdata, (mod)->name, (mod)->low_addr
240b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#define CBFAIL		(errno ? DWFL_E (ERRNO, errno) : DWFL_E_CB);
241b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
242b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
243b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#endif	/* libdwflP.h */
244