libdwfl.h revision cc6695e2684ce93cdf8bd2da63d55d2cf49ff076
120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Interfaces for libdwfl.
220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Copyright (C) 2005, 2006, 2007, 2008 Red Hat, Inc.
320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   This file is part of Red Hat elfutils.
420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Red Hat elfutils is free software; you can redistribute it and/or modify
620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   it under the terms of the GNU General Public License as published by the
720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Free Software Foundation; version 2 of the License.
820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Red Hat elfutils is distributed in the hope that it will be useful, but
1020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   WITHOUT ANY WARRANTY; without even the implied warranty of
1120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   General Public License for more details.
1320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
1420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   You should have received a copy of the GNU General Public License along
1520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   with Red Hat elfutils; if not, write to the Free Software Foundation,
1620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
1720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
1820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   In addition, as a special exception, Red Hat, Inc. gives You the
1920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   additional right to link the code of Red Hat elfutils with code licensed
2020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   under any Open Source Initiative certified open source license
2120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   (http://www.opensource.org/licenses/index.php) which requires the
2220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   distribution of source code with any binary distribution and to
2320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   distribute linked combinations of the two.  Non-GPL Code permitted under
2420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   this exception must only link to the code of Red Hat elfutils through
2520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   those well defined interfaces identified in the file named EXCEPTION
2620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   found in the source code files (the "Approved Interfaces").  The files
2720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   of Non-GPL Code may instantiate templates or use macros or inline
2820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   functions from the Approved Interfaces without causing the resulting
2920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   work to be covered by the GNU General Public License.  Only Red Hat,
3020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Inc. may make changes or additions to the list of Approved Interfaces.
3120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Red Hat's grant of this exception is conditioned upon your not adding
3220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   any new exceptions.  If you wish to add a new Approved Interface or
3320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   exception, please contact Red Hat.  You must obey the GNU General Public
3420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   License in all respects for all of the Red Hat elfutils code and other
3520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   code used in conjunction with Red Hat elfutils except the Non-GPL Code
3620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   covered by this exception.  If you modify this file, you may extend this
3720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   exception to your version of the file, but you are not obligated to do
3820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   so.  If you do not wish to provide this exception without modification,
3920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   you must delete this exception statement from your version and license
4020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   this file solely under the GPL without exception.
4120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
4220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Red Hat elfutils is an included package of the Open Invention Network.
4320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   An included package of the Open Invention Network is a package for which
4420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Open Invention Network licensees cross-license their patents.  No patent
4520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   license is granted, either expressly or impliedly, by designation as an
4620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   included package.  Should you wish to participate in the Open Invention
4720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Network licensing program, please visit www.openinventionnetwork.com
4820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   <http://www.openinventionnetwork.com>.  */
4920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
5020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner#ifndef _LIBDWFL_H
5120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner#define _LIBDWFL_H	1
5220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
5320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner#include "libdw.h"
5420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner#include <stdio.h>
5520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
5620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Handle for a session using the library.  */
5720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnertypedef struct Dwfl Dwfl;
5820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
5920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Handle for a module.  */
6020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnertypedef struct Dwfl_Module Dwfl_Module;
6120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
6220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Handle describing a line record.  */
6320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnertypedef struct Dwfl_Line Dwfl_Line;
6420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
6520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Callbacks.  */
6620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnertypedef struct
6720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner{
6820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  int (*find_elf) (Dwfl_Module *mod, void **userdata,
6920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner		   const char *modname, Dwarf_Addr base,
7020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner		   char **file_name, Elf **elfp);
7120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
7220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  int (*find_debuginfo) (Dwfl_Module *mod, void **userdata,
7320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			 const char *modname, Dwarf_Addr base,
7420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			 const char *file_name,
7520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			 const char *debuglink_file, GElf_Word debuglink_crc,
7620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			 char **debuginfo_file_name);
7720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
7820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  /* Fill *ADDR with the loaded address of the section called SECNAME in
7920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     the given module.  Use (Dwarf_Addr) -1 if this section is omitted from
8020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     accessible memory.  This is called exactly once for each SHF_ALLOC
8120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     section that relocations affecting DWARF data refer to, so it can
8220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     easily be used to collect state about the sections referenced.  */
8320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  int (*section_address) (Dwfl_Module *mod, void **userdata,
8420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			  const char *modname, Dwarf_Addr base,
8520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			  const char *secname,
8620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			  GElf_Word shndx, const GElf_Shdr *shdr,
8720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			  Dwarf_Addr *addr);
8820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
8920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  char **debuginfo_path;	/* See dwfl_standard_find_debuginfo.  */
9020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner} Dwfl_Callbacks;
9120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
9220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
9320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner#ifdef __cplusplus
9420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern "C" {
9520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner#endif
9620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
9720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Start a new session with the library.  */
9820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl *dwfl_begin (const Dwfl_Callbacks *callbacks)
9920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  __nonnull_attribute__ (1);
10020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
10120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
10220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* End a session.  */
10320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern void dwfl_end (Dwfl *);
10420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
10520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return implementation's version string suitable for printing.  */
10620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const char *dwfl_version (Dwfl *);
10720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
10820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return error code of last failing function call.  This value is kept
10920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   separately for each thread.  */
11020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_errno (void);
11120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
11220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return error string for ERROR.  If ERROR is zero, return error string
11320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   for most recent error or NULL if none occurred.  If ERROR is -1 the
11420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   behaviour is similar to the last case except that not NULL but a legal
11520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   string is returned.  */
11620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const char *dwfl_errmsg (int err);
11720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
11820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
11920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Start reporting the current set of segments and modules to the library.
12020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   All existing segments are wiped.  Existing modules are marked to be
12120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   deleted, and will not be found via dwfl_addrmodule et al if they are not
12220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   re-reported before dwfl_report_end is called.  */
12320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern void dwfl_report_begin (Dwfl *dwfl);
12420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
12520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Report that segment NDX begins at PHDR->p_vaddr + BIAS.
12620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If NDX is < 0, the value succeeding the last call's NDX
12720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   is used instead (zero on the first call).
12820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
12920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If nonzero, the smallest PHDR->p_align value seen sets the
13020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   effective page size for the address space DWFL describes.
13120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   This is the granularity at which reported module boundary
13220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   addresses will be considered to fall in or out of a segment.
13320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
13420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns -1 for errors, or NDX (or its assigned replacement) on success.
13520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
13620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   When NDX is the value succeeding the last call's NDX (or is implicitly
13720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   so as above), IDENT is nonnull and matches the value in the last call,
13820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   and the PHDR and BIAS values reflect a segment that would be contiguous,
13920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   in both memory and file, with the last segment reported, then this
14020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   segment may be coalesced internally with preceding segments.  When given
14120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   an address inside this segment, dwfl_addrsegment may return the NDX of a
14220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   preceding contiguous segment.  To prevent coalesced segments, always
14320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   pass a null pointer for IDENT.
14420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
14520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   The values passed are not stored (except to track coalescence).
14620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   The only information that can be extracted from DWFL later is the
14720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   mapping of an address to a segment index that starts at or below
14820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   it.  Reporting segments at all is optional.  Its only benefit to
14920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   the caller is to offer this quick lookup via dwfl_addrsegment,
15020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   or use other segment-based calls.  */
15120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_report_segment (Dwfl *dwfl, int ndx,
15220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				const GElf_Phdr *phdr, GElf_Addr bias,
15320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				const void *ident);
15420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
15520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Report that a module called NAME spans addresses [START, END).
15620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns the module handle, either existing or newly allocated,
15720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   or returns a null pointer for an allocation error.  */
15820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl_Module *dwfl_report_module (Dwfl *dwfl, const char *name,
15920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					Dwarf_Addr start, Dwarf_Addr end);
16020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
16120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Report a module with start and end addresses computed from the ELF
16220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   program headers in the given file, plus BASE.  For an ET_REL file,
16320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   does a simple absolute section layout starting at BASE.
16420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   FD may be -1 to open FILE_NAME.  On success, FD is consumed by the
16520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   library, and the `find_elf' callback will not be used for this module.  */
16620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl_Module *dwfl_report_elf (Dwfl *dwfl, const char *name,
16720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				     const char *file_name, int fd,
16820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				     GElf_Addr base);
16920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
17020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Similar, but report the module for offline use.  All ET_EXEC files
17120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   being reported must be reported before any relocatable objects.
17220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If this is used, dwfl_report_module and dwfl_report_elf may not be
17320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   used in the same reporting session.  */
17420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl_Module *dwfl_report_offline (Dwfl *dwfl, const char *name,
17520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 const char *file_name, int fd);
17620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
17720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
17820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Finish reporting the current set of modules to the library.
17920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If REMOVED is not null, it's called for each module that
18020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   existed before but was not included in the current report.
18120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns a nonzero return value from the callback.
18220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   The callback may call dwfl_report_module; doing so with the
18320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   details of the module being removed prevents its removal.
18420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   DWFL cannot be used until this function has returned zero.  */
18520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_report_end (Dwfl *dwfl,
18620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			    int (*removed) (Dwfl_Module *, void *,
18720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					    const char *, Dwarf_Addr,
18820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					    void *arg),
18920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner			    void *arg);
19020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
19120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Start reporting additional modules to the library.  No calls but
19220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   dwfl_report_* can be made on DWFL until dwfl_report_end is called.
19320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   This is like dwfl_report_begin, but all the old modules are kept on.
19420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   More dwfl_report_* calls can follow to add more modules.
19520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   When dwfl_report_end is called, no old modules will be removed.  */
19620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern void dwfl_report_begin_add (Dwfl *dwfl);
19720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
19820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
19920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the name of the module, and for each non-null argument store
20020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   interesting details: *USERDATA is a location for storing your own
20120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   pointer, **USERDATA is initially null; *START and *END give the address
20220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   range covered by the module; *DWBIAS is the address bias for debugging
20320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   information, and *SYMBIAS for symbol table entries (either is -1 if not
20420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   yet accessed); *MAINFILE is the name of the ELF file, and *DEBUGFILE the
20520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   name of the debuginfo file (might be equal to *MAINFILE; either is null
20620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   if not yet accessed).  */
20720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const char *dwfl_module_info (Dwfl_Module *mod, void ***userdata,
20820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				     Dwarf_Addr *start, Dwarf_Addr *end,
20920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				     Dwarf_Addr *dwbias, Dwarf_Addr *symbias,
21020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				     const char **mainfile,
21120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				     const char **debugfile);
21220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
21320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Iterate through the modules, starting the walk with OFFSET == 0.
21420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Calls *CALLBACK for each module as long as it returns DWARF_CB_OK.
21520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   When *CALLBACK returns another value, the walk stops and the
21620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   return value can be passed as OFFSET to resume it.  Returns 0 when
21720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   there are no more modules, or -1 for errors.  */
21820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern ptrdiff_t dwfl_getmodules (Dwfl *dwfl,
21920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				  int (*callback) (Dwfl_Module *, void **,
22020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						   const char *, Dwarf_Addr,
22120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						   void *arg),
22220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				  void *arg,
22320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				  ptrdiff_t offset);
22420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
22520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Find the module containing the given address.  */
22620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl_Module *dwfl_addrmodule (Dwfl *dwfl, Dwarf_Addr address);
22720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
22820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Find the segment, if any, and module, if any, containing ADDRESS.
22920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns a segment index returned by dwfl_report_segment, or -1
23020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   if no segment matches the address.  Regardless of the return value,
23120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   *MOD is always set to the module containing ADDRESS, or to null.  */
23220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_addrsegment (Dwfl *dwfl, Dwarf_Addr address, Dwfl_Module **mod);
23320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
23420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
23520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
23620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Report the known build ID bits associated with a module.
23720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If VADDR is nonzero, it gives the absolute address where those
23820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   bits are found within the module.  This can be called at any
23920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   time, but is usually used immediately after dwfl_report_module.
24020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Once the module's main ELF file is opened, the ID note found
24120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   there takes precedence and cannot be changed.  */
24220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_module_report_build_id (Dwfl_Module *mod,
24320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					const unsigned char *bits, size_t len,
24420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					GElf_Addr vaddr)
24520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  __nonnull_attribute__ (2);
24620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
24720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Extract the build ID bits associated with a module.
24820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns -1 for errors, 0 if no ID is known, or the number of ID bytes.
24920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   When an ID is found, *BITS points to it; *VADDR is the absolute address
25020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   at which the ID bits are found within the module, or 0 if unknown.
25120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
25220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   This returns 0 when the module's main ELF file has not yet been loaded
25320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   and its build ID bits were not reported.  To ensure the ID is always
25420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   returned when determinable, call dwfl_module_getelf first.  */
25520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_module_build_id (Dwfl_Module *mod,
25620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				 const unsigned char **bits, GElf_Addr *vaddr)
25720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  __nonnull_attribute__ (2, 3);
25820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
25920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
26020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/*** Standard callbacks ***/
26120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
26220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* These standard find_elf and find_debuginfo callbacks are
26320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   controlled by a string specifying directories to look in.
26420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If `debuginfo_path' is set in the Dwfl_Callbacks structure
26520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   and the char * it points to is not null, that supplies the
26620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   string.  Otherwise a default path is used.
26720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
26820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If the first character of the string is + or - that enables or
26920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   disables CRC32 checksum validation when it's necessary.  The
27020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   remainder of the string is composed of elements separated by
27120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   colons.  Each element can start with + or - to override the
27220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   global checksum behavior.  This flag is never relevant when
27320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   working with build IDs, but it's always parsed in the path
27420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   string.  The remainder of the element indicates a directory.
27520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
27620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Searches by build ID consult only the elements naming absolute
27720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   directory paths.  They look under those directories for a link
27820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   named ".build-id/xx/yy" or ".build-id/xx/yy.debug", where "xxyy"
27920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   is the lower-case hexadecimal representation of the ID bytes.
28020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
28120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   In searches for debuginfo by name, if the remainder of the
28220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   element is empty, the directory containing the main file is
28320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   tried; if it's an absolute path name, the absolute directory path
28420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   containing the main file is taken as a subdirectory of this path;
28520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   a relative path name is taken as a subdirectory of the directory
28620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   containing the main file.  Hence for /bin/ls, the default string
28720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   ":.debug:/usr/lib/debug" says to look in /bin, then /bin/.debug,
28820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   then /usr/lib/debug/bin, for the file name in the .gnu_debuglink
28920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   section (or "ls.debug" if none was found).  */
29020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
29120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Standard find_elf callback function working solely on build ID.
29220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   This can be tried first by any find_elf callback, to use the
29320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   bits passed to dwfl_module_report_build_id, if any.  */
29420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_build_id_find_elf (Dwfl_Module *, void **,
29520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				   const char *, Dwarf_Addr,
29620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				   char **, Elf **);
29720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
29820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Standard find_debuginfo callback function working solely on build ID.
29920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   This can be tried first by any find_debuginfo callback,
30020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   to use the build ID bits from the main file when present.  */
30120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_build_id_find_debuginfo (Dwfl_Module *, void **,
30220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 const char *, Dwarf_Addr,
30320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 const char *, const char *,
30420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 GElf_Word, char **);
30520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
30620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Standard find_debuginfo callback function.
30720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If a build ID is available, this tries first to use that.
30820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If there is no build ID or no valid debuginfo found by ID,
30920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   it searches the debuginfo path by name, as described above.
31020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Any file found in the path is validated by build ID if possible,
31120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   or else by CRC32 checksum if enabled, and skipped if it does not match.  */
31220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_standard_find_debuginfo (Dwfl_Module *, void **,
31320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 const char *, Dwarf_Addr,
31420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 const char *, const char *,
31520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 GElf_Word, char **);
31620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
31720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
31820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* This callback must be used when using dwfl_offline_* to report modules,
31920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   if ET_REL is to be supported.  */
32020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_offline_section_address (Dwfl_Module *, void **,
32120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 const char *, Dwarf_Addr,
32220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 const char *, GElf_Word,
32320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 const GElf_Shdr *,
32420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 Dwarf_Addr *addr);
32520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
32620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
32720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Callbacks for working with kernel modules in the running Linux kernel.  */
32820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_linux_kernel_find_elf (Dwfl_Module *, void **,
32920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				       const char *, Dwarf_Addr,
33020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				       char **, Elf **);
33120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_linux_kernel_module_section_address (Dwfl_Module *, void **,
33220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						     const char *, Dwarf_Addr,
33320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						     const char *, GElf_Word,
33420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						     const GElf_Shdr *,
33520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						     Dwarf_Addr *addr);
33620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
33720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Call dwfl_report_elf for the running Linux kernel.
33820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns zero on success, -1 if dwfl_report_module failed,
33920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   or an errno code if opening the kernel binary failed.  */
34020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_linux_kernel_report_kernel (Dwfl *dwfl);
34120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
34220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Call dwfl_report_module for each kernel module in the running Linux kernel.
34320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns zero on success, -1 if dwfl_report_module failed,
34420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   or an errno code if reading the list of modules failed.  */
34520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_linux_kernel_report_modules (Dwfl *dwfl);
34620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
34720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Report a kernel and its modules found on disk, for offline use.
34820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If RELEASE starts with '/', it names a directory to look in;
34920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   if not, it names a directory to find under /lib/modules/;
35020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   if null, /lib/modules/`uname -r` is used.
35120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns zero on success, -1 if dwfl_report_module failed,
35220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   or an errno code if finding the files on disk failed.
35320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
35420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If PREDICATE is not null, it is called with each module to be reported;
35520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   its arguments are the module name, and the ELF file name or null if unknown,
35620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   and its return value should be zero to skip the module, one to report it,
35720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   or -1 to cause the call to fail and return errno.  */
35820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
35920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					     int (*predicate) (const char *,
36020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner							       const char *));
36120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
36220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
36320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Call dwfl_report_module for each file mapped into the address space of PID.
36420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns zero on success, -1 if dwfl_report_module failed,
36520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   or an errno code if opening the kernel binary failed.  */
36620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_linux_proc_report (Dwfl *dwfl, pid_t pid);
36720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
36820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Similar, but reads an input stream in the format of Linux /proc/PID/maps
36920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   files giving module layout, not the file for a live process.  */
37020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_linux_proc_maps_report (Dwfl *dwfl, FILE *);
37120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
37220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Trivial find_elf callback for use with dwfl_linux_proc_report.
37320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   This uses the module name as a file name directly and tries to open it
37420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   if it begin with a slash, or handles the magic string "[vdso]".  */
37520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_linux_proc_find_elf (Dwfl_Module *mod, void **userdata,
37620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				     const char *module_name, Dwarf_Addr base,
37720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				     char **file_name, Elf **);
37820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
37920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Standard argument parsing for using a standard callback set.  */
38020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerstruct argp;
38120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const struct argp *dwfl_standard_argp (void) __attribute__ ((const));
38220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
38320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
38420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/*** Relocation of addresses from Dwfl ***/
38520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
38620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the number of relocatable bases associated with the module,
38720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   which is zero for ET_EXEC and one for ET_DYN.  Returns -1 for errors.  */
38820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_module_relocations (Dwfl_Module *mod);
38920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
39020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the relocation base index associated with the *ADDRESS location,
39120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   and adjust *ADDRESS to be an offset relative to that base.
39220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns -1 for errors.  */
39320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_module_relocate_address (Dwfl_Module *mod,
39420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					 Dwarf_Addr *address);
39520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
39620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the ELF section name for the given relocation base index;
39720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   if SHNDXP is not null, set *SHNDXP to the ELF section index.
39820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   For ET_DYN, returns "" and sets *SHNDXP to SHN_ABS; the relocation
39920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   base is the runtime start address reported for the module.
40020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns null for errors.  */
40120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const char *dwfl_module_relocation_info (Dwfl_Module *mod,
40220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						unsigned int idx,
40320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						GElf_Word *shndxp);
40420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
40520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Validate that ADDRESS and ADDRESS+OFFSET lie in a known module
40620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   and both within the same contiguous region for relocation purposes.
40720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns zero for success and -1 for errors.  */
40820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_validate_address (Dwfl *dwfl,
40920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				  Dwarf_Addr address, Dwarf_Sword offset);
41020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
41120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
41220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/*** ELF access functions ***/
41320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
41420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Fetch the module main ELF file (where the allocated sections
41520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   are found) for use with libelf.  If successful, fills in *BIAS
41620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   with the difference between addresses within the loaded module
41720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   and those in symbol tables or Dwarf information referring to it.  */
41820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Elf *dwfl_module_getelf (Dwfl_Module *, GElf_Addr *bias);
41920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
42020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the number of symbols in the module's symbol table,
42120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   or -1 for errors.  */
42220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_module_getsymtab (Dwfl_Module *mod);
42320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
42420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Fetch one entry from the module's symbol table.  On errors, returns
42520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   NULL.  If successful, fills in *SYM and returns the string for st_name.
42620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   This works like gelf_getsym except that st_value is always adjusted
42720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   to an absolute value based on the module's location.  If SHNDXP is
42820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   non-null, it's set with the section index (whether from st_shndx or
42920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   extended index table).  */
43020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const char *dwfl_module_getsym (Dwfl_Module *mod, int ndx,
43120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				       GElf_Sym *sym, GElf_Word *shndxp)
43220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  __nonnull_attribute__ (3);
43320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
43420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Find the symbol that ADDRESS lies inside, and return its name.  */
43520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const char *dwfl_module_addrname (Dwfl_Module *mod, GElf_Addr address);
43620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
43720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Find the symbol that ADDRESS lies inside, and return detailed
43820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   information as for dwfl_module_getsym (above).  */
43920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const char *dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr address,
44020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					GElf_Sym *sym, GElf_Word *shndxp)
44120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  __nonnull_attribute__ (3);
44220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
44320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Find the ELF section that *ADDRESS lies inside and return it.
44420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   On success, adjusts *ADDRESS to be relative to the section,
44520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   and sets *BIAS to the difference between addresses used in
44620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   the returned section's headers and run-time addresses.  */
44720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Elf_Scn *dwfl_module_address_section (Dwfl_Module *mod,
44820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					     Dwarf_Addr *address,
44920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					     Dwarf_Addr *bias)
45020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner  __nonnull_attribute__ (2, 3);
45120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
45220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
45320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/*** Dwarf access functions ***/
45420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
45520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Fetch the module's debug information for use with libdw.
45620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   If successful, fills in *BIAS with the difference between
45720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   addresses within the loaded module and those  to use with libdw.  */
45820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwarf *dwfl_module_getdwarf (Dwfl_Module *, Dwarf_Addr *bias)
45920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     __nonnull_attribute__ (2);
46020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
46120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Get the libdw handle for each module.  */
46220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern ptrdiff_t dwfl_getdwarf (Dwfl *,
46320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				int (*callback) (Dwfl_Module *, void **,
46420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						 const char *, Dwarf_Addr,
46520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner						 Dwarf *, Dwarf_Addr, void *),
46620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				void *arg, ptrdiff_t offset);
46720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
46820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Look up the module containing ADDR and return its debugging information,
46920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   loading it if necessary.  */
47020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwarf *dwfl_addrdwarf (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Addr *bias)
47120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     __nonnull_attribute__ (3);
47220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
47320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
47420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Find the CU containing ADDR and return its DIE.  */
47520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwarf_Die *dwfl_addrdie (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Addr *bias)
47620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     __nonnull_attribute__ (3);
47720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwarf_Die *dwfl_module_addrdie (Dwfl_Module *mod,
47820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				       Dwarf_Addr addr, Dwarf_Addr *bias)
47920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     __nonnull_attribute__ (3);
48020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
48120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Iterate through the CUs, start with null for LASTCU.  */
48220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwarf_Die *dwfl_nextcu (Dwfl *dwfl, Dwarf_Die *lastcu, Dwarf_Addr *bias)
48320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     __nonnull_attribute__ (3);
48420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwarf_Die *dwfl_module_nextcu (Dwfl_Module *mod,
48520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				      Dwarf_Die *lastcu, Dwarf_Addr *bias)
48620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner     __nonnull_attribute__ (3);
48720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
48820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the module containing the CU DIE.  */
48920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl_Module *dwfl_cumodule (Dwarf_Die *cudie);
49020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
49120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
49220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Cache the source line information fo the CU and return the
49320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   number of Dwfl_Line entries it has.  */
49420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_getsrclines (Dwarf_Die *cudie, size_t *nlines);
49520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
49620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Access one line number entry within the CU.  */
49720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl_Line *dwfl_onesrcline (Dwarf_Die *cudie, size_t idx);
49820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
49920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Get source for address.  */
50020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl_Line *dwfl_module_getsrc (Dwfl_Module *mod, Dwarf_Addr addr);
50120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl_Line *dwfl_getsrc (Dwfl *dwfl, Dwarf_Addr addr);
50220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
50320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Get address for source.  */
50420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_module_getsrc_file (Dwfl_Module *mod,
50520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				    const char *fname, int lineno, int column,
50620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				    Dwfl_Line ***srcsp, size_t *nsrcs);
50720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
50820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the module containing this line record.  */
50920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwfl_Module *dwfl_linemodule (Dwfl_Line *line);
51020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
51120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the CU containing this line record.  */
51220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern Dwarf_Die *dwfl_linecu (Dwfl_Line *line);
51320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
51420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the source file name and fill in other information.
51520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Arguments may be null for unneeded fields.  */
51620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const char *dwfl_lineinfo (Dwfl_Line *line, Dwarf_Addr *addr,
51720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				  int *linep, int *colp,
51820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				  Dwarf_Word *mtime, Dwarf_Word *length);
51920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
52020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return the compilation directory (AT_comp_dir) from this line's CU.  */
52120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern const char *dwfl_line_comp_dir (Dwfl_Line *line);
52220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
52320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
52420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/*** Machine backend access functions ***/
52520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
52620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Return location expression to find return value given a
52720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   DW_TAG_subprogram, DW_TAG_subroutine_type, or similar DIE describing
52820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   function itself (whose DW_AT_type attribute describes its return type).
52920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   The given DIE must come from the given module.  Returns -1 for errors.
53020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Returns zero if the function has no return value (e.g. "void" in C).
53120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   Otherwise, *LOCOPS gets a location expression to find the return value,
53220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   and returns the number of operations in the expression.  The pointer is
53320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   permanently allocated at least as long as the module is live.  */
53420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_module_return_value_location (Dwfl_Module *mod,
53520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					      Dwarf_Die *functypedie,
53620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner					      const Dwarf_Op **locops);
53720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
53820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner/* Enumerate the DWARF register numbers and their names.
53920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   For each register, CALLBACK gets its DWARF number, a string describing
54020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   the register set (such as "integer" or "FPU"), a prefix used in
54120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   assembler syntax (such as "%" or "$", may be ""), and the name for the
54220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   register (contains identifier characters only, possibly all digits).
54320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner   The REGNAME string is valid only during the callback. */
54420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turnerextern int dwfl_module_register_names (Dwfl_Module *mod,
54520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				       int (*callback) (void *arg,
54620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner							int regno,
54720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner							const char *setname,
54820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner							const char *prefix,
54920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner							const char *regname,
55020777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner							int bits, int type),
55120777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner				       void *arg);
55220777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
55320777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
55420777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner#ifdef __cplusplus
55520777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner}
55620777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner#endif
55720777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner
55820777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner#endif	/* libdwfl.h */
55920777798f5184ef65e59bb5eb91ac9e839d7afebDavid 'Digit' Turner