Blame libdwfl/libdwfl.h

Packit 032894
/* Interfaces for libdwfl.
Packit 032894
   Copyright (C) 2005-2010, 2013 Red Hat, Inc.
Packit 032894
   This file is part of elfutils.
Packit 032894
Packit 032894
   This file is free software; you can redistribute it and/or modify
Packit 032894
   it under the terms of either
Packit 032894
Packit 032894
     * the GNU Lesser General Public License as published by the Free
Packit 032894
       Software Foundation; either version 3 of the License, or (at
Packit 032894
       your option) any later version
Packit 032894
Packit 032894
   or
Packit 032894
Packit 032894
     * the GNU General Public License as published by the Free
Packit 032894
       Software Foundation; either version 2 of the License, or (at
Packit 032894
       your option) any later version
Packit 032894
Packit 032894
   or both in parallel, as here.
Packit 032894
Packit 032894
   elfutils is distributed in the hope that it will be useful, but
Packit 032894
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 032894
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 032894
   General Public License for more details.
Packit 032894
Packit 032894
   You should have received copies of the GNU General Public License and
Packit 032894
   the GNU Lesser General Public License along with this program.  If
Packit 032894
   not, see <http://www.gnu.org/licenses/>.  */
Packit 032894
Packit 032894
#ifndef _LIBDWFL_H
Packit 032894
#define _LIBDWFL_H	1
Packit 032894
Packit 032894
#include "libdw.h"
Packit 032894
#include <stdio.h>
Packit 032894
Packit 032894
/* Handle for a session using the library.  */
Packit 032894
typedef struct Dwfl Dwfl;
Packit 032894
Packit 032894
/* Handle for a module.  */
Packit 032894
typedef struct Dwfl_Module Dwfl_Module;
Packit 032894
Packit 032894
/* Handle describing a line record.  */
Packit 032894
typedef struct Dwfl_Line Dwfl_Line;
Packit 032894
Packit 032894
/* This holds information common for all the frames of one backtrace for
Packit 032894
   a partical thread/task/TID.  Several threads belong to one Dwfl.  */
Packit 032894
typedef struct Dwfl_Thread Dwfl_Thread;
Packit 032894
Packit 032894
/* This holds everything we know about the state of the frame at a particular
Packit 032894
   PC location described by an FDE belonging to Dwfl_Thread.  */
Packit 032894
typedef struct Dwfl_Frame Dwfl_Frame;
Packit 032894
Packit 032894
/* Callbacks.  */
Packit 032894
typedef struct
Packit 032894
{
Packit 032894
  int (*find_elf) (Dwfl_Module *mod, void **userdata,
Packit 032894
		   const char *modname, Dwarf_Addr base,
Packit 032894
		   char **file_name, Elf **elfp);
Packit 032894
Packit 032894
  int (*find_debuginfo) (Dwfl_Module *mod, void **userdata,
Packit 032894
			 const char *modname, Dwarf_Addr base,
Packit 032894
			 const char *file_name,
Packit 032894
			 const char *debuglink_file, GElf_Word debuglink_crc,
Packit 032894
			 char **debuginfo_file_name);
Packit 032894
Packit 032894
  /* Fill *ADDR with the loaded address of the section called SECNAME in
Packit 032894
     the given module.  Use (Dwarf_Addr) -1 if this section is omitted from
Packit 032894
     accessible memory.  This is called exactly once for each SHF_ALLOC
Packit 032894
     section that relocations affecting DWARF data refer to, so it can
Packit 032894
     easily be used to collect state about the sections referenced.  */
Packit 032894
  int (*section_address) (Dwfl_Module *mod, void **userdata,
Packit 032894
			  const char *modname, Dwarf_Addr base,
Packit 032894
			  const char *secname,
Packit 032894
			  GElf_Word shndx, const GElf_Shdr *shdr,
Packit 032894
			  Dwarf_Addr *addr);
Packit 032894
Packit 032894
  char **debuginfo_path;	/* See dwfl_standard_find_debuginfo.  */
Packit 032894
} Dwfl_Callbacks;
Packit 032894
Packit 032894
Packit 032894
#ifdef __cplusplus
Packit 032894
extern "C" {
Packit 032894
#endif
Packit 032894
Packit 032894
/* Start a new session with the library.  */
Packit 032894
extern Dwfl *dwfl_begin (const Dwfl_Callbacks *callbacks)
Packit 032894
  __nonnull_attribute__ (1);
Packit 032894
Packit 032894
Packit 032894
/* End a session.  */
Packit 032894
extern void dwfl_end (Dwfl *);
Packit 032894
Packit 032894
/* Return implementation's version string suitable for printing.  */
Packit 032894
extern const char *dwfl_version (Dwfl *);
Packit 032894
Packit 032894
/* Return error code of last failing function call.  This value is kept
Packit 032894
   separately for each thread.  */
Packit 032894
extern int dwfl_errno (void);
Packit 032894
Packit 032894
/* Return error string for ERROR.  If ERROR is zero, return error string
Packit 032894
   for most recent error or NULL if none occurred.  If ERROR is -1 the
Packit 032894
   behaviour is similar to the last case except that not NULL but a legal
Packit 032894
   string is returned.  */
Packit 032894
extern const char *dwfl_errmsg (int err);
Packit 032894
Packit 032894
Packit 032894
/* Start reporting the current set of segments and modules to the library.
Packit 032894
   All existing segments are wiped.  Existing modules are marked to be
Packit 032894
   deleted, and will not be found via dwfl_addrmodule et al if they are not
Packit 032894
   re-reported before dwfl_report_end is called.  */
Packit 032894
extern void dwfl_report_begin (Dwfl *dwfl);
Packit 032894
Packit 032894
/* Report that segment NDX begins at PHDR->p_vaddr + BIAS.
Packit 032894
   If NDX is < 0, the value succeeding the last call's NDX
Packit Service 35cfd5
   is used instead (zero on the first call).  IDENT is ignored.
Packit 032894
Packit 032894
   If nonzero, the smallest PHDR->p_align value seen sets the
Packit 032894
   effective page size for the address space DWFL describes.
Packit 032894
   This is the granularity at which reported module boundary
Packit 032894
   addresses will be considered to fall in or out of a segment.
Packit 032894
Packit 032894
   Returns -1 for errors, or NDX (or its assigned replacement) on success.
Packit 032894
Packit Service 35cfd5
   Reporting segments at all is optional.  Its only benefit to the caller is to
Packit Service 35cfd5
   offer this quick lookup via dwfl_addrsegment, or use other segment-based
Packit Service 35cfd5
   calls.  */
Packit 032894
extern int dwfl_report_segment (Dwfl *dwfl, int ndx,
Packit 032894
				const GElf_Phdr *phdr, GElf_Addr bias,
Packit 032894
				const void *ident);
Packit 032894
Packit 032894
/* Report that a module called NAME spans addresses [START, END).
Packit 032894
   Returns the module handle, either existing or newly allocated,
Packit 032894
   or returns a null pointer for an allocation error.  */
Packit 032894
extern Dwfl_Module *dwfl_report_module (Dwfl *dwfl, const char *name,
Packit 032894
					Dwarf_Addr start, Dwarf_Addr end);
Packit 032894
Packit 032894
/* Report a module to address BASE with start and end addresses computed
Packit 032894
   from the ELF program headers in the given file - see the table below.
Packit 032894
   FD may be -1 to open FILE_NAME.  On success, FD is consumed by the
Packit 032894
   library, and the `find_elf' callback will not be used for this module.
Packit 032894
	    ADD_P_VADDR  BASE
Packit 032894
   ET_EXEC  ignored      ignored
Packit 032894
   ET_DYN   false        absolute address where to place the file
Packit 032894
	    true         start address relative to ELF's phdr p_vaddr
Packit 032894
   ET_REL   ignored      absolute address where to place the file
Packit 032894
   ET_CORE  ignored      ignored
Packit 032894
   ET_DYN ELF phdr p_vaddr address can be non-zero if the shared library
Packit 032894
   has been prelinked by tool prelink(8).  */
Packit 032894
extern Dwfl_Module *dwfl_report_elf (Dwfl *dwfl, const char *name,
Packit 032894
				     const char *file_name, int fd,
Packit 032894
				     GElf_Addr base, bool add_p_vaddr);
Packit 032894
Packit 032894
/* Similar, but report the module for offline use.  All ET_EXEC files
Packit 032894
   being reported must be reported before any relocatable objects.
Packit 032894
   If this is used, dwfl_report_module and dwfl_report_elf may not be
Packit 032894
   used in the same reporting session.  */
Packit 032894
extern Dwfl_Module *dwfl_report_offline (Dwfl *dwfl, const char *name,
Packit 032894
					 const char *file_name, int fd);
Packit 032894
Packit 032894
Packit 032894
/* Finish reporting the current set of modules to the library.
Packit 032894
   If REMOVED is not null, it's called for each module that
Packit 032894
   existed before but was not included in the current report.
Packit 032894
   Returns a nonzero return value from the callback.
Packit 032894
   The callback may call dwfl_report_module; doing so with the
Packit 032894
   details of the module being removed prevents its removal.
Packit 032894
   DWFL cannot be used until this function has returned zero.  */
Packit 032894
extern int dwfl_report_end (Dwfl *dwfl,
Packit 032894
			    int (*removed) (Dwfl_Module *, void *,
Packit 032894
					    const char *, Dwarf_Addr,
Packit 032894
					    void *arg),
Packit 032894
			    void *arg);
Packit 032894
Packit 032894
/* Start reporting additional modules to the library.  No calls but
Packit 032894
   dwfl_report_* can be made on DWFL until dwfl_report_end is called.
Packit 032894
   This is like dwfl_report_begin, but all the old modules are kept on.
Packit 032894
   More dwfl_report_* calls can follow to add more modules.
Packit 032894
   When dwfl_report_end is called, no old modules will be removed.  */
Packit 032894
extern void dwfl_report_begin_add (Dwfl *dwfl);
Packit 032894
Packit 032894
Packit 032894
/* Return the name of the module, and for each non-null argument store
Packit 032894
   interesting details: *USERDATA is a location for storing your own
Packit 032894
   pointer, **USERDATA is initially null; *START and *END give the address
Packit 032894
   range covered by the module; *DWBIAS is the address bias for debugging
Packit 032894
   information, and *SYMBIAS for symbol table entries (either is -1 if not
Packit 032894
   yet accessed); *MAINFILE is the name of the ELF file, and *DEBUGFILE the
Packit 032894
   name of the debuginfo file (might be equal to *MAINFILE; either is null
Packit 032894
   if not yet accessed).  */
Packit 032894
extern const char *dwfl_module_info (Dwfl_Module *mod, void ***userdata,
Packit 032894
				     Dwarf_Addr *start, Dwarf_Addr *end,
Packit 032894
				     Dwarf_Addr *dwbias, Dwarf_Addr *symbias,
Packit 032894
				     const char **mainfile,
Packit 032894
				     const char **debugfile);
Packit 032894
Packit 032894
/* Iterate through the modules, starting the walk with OFFSET == 0.
Packit 032894
   Calls *CALLBACK for each module as long as it returns DWARF_CB_OK.
Packit 032894
   When *CALLBACK returns another value, the walk stops and the
Packit 032894
   return value can be passed as OFFSET to resume it.  Returns 0 when
Packit 032894
   there are no more modules, or -1 for errors.  */
Packit 032894
extern ptrdiff_t dwfl_getmodules (Dwfl *dwfl,
Packit 032894
				  int (*callback) (Dwfl_Module *, void **,
Packit 032894
						   const char *, Dwarf_Addr,
Packit 032894
						   void *arg),
Packit 032894
				  void *arg,
Packit 032894
				  ptrdiff_t offset);
Packit 032894
Packit 032894
/* Find the module containing the given address.  */
Packit 032894
extern Dwfl_Module *dwfl_addrmodule (Dwfl *dwfl, Dwarf_Addr address);
Packit 032894
Packit 032894
/* Find the segment, if any, and module, if any, containing ADDRESS.
Packit 032894
   Returns a segment index returned by dwfl_report_segment, or -1
Packit 032894
   if no segment matches the address.  Regardless of the return value,
Packit 032894
   *MOD is always set to the module containing ADDRESS, or to null.  */
Packit 032894
extern int dwfl_addrsegment (Dwfl *dwfl, Dwarf_Addr address, Dwfl_Module **mod);
Packit 032894
Packit 032894
Packit 032894
Packit 032894
/* Report the known build ID bits associated with a module.
Packit 032894
   If VADDR is nonzero, it gives the absolute address where those
Packit 032894
   bits are found within the module.  This can be called at any
Packit 032894
   time, but is usually used immediately after dwfl_report_module.
Packit 032894
   Once the module's main ELF file is opened, the ID note found
Packit 032894
   there takes precedence and cannot be changed.  */
Packit 032894
extern int dwfl_module_report_build_id (Dwfl_Module *mod,
Packit 032894
					const unsigned char *bits, size_t len,
Packit 032894
					GElf_Addr vaddr)
Packit 032894
  __nonnull_attribute__ (2);
Packit 032894
Packit 032894
/* Extract the build ID bits associated with a module.
Packit 032894
   Returns -1 for errors, 0 if no ID is known, or the number of ID bytes.
Packit 032894
   When an ID is found, *BITS points to it; *VADDR is the absolute address
Packit 032894
   at which the ID bits are found within the module, or 0 if unknown.
Packit 032894
Packit 032894
   This returns 0 when the module's main ELF file has not yet been loaded
Packit 032894
   and its build ID bits were not reported.  To ensure the ID is always
Packit 032894
   returned when determinable, call dwfl_module_getelf first.  */
Packit 032894
extern int dwfl_module_build_id (Dwfl_Module *mod,
Packit 032894
				 const unsigned char **bits, GElf_Addr *vaddr)
Packit 032894
  __nonnull_attribute__ (2, 3);
Packit 032894
Packit 032894
Packit 032894
/*** Standard callbacks ***/
Packit 032894
Packit 032894
/* These standard find_elf and find_debuginfo callbacks are
Packit 032894
   controlled by a string specifying directories to look in.
Packit 032894
   If `debuginfo_path' is set in the Dwfl_Callbacks structure
Packit 032894
   and the char * it points to is not null, that supplies the
Packit 032894
   string.  Otherwise a default path is used.
Packit 032894
Packit 032894
   If the first character of the string is + or - that enables or
Packit 032894
   disables CRC32 checksum validation when it's necessary.  The
Packit 032894
   remainder of the string is composed of elements separated by
Packit 032894
   colons.  Each element can start with + or - to override the
Packit 032894
   global checksum behavior.  This flag is never relevant when
Packit 032894
   working with build IDs, but it's always parsed in the path
Packit 032894
   string.  The remainder of the element indicates a directory.
Packit 032894
Packit 032894
   Searches by build ID consult only the elements naming absolute
Packit 032894
   directory paths.  They look under those directories for a link
Packit 032894
   named ".build-id/xx/yy" or ".build-id/xx/yy.debug", where "xxyy"
Packit 032894
   is the lower-case hexadecimal representation of the ID bytes.
Packit 032894
Packit 032894
   In searches for debuginfo by name, if the remainder of the
Packit 032894
   element is empty, the directory containing the main file is
Packit 032894
   tried; if it's an absolute path name, the absolute directory path
Packit 032894
   (and any subdirectory of that path) containing the main file is
Packit 032894
   taken as a subdirectory of this path; a relative path name is taken
Packit 032894
   as a subdirectory of the directory containing the main file.
Packit 032894
   Hence for /usr/bin/ls, the default string ":.debug:/usr/lib/debug"
Packit 032894
   says to look in /usr/bin, then /usr/bin/.debug, then the path subdirs
Packit 032894
   under /usr/lib/debug, in the order /usr/lib/debug/usr/bin, then
Packit 032894
   /usr/lib/debug/bin, and finally /usr/lib/debug, for the file name in
Packit 032894
   the .gnu_debuglink section (or "ls.debug" if none was found).  */
Packit 032894
Packit 032894
/* Standard find_elf callback function working solely on build ID.
Packit 032894
   This can be tried first by any find_elf callback, to use the
Packit 032894
   bits passed to dwfl_module_report_build_id, if any.  */
Packit 032894
extern int dwfl_build_id_find_elf (Dwfl_Module *, void **,
Packit 032894
				   const char *, Dwarf_Addr,
Packit 032894
				   char **, Elf **);
Packit 032894
Packit 032894
/* Standard find_debuginfo callback function working solely on build ID.
Packit 032894
   This can be tried first by any find_debuginfo callback,
Packit 032894
   to use the build ID bits from the main file when present.  */
Packit 032894
extern int dwfl_build_id_find_debuginfo (Dwfl_Module *, void **,
Packit 032894
					 const char *, Dwarf_Addr,
Packit 032894
					 const char *, const char *,
Packit 032894
					 GElf_Word, char **);
Packit 032894
Packit 032894
/* Standard find_debuginfo callback function.
Packit 032894
   If a build ID is available, this tries first to use that.
Packit 032894
   If there is no build ID or no valid debuginfo found by ID,
Packit 032894
   it searches the debuginfo path by name, as described above.
Packit 032894
   Any file found in the path is validated by build ID if possible,
Packit 032894
   or else by CRC32 checksum if enabled, and skipped if it does not match.  */
Packit 032894
extern int dwfl_standard_find_debuginfo (Dwfl_Module *, void **,
Packit 032894
					 const char *, Dwarf_Addr,
Packit 032894
					 const char *, const char *,
Packit 032894
					 GElf_Word, char **);
Packit 032894
Packit 032894
Packit 032894
/* This callback must be used when using dwfl_offline_* to report modules,
Packit 032894
   if ET_REL is to be supported.  */
Packit 032894
extern int dwfl_offline_section_address (Dwfl_Module *, void **,
Packit 032894
					 const char *, Dwarf_Addr,
Packit 032894
					 const char *, GElf_Word,
Packit 032894
					 const GElf_Shdr *,
Packit 032894
					 Dwarf_Addr *addr);
Packit 032894
Packit 032894
Packit 032894
/* Callbacks for working with kernel modules in the running Linux kernel.  */
Packit 032894
extern int dwfl_linux_kernel_find_elf (Dwfl_Module *, void **,
Packit 032894
				       const char *, Dwarf_Addr,
Packit 032894
				       char **, Elf **);
Packit 032894
extern int dwfl_linux_kernel_module_section_address (Dwfl_Module *, void **,
Packit 032894
						     const char *, Dwarf_Addr,
Packit 032894
						     const char *, GElf_Word,
Packit 032894
						     const GElf_Shdr *,
Packit 032894
						     Dwarf_Addr *addr);
Packit 032894
Packit 032894
/* Call dwfl_report_elf for the running Linux kernel.
Packit 032894
   Returns zero on success, -1 if dwfl_report_module failed,
Packit 032894
   or an errno code if opening the kernel binary failed.  */
Packit 032894
extern int dwfl_linux_kernel_report_kernel (Dwfl *dwfl);
Packit 032894
Packit 032894
/* Call dwfl_report_module for each kernel module in the running Linux kernel.
Packit 032894
   Returns zero on success, -1 if dwfl_report_module failed,
Packit 032894
   or an errno code if reading the list of modules failed.  */
Packit 032894
extern int dwfl_linux_kernel_report_modules (Dwfl *dwfl);
Packit 032894
Packit 032894
/* Report a kernel and its modules found on disk, for offline use.
Packit 032894
   If RELEASE starts with '/', it names a directory to look in;
Packit 032894
   if not, it names a directory to find under /lib/modules/;
Packit 032894
   if null, /lib/modules/`uname -r` is used.
Packit 032894
   Returns zero on success, -1 if dwfl_report_module failed,
Packit 032894
   or an errno code if finding the files on disk failed.
Packit 032894
Packit 032894
   If PREDICATE is not null, it is called with each module to be reported;
Packit 032894
   its arguments are the module name, and the ELF file name or null if unknown,
Packit 032894
   and its return value should be zero to skip the module, one to report it,
Packit 032894
   or -1 to cause the call to fail and return errno.  */
Packit 032894
extern int dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
Packit 032894
					     int (*predicate) (const char *,
Packit 032894
							       const char *));
Packit 032894
Packit 032894
/* Examine an ET_CORE file and report modules based on its contents.
Packit 032894
   This can follow a dwfl_report_offline call to bootstrap the
Packit 032894
   DT_DEBUG method of following the dynamic linker link_map chain, in
Packit 032894
   case the core file does not contain enough of the executable's text
Packit 032894
   segment to locate its PT_DYNAMIC in the dump.  In such case you need to
Packit 032894
   supply non-NULL EXECUTABLE, otherwise dynamic libraries will not be loaded
Packit 032894
   into the DWFL map.  This might call dwfl_report_elf on file names found in
Packit 032894
   the dump if reading some link_map files is the only way to ascertain those
Packit 032894
   modules' addresses.  Returns the number of modules reported, or -1 for
Packit 032894
   errors.  */
Packit 032894
extern int dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable);
Packit 032894
Packit 032894
/* Call dwfl_report_module for each file mapped into the address space of PID.
Packit 032894
   Returns zero on success, -1 if dwfl_report_module failed,
Packit 032894
   or an errno code if opening the proc files failed.  */
Packit 032894
extern int dwfl_linux_proc_report (Dwfl *dwfl, pid_t pid);
Packit 032894
Packit 032894
/* Similar, but reads an input stream in the format of Linux /proc/PID/maps
Packit 032894
   files giving module layout, not the file for a live process.  */
Packit 032894
extern int dwfl_linux_proc_maps_report (Dwfl *dwfl, FILE *);
Packit 032894
Packit 032894
/* Trivial find_elf callback for use with dwfl_linux_proc_report.
Packit 032894
   This uses the module name as a file name directly and tries to open it
Packit 032894
   if it begin with a slash, or handles the magic string "[vdso]".  */
Packit 032894
extern int dwfl_linux_proc_find_elf (Dwfl_Module *mod, void **userdata,
Packit 032894
				     const char *module_name, Dwarf_Addr base,
Packit 032894
				     char **file_name, Elf **);
Packit 032894
Packit 032894
/* Standard argument parsing for using a standard callback set.  */
Packit 032894
struct argp;
Packit 032894
extern const struct argp *dwfl_standard_argp (void) __const_attribute__;
Packit 032894
Packit 032894
Packit 032894
/*** Relocation of addresses from Dwfl ***/
Packit 032894
Packit 032894
/* Return the number of relocatable bases associated with the module,
Packit 032894
   which is zero for ET_EXEC and one for ET_DYN.  Returns -1 for errors.  */
Packit 032894
extern int dwfl_module_relocations (Dwfl_Module *mod);
Packit 032894
Packit 032894
/* Return the relocation base index associated with the *ADDRESS location,
Packit 032894
   and adjust *ADDRESS to be an offset relative to that base.
Packit 032894
   Returns -1 for errors.  */
Packit 032894
extern int dwfl_module_relocate_address (Dwfl_Module *mod,
Packit 032894
					 Dwarf_Addr *address);
Packit 032894
Packit 032894
/* Return the ELF section name for the given relocation base index;
Packit 032894
   if SHNDXP is not null, set *SHNDXP to the ELF section index.
Packit 032894
   For ET_DYN, returns "" and sets *SHNDXP to SHN_ABS; the relocation
Packit 032894
   base is the runtime start address reported for the module.
Packit 032894
   Returns null for errors.  */
Packit 032894
extern const char *dwfl_module_relocation_info (Dwfl_Module *mod,
Packit 032894
						unsigned int idx,
Packit 032894
						GElf_Word *shndxp);
Packit 032894
Packit 032894
/* Validate that ADDRESS and ADDRESS+OFFSET lie in a known module
Packit 032894
   and both within the same contiguous region for relocation purposes.
Packit 032894
   Returns zero for success and -1 for errors.  */
Packit 032894
extern int dwfl_validate_address (Dwfl *dwfl,
Packit 032894
				  Dwarf_Addr address, Dwarf_Sword offset);
Packit 032894
Packit 032894
Packit 032894
/*** ELF access functions ***/
Packit 032894
Packit 032894
/* Fetch the module main ELF file (where the allocated sections
Packit 032894
   are found) for use with libelf.  If successful, fills in *BIAS
Packit 032894
   with the difference between addresses within the loaded module
Packit 032894
   and those in symbol tables or Dwarf information referring to it.  */
Packit 032894
extern Elf *dwfl_module_getelf (Dwfl_Module *, GElf_Addr *bias)
Packit 032894
  __nonnull_attribute__ (2);
Packit 032894
Packit 032894
/* Return the number of symbols in the module's symbol table,
Packit 032894
   or -1 for errors.  */
Packit 032894
extern int dwfl_module_getsymtab (Dwfl_Module *mod);
Packit 032894
Packit 032894
/* Return the index of the first global symbol in the module's symbol
Packit 032894
   table, or -1 for errors.  In each symbol table, all symbols with
Packit 032894
   STB_LOCAL binding precede the weak and global symbols.  This
Packit 032894
   function returns the symbol table index one greater than the last
Packit 032894
   local symbol.  */
Packit 032894
extern int dwfl_module_getsymtab_first_global (Dwfl_Module *mod);
Packit 032894
Packit 032894
/* Fetch one entry from the module's symbol table.  On errors, returns
Packit 032894
   NULL.  If successful, fills in *SYM and returns the string for st_name.
Packit 032894
   This works like gelf_getsym except that st_value is always adjusted to
Packit 032894
   an absolute value based on the module's location, when the symbol is in
Packit 032894
   an SHF_ALLOC section.  If SHNDXP is non-null, it's set with the section
Packit 032894
   index (whether from st_shndx or extended index table); in case of a
Packit 032894
   symbol in a non-allocated section, *SHNDXP is instead set to -1.
Packit 032894
   Note that since symbols can come from either the main, debug or auxiliary
Packit 032894
   ELF symbol file (either dynsym or symtab) the section index can only
Packit 032894
   be reliably used to compare against special section constants like
Packit 032894
   SHN_UNDEF or SHN_ABS.  It is recommended to use dwfl_module_getsym_info
Packit 032894
   which doesn't have these deficiencies.  */
Packit 032894
extern const char *dwfl_module_getsym (Dwfl_Module *mod, int ndx,
Packit 032894
				       GElf_Sym *sym, GElf_Word *shndxp)
Packit 032894
  __nonnull_attribute__ (3);
Packit 032894
Packit 032894
/* Fetch one entry from the module's symbol table and the associated
Packit 032894
   address value.  On errors, returns NULL.  If successful, fills in
Packit 032894
   *SYM, *ADDR and returns the string for st_name.  This works like
Packit 032894
   gelf_getsym.  *ADDR is set to the st_value adjusted to an absolute
Packit 032894
   value based on the module's location, when the symbol is in an
Packit 032894
   SHF_ALLOC section.  For non-ET_REL files, if the arch uses function
Packit 032894
   descriptors, and the st_value points to one, *ADDR will be resolved
Packit 032894
   to the actual function entry address.  The SYM->ST_VALUE itself
Packit 032894
   isn't adjusted in any way.  Fills in ELFP, if not NULL, with the
Packit 032894
   ELF file the symbol originally came from.  Note that symbols can
Packit 032894
   come from either the main, debug or auxiliary ELF symbol file
Packit 032894
   (either dynsym or symtab).  If SHNDXP is non-null, it's set with
Packit 032894
   the section index (whether from st_shndx or extended index table);
Packit 032894
   in case of a symbol in a non-allocated section, *SHNDXP is instead
Packit 032894
   set to -1.  Fills in BIAS, if not NULL, with the difference between
Packit 032894
   addresses within the loaded module and those in symbol table of the
Packit 032894
   ELF file.  Note that the address associated with the symbol might
Packit 032894
   be in a different section than the returned symbol.  The section in
Packit 032894
   the main elf file in which returned ADDR falls can be found with
Packit 032894
   dwfl_module_address_section.  */
Packit 032894
extern const char *dwfl_module_getsym_info (Dwfl_Module *mod, int ndx,
Packit 032894
					    GElf_Sym *sym, GElf_Addr *addr,
Packit 032894
					    GElf_Word *shndxp,
Packit 032894
					    Elf **elfp, Dwarf_Addr *bias)
Packit 032894
  __nonnull_attribute__ (3, 4);
Packit 032894
Packit 032894
/* Find the symbol that ADDRESS lies inside, and return its name.  */
Packit 032894
extern const char *dwfl_module_addrname (Dwfl_Module *mod, GElf_Addr address);
Packit 032894
Packit 032894
/* Find the symbol associated with ADDRESS.  Return its name or NULL
Packit 032894
   when nothing was found.  If the architecture uses function
Packit 032894
   descriptors, and symbol st_value points to one, ADDRESS wil be
Packit 032894
   matched against either the adjusted st_value or the associated
Packit 032894
   function entry value as described in dwfl_module_getsym_info.  If
Packit 032894
   OFFSET is not NULL it will be filled in with the difference from
Packit 032894
   the start of the symbol (or function entry).  If SYM is not NULL it
Packit 032894
   is filled in with the symbol associated with the matched ADDRESS.
Packit 032894
   The SYM->ST_VALUE itself isn't adjusted in any way.  Fills in ELFP,
Packit 032894
   if not NULL, with the ELF file the symbol originally came from.
Packit 032894
   Note that symbols can come from either the main, debug or auxiliary
Packit 032894
   ELF symbol file (either dynsym or symtab).  If SHNDXP is non-null,
Packit 032894
   it's set with the section index (whether from st_shndx or extended
Packit 032894
   index table).  Fills in BIAS, if not NULL, with the difference
Packit 032894
   between addresses within the loaded module and those in symbol
Packit 032894
   table of the ELF file.  Note that the address matched against the
Packit 032894
   symbol might be in a different section than the returned symbol.
Packit 032894
   The section in the main elf file in ADDRESS falls can be found with
Packit 032894
   dwfl_module_address_section.  */
Packit 032894
extern const char *dwfl_module_addrinfo (Dwfl_Module *mod, GElf_Addr address,
Packit 032894
					 GElf_Off *offset, GElf_Sym *sym,
Packit 032894
					 GElf_Word *shndxp, Elf **elfp,
Packit 032894
					 Dwarf_Addr *bias)
Packit 032894
  __nonnull_attribute__ (3);
Packit 032894
Packit 032894
/* Find the symbol that ADDRESS lies inside, and return detailed
Packit 032894
   information as for dwfl_module_getsym (above).  Note that like
Packit 032894
   dwfl_module_getsym this function also adjusts SYM->ST_VALUE to an
Packit 032894
   absolute value based on the module's location.  ADDRESS is only
Packit 032894
   matched against this adjusted SYM->ST_VALUE.  This means that
Packit 032894
   depending on architecture this might only match symbols that
Packit 032894
   represent function descriptor addresses (and not function entry
Packit 032894
   addresses).  For these reasons it is recommended to use
Packit 032894
   dwfl_module_addrinfo instead.  */
Packit 032894
extern const char *dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr address,
Packit 032894
					GElf_Sym *sym, GElf_Word *shndxp)
Packit 032894
  __nonnull_attribute__ (3);
Packit 032894
Packit 032894
/* Find the ELF section that *ADDRESS lies inside and return it.
Packit 032894
   On success, adjusts *ADDRESS to be relative to the section,
Packit 032894
   and sets *BIAS to the difference between addresses used in
Packit 032894
   the returned section's headers and run-time addresses.  */
Packit 032894
extern Elf_Scn *dwfl_module_address_section (Dwfl_Module *mod,
Packit 032894
					     Dwarf_Addr *address,
Packit 032894
					     Dwarf_Addr *bias)
Packit 032894
  __nonnull_attribute__ (2, 3);
Packit 032894
Packit 032894
Packit 032894
/*** Dwarf access functions ***/
Packit 032894
Packit 032894
/* Fetch the module's debug information for use with libdw.
Packit 032894
   If successful, fills in *BIAS with the difference between
Packit 032894
   addresses within the loaded module and those  to use with libdw.  */
Packit 032894
extern Dwarf *dwfl_module_getdwarf (Dwfl_Module *, Dwarf_Addr *bias)
Packit 032894
     __nonnull_attribute__ (2);
Packit 032894
Packit 032894
/* Get the libdw handle for each module.  */
Packit 032894
extern ptrdiff_t dwfl_getdwarf (Dwfl *,
Packit 032894
				int (*callback) (Dwfl_Module *, void **,
Packit 032894
						 const char *, Dwarf_Addr,
Packit 032894
						 Dwarf *, Dwarf_Addr, void *),
Packit 032894
				void *arg, ptrdiff_t offset);
Packit 032894
Packit 032894
/* Look up the module containing ADDR and return its debugging information,
Packit 032894
   loading it if necessary.  */
Packit 032894
extern Dwarf *dwfl_addrdwarf (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Addr *bias)
Packit 032894
     __nonnull_attribute__ (3);
Packit 032894
Packit 032894
Packit 032894
/* Find the CU containing ADDR and return its DIE.  */
Packit 032894
extern Dwarf_Die *dwfl_addrdie (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Addr *bias)
Packit 032894
     __nonnull_attribute__ (3);
Packit 032894
extern Dwarf_Die *dwfl_module_addrdie (Dwfl_Module *mod,
Packit 032894
				       Dwarf_Addr addr, Dwarf_Addr *bias)
Packit 032894
     __nonnull_attribute__ (3);
Packit 032894
Packit 032894
/* Iterate through the CUs, start with null for LASTCU.  */
Packit 032894
extern Dwarf_Die *dwfl_nextcu (Dwfl *dwfl, Dwarf_Die *lastcu, Dwarf_Addr *bias)
Packit 032894
     __nonnull_attribute__ (3);
Packit 032894
extern Dwarf_Die *dwfl_module_nextcu (Dwfl_Module *mod,
Packit 032894
				      Dwarf_Die *lastcu, Dwarf_Addr *bias)
Packit 032894
     __nonnull_attribute__ (3);
Packit 032894
Packit 032894
/* Return the module containing the CU DIE.  */
Packit 032894
extern Dwfl_Module *dwfl_cumodule (Dwarf_Die *cudie);
Packit 032894
Packit 032894
Packit 032894
/* Cache the source line information fo the CU and return the
Packit 032894
   number of Dwfl_Line entries it has.  */
Packit 032894
extern int dwfl_getsrclines (Dwarf_Die *cudie, size_t *nlines);
Packit 032894
Packit 032894
/* Access one line number entry within the CU.  */
Packit 032894
extern Dwfl_Line *dwfl_onesrcline (Dwarf_Die *cudie, size_t idx);
Packit 032894
Packit 032894
/* Get source for address.  */
Packit 032894
extern Dwfl_Line *dwfl_module_getsrc (Dwfl_Module *mod, Dwarf_Addr addr);
Packit 032894
extern Dwfl_Line *dwfl_getsrc (Dwfl *dwfl, Dwarf_Addr addr);
Packit 032894
Packit 032894
/* Get address for source.  */
Packit 032894
extern int dwfl_module_getsrc_file (Dwfl_Module *mod,
Packit 032894
				    const char *fname, int lineno, int column,
Packit 032894
				    Dwfl_Line ***srcsp, size_t *nsrcs);
Packit 032894
Packit 032894
/* Return the module containing this line record.  */
Packit 032894
extern Dwfl_Module *dwfl_linemodule (Dwfl_Line *line);
Packit 032894
Packit 032894
/* Return the CU containing this line record.  */
Packit 032894
extern Dwarf_Die *dwfl_linecu (Dwfl_Line *line);
Packit 032894
Packit 032894
/* Return the source file name and fill in other information.
Packit 032894
   Arguments may be null for unneeded fields.  */
Packit 032894
extern const char *dwfl_lineinfo (Dwfl_Line *line, Dwarf_Addr *addr,
Packit 032894
				  int *linep, int *colp,
Packit 032894
				  Dwarf_Word *mtime, Dwarf_Word *length);
Packit 032894
Packit 032894
  /* Return the equivalent Dwarf_Line and the bias to apply to its address.  */
Packit 032894
extern Dwarf_Line *dwfl_dwarf_line (Dwfl_Line *line, Dwarf_Addr *bias);
Packit 032894
Packit 032894
/* Return the compilation directory (AT_comp_dir) from this line's CU.  */
Packit 032894
extern const char *dwfl_line_comp_dir (Dwfl_Line *line);
Packit 032894
Packit 032894
Packit 032894
/*** Machine backend access functions ***/
Packit 032894
Packit 032894
/* Return location expression to find return value given a
Packit 032894
   DW_TAG_subprogram, DW_TAG_subroutine_type, or similar DIE describing
Packit 032894
   function itself (whose DW_AT_type attribute describes its return type).
Packit 032894
   The given DIE must come from the given module.  Returns -1 for errors.
Packit 032894
   Returns zero if the function has no return value (e.g. "void" in C).
Packit 032894
   Otherwise, *LOCOPS gets a location expression to find the return value,
Packit 032894
   and returns the number of operations in the expression.  The pointer is
Packit 032894
   permanently allocated at least as long as the module is live.  */
Packit 032894
extern int dwfl_module_return_value_location (Dwfl_Module *mod,
Packit 032894
					      Dwarf_Die *functypedie,
Packit 032894
					      const Dwarf_Op **locops);
Packit 032894
Packit 032894
/* Enumerate the DWARF register numbers and their names.
Packit 032894
   For each register, CALLBACK gets its DWARF number, a string describing
Packit 032894
   the register set (such as "integer" or "FPU"), a prefix used in
Packit 032894
   assembler syntax (such as "%" or "$", may be ""), and the name for the
Packit 032894
   register (contains identifier characters only, possibly all digits).
Packit 032894
   The REGNAME string is valid only during the callback. */
Packit 032894
extern int dwfl_module_register_names (Dwfl_Module *mod,
Packit 032894
				       int (*callback) (void *arg,
Packit 032894
							int regno,
Packit 032894
							const char *setname,
Packit 032894
							const char *prefix,
Packit 032894
							const char *regname,
Packit 032894
							int bits, int type),
Packit 032894
				       void *arg);
Packit 032894
Packit 032894
Packit 032894
/* Find the CFI for this module.  Returns NULL if there is no CFI.
Packit 032894
   On success, fills in *BIAS with the difference between addresses
Packit 032894
   within the loaded module and those in the CFI referring to it.
Packit 032894
   The pointer returned can be used until the module is cleaned up.
Packit 032894
   Calling these more than once returns the same pointers.
Packit 032894
Packit 032894
   dwfl_module_dwarf_cfi gets the '.debug_frame' information found with the
Packit 032894
   rest of the DWARF information.  dwfl_module_eh_cfi gets the '.eh_frame'
Packit 032894
   information found linked into the text.  A module might have either or
Packit 032894
   both.  */
Packit 032894
extern Dwarf_CFI *dwfl_module_dwarf_cfi (Dwfl_Module *mod, Dwarf_Addr *bias);
Packit 032894
extern Dwarf_CFI *dwfl_module_eh_cfi (Dwfl_Module *mod, Dwarf_Addr *bias);
Packit 032894
Packit 032894
Packit 032894
typedef struct
Packit 032894
{
Packit 032894
  /* Called to iterate through threads.  Returns next TID (thread ID) on
Packit 032894
     success, a negative number on failure and zero if there are no more
Packit 032894
     threads.  dwfl_errno () should be set if negative number has been
Packit 032894
     returned.  *THREAD_ARGP is NULL on first call, and may be optionally
Packit 032894
     set by the implementation. The value set by the implementation will
Packit 032894
     be passed in on the next call to NEXT_THREAD.  THREAD_ARGP is never
Packit 032894
     NULL.  *THREAD_ARGP will be passed to set_initial_registers or
Packit 032894
     thread_detach callbacks together with Dwfl_Thread *thread.  This
Packit 032894
     method must not be NULL.  */
Packit 032894
  pid_t (*next_thread) (Dwfl *dwfl, void *dwfl_arg, void **thread_argp)
Packit 032894
    __nonnull_attribute__ (1);
Packit 032894
Packit 032894
  /* Called to get a specific thread.  Returns true if there is a
Packit 032894
     thread with the given thread id number, returns false if no such
Packit 032894
     thread exists and will set dwfl_errno in that case.  THREAD_ARGP
Packit 032894
     is never NULL.  *THREAD_ARGP will be passed to
Packit 032894
     set_initial_registers or thread_detach callbacks together with
Packit 032894
     Dwfl_Thread *thread.  This method may be NULL and will then be
Packit 032894
     emulated using the next_thread callback. */
Packit 032894
  bool (*get_thread) (Dwfl *dwfl, pid_t tid, void *dwfl_arg,
Packit 032894
		      void **thread_argp)
Packit 032894
    __nonnull_attribute__ (1);
Packit 032894
Packit 032894
  /* Called during unwinding to access memory (stack) state.  Returns true for
Packit 032894
     successfully read *RESULT or false and sets dwfl_errno () on failure.
Packit 032894
     This method may be NULL - in such case dwfl_thread_getframes will return
Packit 032894
     only the initial frame.  */
Packit 032894
  bool (*memory_read) (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result,
Packit 032894
                       void *dwfl_arg)
Packit 032894
    __nonnull_attribute__ (1, 3);
Packit 032894
Packit 032894
  /* Called on initial unwind to get the initial register state of the first
Packit 032894
     frame.  Should call dwfl_thread_state_registers, possibly multiple times
Packit 032894
     for different ranges and possibly also dwfl_thread_state_register_pc, to
Packit 032894
     fill in initial (DWARF) register values.  After this call, till at least
Packit 032894
     thread_detach is called, the thread is assumed to be frozen, so that it is
Packit 032894
     safe to unwind.  Returns true on success or false and sets dwfl_errno ()
Packit 032894
     on failure.  In the case of a failure thread_detach will not be called.
Packit 032894
     This method must not be NULL.  */
Packit 032894
  bool (*set_initial_registers) (Dwfl_Thread *thread, void *thread_arg)
Packit 032894
    __nonnull_attribute__ (1);
Packit 032894
Packit 032894
  /* Called by dwfl_end.  All thread_detach method calls have been already
Packit 032894
     done.  This method may be NULL.  */
Packit 032894
  void (*detach) (Dwfl *dwfl, void *dwfl_arg)
Packit 032894
    __nonnull_attribute__ (1);
Packit 032894
Packit 032894
  /* Called when unwinding is done.  No callback will be called after
Packit 032894
     this method has been called.  Iff set_initial_registers was called for
Packit 032894
     a TID and it returned success thread_detach will be called before the
Packit 032894
     detach method above.  This method may be NULL.  */
Packit 032894
  void (*thread_detach) (Dwfl_Thread *thread, void *thread_arg)
Packit 032894
    __nonnull_attribute__ (1);
Packit 032894
} Dwfl_Thread_Callbacks;
Packit 032894
Packit 032894
/* PID is the process id associated with the DWFL state.  Architecture of DWFL
Packit 032894
   modules is specified by ELF, ELF must remain valid during DWFL lifetime.
Packit 032894
   Use NULL ELF to detect architecture from DWFL, the function will then detect
Packit 032894
   it from arbitrary Dwfl_Module of DWFL.  DWFL_ARG is the callback backend
Packit 032894
   state.  DWFL_ARG will be provided to the callbacks.  *THREAD_CALLBACKS
Packit 032894
   function pointers must remain valid during lifetime of DWFL.  Function
Packit 032894
   returns true on success, false otherwise.  */
Packit 032894
bool dwfl_attach_state (Dwfl *dwfl, Elf *elf, pid_t pid,
Packit 032894
                        const Dwfl_Thread_Callbacks *thread_callbacks,
Packit 032894
			void *dwfl_arg)
Packit 032894
  __nonnull_attribute__ (1, 4);
Packit 032894
Packit 032894
/* Calls dwfl_attach_state with Dwfl_Thread_Callbacks setup for extracting
Packit 032894
   thread state from the ELF core file.  Returns the pid number extracted
Packit 032894
   from the core file, or -1 for errors.  */
Packit 032894
extern int dwfl_core_file_attach (Dwfl *dwfl, Elf *elf);
Packit 032894
Packit 032894
/* Calls dwfl_attach_state with Dwfl_Thread_Callbacks setup for extracting
Packit 032894
   thread state from the proc file system.  Uses ptrace to attach and stop
Packit 032894
   the thread under inspection and detaches when thread_detach is called
Packit 032894
   and unwinding for the thread is done, unless ASSUME_PTRACE_STOPPED is
Packit 032894
   true.  If ASSUME_PTRACE_STOPPED is true the caller should make sure that
Packit 032894
   the thread is ptrace attached and stopped before unwinding by calling
Packit 032894
   either dwfl_thread_getframes or dwfl_getthread_frames.  Returns zero on
Packit 032894
   success, -1 if dwfl_attach_state failed, or an errno code if opening the
Packit 032894
   proc files failed.  */
Packit 032894
extern int dwfl_linux_proc_attach (Dwfl *dwfl, pid_t pid,
Packit 032894
				   bool assume_ptrace_stopped);
Packit 032894
Packit 032894
/* Return PID for the process associated with DWFL.  Function returns -1 if
Packit 032894
   dwfl_attach_state was not called for DWFL.  */
Packit 032894
pid_t dwfl_pid (Dwfl *dwfl)
Packit 032894
  __nonnull_attribute__ (1);
Packit 032894
Packit 032894
/* Return DWFL from which THREAD was created using dwfl_getthreads.  */
Packit 032894
Dwfl *dwfl_thread_dwfl (Dwfl_Thread *thread)
Packit 032894
  __nonnull_attribute__ (1);
Packit 032894
Packit 032894
/* Return positive TID (thread ID) for THREAD.  This function never fails.  */
Packit 032894
pid_t dwfl_thread_tid (Dwfl_Thread *thread)
Packit 032894
  __nonnull_attribute__ (1);
Packit 032894
Packit 032894
/* Return thread for frame STATE.  This function never fails.  */
Packit 032894
Dwfl_Thread *dwfl_frame_thread (Dwfl_Frame *state)
Packit 032894
  __nonnull_attribute__ (1);
Packit 032894
Packit 032894
/* Called by Dwfl_Thread_Callbacks.set_initial_registers implementation.
Packit 032894
   For every known continuous block of registers 
Packit 032894
   (inclusive..exclusive) set their content to REGS (array of NREGS items).
Packit 032894
   Function returns false if any of the registers has invalid number.  */
Packit 032894
bool dwfl_thread_state_registers (Dwfl_Thread *thread, int firstreg,
Packit 032894
                                  unsigned nregs, const Dwarf_Word *regs)
Packit 032894
  __nonnull_attribute__ (1, 4);
Packit 032894
Packit 032894
/* Called by Dwfl_Thread_Callbacks.set_initial_registers implementation.
Packit 032894
   If PC is not contained among DWARF registers passed by
Packit 032894
   dwfl_thread_state_registers on the target architecture pass the PC value
Packit 032894
   here.  */
Packit 032894
void dwfl_thread_state_register_pc (Dwfl_Thread *thread, Dwarf_Word pc)
Packit 032894
  __nonnull_attribute__ (1);
Packit 032894
Packit 032894
/* Iterate through the threads for a process.  Returns zero if all threads have
Packit 032894
   been processed by the callback, returns -1 on error, or the value of the
Packit 032894
   callback when not DWARF_CB_OK.  -1 returned on error will set dwfl_errno ().
Packit 032894
   Keeps calling the callback with the next thread while the callback returns
Packit 032894
   DWARF_CB_OK, till there are no more threads.  */
Packit 032894
int dwfl_getthreads (Dwfl *dwfl,
Packit 032894
		     int (*callback) (Dwfl_Thread *thread, void *arg),
Packit 032894
		     void *arg)
Packit 032894
  __nonnull_attribute__ (1, 2);
Packit 032894
Packit 032894
/* Iterate through the frames for a thread.  Returns zero if all frames
Packit 032894
   have been processed by the callback, returns -1 on error, or the value of
Packit 032894
   the callback when not DWARF_CB_OK.  -1 returned on error will
Packit 032894
   set dwfl_errno ().  Some systems return error instead of zero on end of the
Packit 032894
   backtrace, for cross-platform compatibility callers should consider error as
Packit 032894
   a zero.  Keeps calling the callback with the next frame while the callback
Packit 032894
   returns DWARF_CB_OK, till there are no more frames.  On start will call the
Packit 032894
   set_initial_registers callback and on return will call the detach_thread
Packit 032894
   callback of the Dwfl_Thread.  */
Packit 032894
int dwfl_thread_getframes (Dwfl_Thread *thread,
Packit 032894
			   int (*callback) (Dwfl_Frame *state, void *arg),
Packit 032894
			   void *arg)
Packit 032894
  __nonnull_attribute__ (1, 2);
Packit 032894
Packit 032894
/* Like dwfl_thread_getframes, but specifying the thread by its unique
Packit 032894
   identifier number.  Returns zero if all frames have been processed
Packit 032894
   by the callback, returns -1 on error (and when no thread with
Packit 032894
   the given thread id number exists), or the value of the callback
Packit 032894
   when not DWARF_CB_OK.  -1 returned on error will set dwfl_errno ().  */
Packit 032894
int dwfl_getthread_frames (Dwfl *dwfl, pid_t tid,
Packit 032894
			   int (*callback) (Dwfl_Frame *thread, void *arg),
Packit 032894
			   void *arg)
Packit 032894
  __nonnull_attribute__ (1, 3);
Packit 032894
Packit 032894
/* Return *PC (program counter) for thread-specific frame STATE.
Packit 032894
   Set *ISACTIVATION according to DWARF frame "activation" definition.
Packit 032894
   Typically you need to substract 1 from *PC if *ACTIVATION is false to safely
Packit 032894
   find function of the caller.  ACTIVATION may be NULL.  PC must not be NULL.
Packit 032894
   Function returns false if it failed to find *PC.  */
Packit 032894
bool dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool *isactivation)
Packit 032894
  __nonnull_attribute__ (1, 2);
Packit 032894
Packit 032894
#ifdef __cplusplus
Packit 032894
}
Packit 032894
#endif
Packit 032894
Packit 032894
#endif	/* libdwfl.h */