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