blob: 7dbf4608bcf323ffb7d5344a0640cb6d98f127c5 [file] [log] [blame]
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00001/* Interface for libebl.
Mark Wielaard858dc652015-01-27 13:07:17 +01002 Copyright (C) 2000-2010, 2013, 2014, 2015 Red Hat, Inc.
Mark Wielaardde2ed972012-06-05 17:15:16 +02003 This file is part of elfutils.
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00004
Mark Wielaardde2ed972012-06-05 17:15:16 +02005 This file is free software; you can redistribute it and/or modify
6 it under the terms of either
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00007
Mark Wielaardde2ed972012-06-05 17:15:16 +02008 * the GNU Lesser General Public License as published by the Free
9 Software Foundation; either version 3 of the License, or (at
10 your option) any later version
11
12 or
13
14 * the GNU General Public License as published by the Free
15 Software Foundation; either version 2 of the License, or (at
16 your option) any later version
17
18 or both in parallel, as here.
19
20 elfutils is distributed in the hope that it will be useful, but
Ulrich Drepper361df7d2006-04-04 21:38:57 +000021 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
24
Mark Wielaardde2ed972012-06-05 17:15:16 +020025 You should have received copies of the GNU General Public License and
26 the GNU Lesser General Public License along with this program. If
27 not, see <http://www.gnu.org/licenses/>. */
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000028
Mark Wielaard858dc652015-01-27 13:07:17 +010029
30/* This is the interface for the Elfutils Backend Library.
31 It is a completely UNSUPPORTED interface. Don't use any libebl
32 function directly. These are only for internal elfutils backends
33 and tools. There is NO source or binary compatible guarantee.
34
Mark Wielaardc8067362015-01-27 15:55:41 +010035 The ABI of the backend modules is not guaranteed. Really, no guarantee
Mark Wielaard858dc652015-01-27 13:07:17 +010036 whatsoever. We are enforcing this in the code. The modules and their
37 users must match. No third-party EBL module are supported or allowed.
38 The only reason there are separate modules is to not have the code for
39 all architectures in all the binaries. */
40
41
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000042#ifndef _LIBEBL_H
43#define _LIBEBL_H 1
44
45#include <gelf.h>
Roland McGrathe47ab762005-11-17 03:16:00 +000046#include "libdw.h"
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000047#include <stdbool.h>
48#include <stddef.h>
49#include <stdint.h>
50
Roland McGrath215c6322005-11-16 22:46:04 +000051#include "elf-knowledge.h"
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000052
53
54/* Opaque type for the handle. */
55typedef struct ebl Ebl;
56
57
Ulrich Drepper41cbd762006-05-27 18:19:23 +000058#ifdef __cplusplus
59extern "C" {
60#endif
61
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000062/* Get backend handle for object associated with ELF handle. */
63extern Ebl *ebl_openbackend (Elf *elf);
64/* Similar but without underlying ELF file. */
65extern Ebl *ebl_openbackend_machine (GElf_Half machine);
66/* Similar but with emulation name given. */
67extern Ebl *ebl_openbackend_emulation (const char *emulation);
68
69/* Free resources allocated for backend handle. */
70extern void ebl_closebackend (Ebl *bh);
71
72
Ulrich Dreppera38998e2005-08-03 02:05:39 +000073/* Information about the descriptor. */
74
75/* Get ELF machine. */
76extern int ebl_get_elfmachine (Ebl *ebl) __attribute__ ((__pure__));
77
78/* Get ELF class. */
79extern int ebl_get_elfclass (Ebl *ebl) __attribute__ ((__pure__));
80
81/* Get ELF data encoding. */
82extern int ebl_get_elfdata (Ebl *ebl) __attribute__ ((__pure__));
83
84
Ulrich Drepperb08d5a82005-07-26 05:00:05 +000085/* Function to call the callback functions including default ELF
86 handling. */
87
88/* Return backend name. */
89extern const char *ebl_backend_name (Ebl *ebl);
90
91/* Return relocation type name. */
92extern const char *ebl_object_type_name (Ebl *ebl, int object,
93 char *buf, size_t len);
94
95/* Return relocation type name. */
96extern const char *ebl_reloc_type_name (Ebl *ebl, int reloc,
97 char *buf, size_t len);
98
99/* Check relocation type. */
100extern bool ebl_reloc_type_check (Ebl *ebl, int reloc);
101
102/* Check relocation type use. */
103extern bool ebl_reloc_valid_use (Ebl *ebl, int reloc);
104
105/* Check if relocation type is for simple absolute relocations.
106 Return ELF_T_{BYTE,HALF,SWORD,SXWORD} for a simple type, else ELF_T_NUM. */
107extern Elf_Type ebl_reloc_simple_type (Ebl *ebl, int reloc);
108
109/* Return true if the symbol type is that referencing the GOT. E.g.,
110 R_386_GOTPC. */
111extern bool ebl_gotpc_reloc_check (Ebl *ebl, int reloc);
112
113/* Return segment type name. */
114extern const char *ebl_segment_type_name (Ebl *ebl, int segment,
115 char *buf, size_t len);
116
117/* Return section type name. */
118extern const char *ebl_section_type_name (Ebl *ebl, int section,
119 char *buf, size_t len);
120
121/* Return section name. */
122extern const char *ebl_section_name (Ebl *ebl, int section, int xsection,
123 char *buf, size_t len,
124 const char *scnnames[], size_t shnum);
125
126/* Return machine flag names. */
127extern const char *ebl_machine_flag_name (Ebl *ebl, GElf_Word flags,
128 char *buf, size_t len);
129
130/* Check whether machine flag is valid. */
131extern bool ebl_machine_flag_check (Ebl *ebl, GElf_Word flags);
132
Ulrich Drepperaa915fd2007-02-05 07:25:33 +0000133/* Check whether SHF_MASKPROC flags are valid. */
134extern bool ebl_machine_section_flag_check (Ebl *ebl, GElf_Xword flags);
135
Roland McGrath13b69602008-04-01 02:30:05 +0000136/* Check whether the section with the given index, header, and name
137 is a special machine section that is valid despite a combination
138 of flags or other details that are not generically valid. */
139extern bool ebl_check_special_section (Ebl *ebl, int ndx,
140 const GElf_Shdr *shdr, const char *name);
141
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000142/* Return symbol type name. */
143extern const char *ebl_symbol_type_name (Ebl *ebl, int symbol,
144 char *buf, size_t len);
145
146/* Return symbol binding name. */
147extern const char *ebl_symbol_binding_name (Ebl *ebl, int binding,
148 char *buf, size_t len);
149
150/* Return dynamic tag name. */
151extern const char *ebl_dynamic_tag_name (Ebl *ebl, int64_t tag,
152 char *buf, size_t len);
153
154/* Check dynamic tag. */
155extern bool ebl_dynamic_tag_check (Ebl *ebl, int64_t tag);
156
Roland McGrath653d3762005-08-13 01:59:10 +0000157/* Check whether given symbol's st_value and st_size are OK despite failing
158 normal checks. */
Ulrich Drepperc5c33a62005-08-13 17:50:47 +0000159extern bool ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr,
Roland McGrath653d3762005-08-13 01:59:10 +0000160 const GElf_Sym *sym, const char *name,
161 const GElf_Shdr *destshdr);
162
Mark Wielaarda062b6b2011-03-10 13:02:32 +0100163/* Check whether only valid bits are set on the st_other symbol flag. */
164extern bool ebl_check_st_other_bits (Ebl *ebl, unsigned char st_other);
165
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000166/* Return combined section header flags value. */
167extern GElf_Word ebl_sh_flags_combine (Ebl *ebl, GElf_Word flags1,
168 GElf_Word flags2);
169
170/* Return symbolic representation of OS ABI. */
171extern const char *ebl_osabi_name (Ebl *ebl, int osabi, char *buf, size_t len);
172
173
174/* Return name of the note section type for a core file. */
175extern const char *ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf,
176 size_t len);
177
178/* Return name of the note section type for an object file. */
Mark Wielaardbb9d1b42011-04-24 17:53:38 +0200179extern const char *ebl_object_note_type_name (Ebl *ebl, const char *name,
180 uint32_t type, char *buf,
181 size_t len);
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000182
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000183/* Print information about object note if available. */
184extern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type,
185 uint32_t descsz, const char *desc);
186
Roland McGrath059c83e2008-02-21 06:19:39 +0000187/* Check whether an attribute in a .gnu_attributes section is recognized.
188 Fills in *TAG_NAME with the name for this tag.
189 If VALUE is a known value for that tag, also fills in *VALUE_NAME. */
190extern bool ebl_check_object_attribute (Ebl *ebl, const char *vendor,
191 int tag, uint64_t value,
192 const char **tag_name,
193 const char **value_name);
194
Mark Wielaard028d0ab2014-05-19 16:52:56 +0200195/* Check whether a section type is a valid reloc target. */
196extern bool ebl_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type);
197
Roland McGrath059c83e2008-02-21 06:19:39 +0000198
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000199/* Check section name for being that of a debug informatino section. */
200extern bool ebl_debugscn_p (Ebl *ebl, const char *name);
201
202/* Check whether given relocation is a copy relocation. */
203extern bool ebl_copy_reloc_p (Ebl *ebl, int reloc);
204
Ulrich Drepper6ca46002006-06-12 22:40:23 +0000205/* Check whether given relocation is a no-op relocation. */
206extern bool ebl_none_reloc_p (Ebl *ebl, int reloc);
207
Ulrich Drepper28ed8952006-07-07 03:43:47 +0000208/* Check whether given relocation is a relative relocation. */
209extern bool ebl_relative_reloc_p (Ebl *ebl, int reloc);
210
Roland McGrath653d3762005-08-13 01:59:10 +0000211/* Check whether section should be stripped. */
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000212extern bool ebl_section_strip_p (Ebl *ebl, const GElf_Ehdr *ehdr,
213 const GElf_Shdr *shdr, const char *name,
214 bool remove_comment, bool only_remove_debug);
215
Roland McGrath653d3762005-08-13 01:59:10 +0000216/* Check if backend uses a bss PLT in this file. */
Mark Wielaard712c8fa2014-11-22 23:08:48 +0100217extern bool ebl_bss_plt_p (Ebl *ebl);
Roland McGrath653d3762005-08-13 01:59:10 +0000218
Ulrich Drepper28ed8952006-07-07 03:43:47 +0000219/* Return size of entry in SysV-style hash table. */
220extern int ebl_sysvhash_entrysize (Ebl *ebl);
221
Roland McGrathe47ab762005-11-17 03:16:00 +0000222/* Return location expression to find return value given a
223 DW_TAG_subprogram, DW_TAG_subroutine_type, or similar DIE describing
224 function itself (whose DW_AT_type attribute describes its return type).
225 Returns -1 for a libdw error (see dwarf_errno).
226 Returns -2 for an unrecognized type formation.
227 Returns zero if the function has no return value (e.g. "void" in C).
228 Otherwise, *LOCOPS gets a location expression to find the return value,
229 and returns the number of operations in the expression. The pointer is
230 permanently allocated at least as long as the Ebl handle is open. */
231extern int ebl_return_value_location (Ebl *ebl,
232 Dwarf_Die *functypedie,
233 const Dwarf_Op **locops);
234
Roland McGrathc373d852006-10-10 00:25:21 +0000235/* Fill in register information given DWARF register numbers.
Roland McGrath994b4892005-12-05 22:46:21 +0000236 If NAME is null, return the maximum REGNO + 1 that has a name.
237 Otherwise, store in NAME the name for DWARF register number REGNO
238 and return the number of bytes written (including '\0' terminator).
239 Return -1 if NAMELEN is too short or REGNO is negative or too large.
240 Return 0 if REGNO is unused (a gap in the DWARF number assignment).
241 On success, set *SETNAME to a description like "integer" or "FPU"
242 fit for "%s registers" title display, and *PREFIX to the string
243 that precedes NAME in canonical assembler syntax (e.g. "%" or "$").
244 The NAME string contains identifier characters only (maybe just digits). */
Roland McGrathc373d852006-10-10 00:25:21 +0000245extern ssize_t ebl_register_info (Ebl *ebl,
Roland McGrath994b4892005-12-05 22:46:21 +0000246 int regno, char *name, size_t namelen,
Roland McGrathc373d852006-10-10 00:25:21 +0000247 const char **prefix, const char **setname,
248 int *bits, int *type);
Roland McGrath994b4892005-12-05 22:46:21 +0000249
Roland McGrath1d8bb252008-08-07 08:39:41 +0000250/* Fill in the DWARF register numbers for the registers used in system calls.
251 The SP and PC are what kernel reports call the user stack pointer and PC.
252 The CALLNO and ARGS are the system call number and incoming arguments.
253 Each of these is filled with the DWARF register number corresponding,
254 or -1 if there is none. Returns zero when the information is available. */
255extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
256 int *callno, int args[6]);
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000257
Roland McGrath3c84db32009-06-24 17:41:40 -0700258/* Supply the ABI-specified state of DWARF CFI before CIE initial programs.
259
260 The DWARF 3.0 spec says that the default initial states of all registers
261 are "undefined", unless otherwise specified by the machine/compiler ABI.
262
263 This default is wrong for every machine with the CFI generated by GCC.
264 The EH unwinder does not really distinguish "same_value" and "undefined",
265 since it doesn't matter for unwinding (in either case there is no change
266 to make for that register). GCC generates CFI that says nothing at all
267 about registers it hasn't spilled somewhere. For our unwinder to give
268 the true story, the backend must supply an initial state that uses
269 "same_value" rules for all the callee-saves registers.
270
271 This can fill in the initial_instructions, initial_instructions_end
272 members of *ABI_INFO to point at a CFI instruction stream to process
273 before each CIE's initial instructions. It should set the
274 data_alignment_factor member if it affects the initial instructions.
275
Mark Wielaard3dec3e12013-10-06 17:04:07 +0200276 The callback should not use the register rules DW_CFA_expression or
277 DW_CFA_val_expression. Defining the CFA using DW_CFA_def_cfa_expression
278 is allowed. This is an implementation detail since register rules
279 store expressions as offsets from the .eh_frame or .debug_frame data.
280
Roland McGrath3c84db32009-06-24 17:41:40 -0700281 As a shorthand for some common cases, for this instruction stream
282 we overload some CFI instructions that cannot be used in a CIE:
283
284 DW_CFA_restore -- Change default rule for all unmentioned
285 registers from undefined to same_value.
286
287 This function can also fill in ABI_INFO->return_address_register with the
288 DWARF register number that identifies the actual PC in machine state.
289 If there is no canonical DWARF register number with that meaning, it's
290 left unchanged (callers usually initialize with (Dwarf_Word) -1).
Jan Kratochvil0631d1f2012-10-12 20:43:21 +0200291 This value is not used by CFI per se.
292
293 Function returns 0 on success and -1 for error or unsupported by the
294 backend. */
Roland McGrath3c84db32009-06-24 17:41:40 -0700295extern int ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
296 __nonnull_attribute__ (2);
297
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000298/* ELF string table handling. */
299struct Ebl_Strtab;
300struct Ebl_Strent;
301
302/* Create new ELF string table object in memory. */
303extern struct Ebl_Strtab *ebl_strtabinit (bool nullstr);
304
305/* Free resources allocated for ELF string table ST. */
306extern void ebl_strtabfree (struct Ebl_Strtab *st);
307
308/* Add string STR (length LEN is != 0) to ELF string table ST. */
309extern struct Ebl_Strent *ebl_strtabadd (struct Ebl_Strtab *st,
310 const char *str, size_t len);
311
312/* Finalize string table ST and store size and memory location information
313 in DATA. */
314extern void ebl_strtabfinalize (struct Ebl_Strtab *st, Elf_Data *data);
315
316/* Get offset in string table for string associated with SE. */
317extern size_t ebl_strtaboffset (struct Ebl_Strent *se);
318
319/* Return the string associated with SE. */
320extern const char *ebl_string (struct Ebl_Strent *se);
321
322
323/* ELF wide char string table handling. */
324struct Ebl_WStrtab;
325struct Ebl_WStrent;
326
327/* Create new ELF wide char string table object in memory. */
328extern struct Ebl_WStrtab *ebl_wstrtabinit (bool nullstr);
329
330/* Free resources allocated for ELF wide char string table ST. */
331extern void ebl_wstrtabfree (struct Ebl_WStrtab *st);
332
333/* Add string STR (length LEN is != 0) to ELF string table ST. */
334extern struct Ebl_WStrent *ebl_wstrtabadd (struct Ebl_WStrtab *st,
335 const wchar_t *str, size_t len);
336
337/* Finalize string table ST and store size and memory location information
338 in DATA. */
339extern void ebl_wstrtabfinalize (struct Ebl_WStrtab *st, Elf_Data *data);
340
341/* Get offset in wide char string table for string associated with SE. */
342extern size_t ebl_wstrtaboffset (struct Ebl_WStrent *se);
343
344
345/* Generic string table handling. */
346struct Ebl_GStrtab;
347struct Ebl_GStrent;
348
349/* Create new string table object in memory. */
350extern struct Ebl_GStrtab *ebl_gstrtabinit (unsigned int width, bool nullstr);
351
352/* Free resources allocated for string table ST. */
353extern void ebl_gstrtabfree (struct Ebl_GStrtab *st);
354
355/* Add string STR (length LEN is != 0) to string table ST. */
356extern struct Ebl_GStrent *ebl_gstrtabadd (struct Ebl_GStrtab *st,
357 const char *str, size_t len);
358
359/* Finalize string table ST and store size and memory location information
360 in DATA. */
361extern void ebl_gstrtabfinalize (struct Ebl_GStrtab *st, Elf_Data *data);
362
363/* Get offset in wide char string table for string associated with SE. */
364extern size_t ebl_gstrtaboffset (struct Ebl_GStrent *se);
365
Roland McGrathcb6d8652007-08-23 08:10:54 +0000366
367/* Register map info. */
368typedef struct
369{
370 Dwarf_Half offset; /* Byte offset in register data block. */
371 Dwarf_Half regno; /* DWARF register number. */
372 uint8_t bits; /* Bits of data for one register. */
373 uint8_t pad; /* Bytes of padding after register's data. */
374 Dwarf_Half count; /* Consecutive register numbers here. */
Jan Kratochvilc6a41482013-12-17 18:49:54 +0100375 bool pc_register;
Roland McGrathcb6d8652007-08-23 08:10:54 +0000376} Ebl_Register_Location;
377
378/* Non-register data items in core notes. */
379typedef struct
380{
381 const char *name; /* Printable identifier. */
382 const char *group; /* Identifier for category of related items. */
383 Dwarf_Half offset; /* Byte offset in note data. */
384 Dwarf_Half count;
385 Elf_Type type;
386 char format;
387 bool thread_identifier;
Jan Kratochvil5cbf42a2013-12-15 18:56:17 +0100388 bool pc_register;
Roland McGrathcb6d8652007-08-23 08:10:54 +0000389} Ebl_Core_Item;
390
Roland McGrath0ccbbcd2010-01-04 21:59:07 -0800391/* Describe the format of a core file note with the given header and NAME.
392 NAME is not guaranteed terminated, it's NHDR->n_namesz raw bytes. */
393extern int ebl_core_note (Ebl *ebl, const GElf_Nhdr *nhdr, const char *name,
Roland McGrathcb6d8652007-08-23 08:10:54 +0000394 GElf_Word *regs_offset, size_t *nregloc,
395 const Ebl_Register_Location **reglocs,
396 size_t *nitems, const Ebl_Core_Item **items)
Roland McGrath0ccbbcd2010-01-04 21:59:07 -0800397 __nonnull_attribute__ (1, 2, 3, 4, 5, 6, 7, 8);
Roland McGrathcb6d8652007-08-23 08:10:54 +0000398
399/* Describe the auxv type number. */
400extern int ebl_auxv_info (Ebl *ebl, GElf_Xword a_type,
401 const char **name, const char **format)
402 __nonnull_attribute__ (1, 3, 4);
403
Jan Kratochvil5cbf42a2013-12-15 18:56:17 +0100404/* Callback type for ebl_set_initial_registers_tid.
405 Register -1 is mapped to PC (if arch PC has no DWARF number).
406 If FIRSTREG is -1 then NREGS has to be 1. */
Jan Kratochvil1c1a53b2013-11-14 20:55:41 +0100407typedef bool (ebl_tid_registers_t) (int firstreg, unsigned nregs,
408 const Dwarf_Word *regs, void *arg)
Jan Kratochvil0b867462013-05-30 14:37:38 +0200409 __nonnull_attribute__ (3);
410
411/* Callback to fetch process data from live TID.
412 EBL architecture has to have EBL_FRAME_NREGS > 0, otherwise the
413 backend doesn't support unwinding and this function call may crash. */
414extern bool ebl_set_initial_registers_tid (Ebl *ebl,
415 pid_t tid,
416 ebl_tid_registers_t *setfunc,
417 void *arg)
418 __nonnull_attribute__ (1, 3);
419
420/* Number of registers to allocate for ebl_set_initial_registers_tid.
421 EBL architecture can unwind iff EBL_FRAME_NREGS > 0. */
422extern size_t ebl_frame_nregs (Ebl *ebl)
423 __nonnull_attribute__ (1);
Roland McGrathcb6d8652007-08-23 08:10:54 +0000424
Mark Wielaardc1c1c062014-06-14 17:15:37 +0200425/* Mask to use for function symbol or unwind return addresses in case
426 the architecture adds some extra non-address bits to it. This is
427 different from ebl_resolve_sym_value which only works for actual
428 symbol addresses (in non-ET_REL files) that might resolve to an
429 address in a different section. ebl_func_addr_mask is called to
430 turn a given function value into the a real address or offset (the
431 original value might not be a real address). This works for all
432 cases where an actual function address (or offset in ET_REL symbol
433 tables) is needed. */
434extern GElf_Addr ebl_func_addr_mask (Ebl *ebl);
435
Jan Kratochvil5cbf42a2013-12-15 18:56:17 +0100436/* Convert *REGNO as is in DWARF to a lower range suitable for
437 Dwarf_Frame->REGS indexing. */
438extern bool ebl_dwarf_to_regno (Ebl *ebl, unsigned *regno)
439 __nonnull_attribute__ (1, 2);
440
Jan Kratochvilc6a41482013-12-17 18:49:54 +0100441/* Modify PC as fetched from inferior data into valid PC. */
442extern void ebl_normalize_pc (Ebl *ebl, Dwarf_Addr *pc)
443 __nonnull_attribute__ (1, 2);
444
445/* Callback type for ebl_unwind's parameter getfunc. */
446typedef bool (ebl_tid_registers_get_t) (int firstreg, unsigned nregs,
447 Dwarf_Word *regs, void *arg)
448 __nonnull_attribute__ (3);
449
450/* Callback type for ebl_unwind's parameter readfunc. */
451typedef bool (ebl_pid_memory_read_t) (Dwarf_Addr addr, Dwarf_Word *data,
452 void *arg)
453 __nonnull_attribute__ (3);
454
455/* Get previous frame state for an existing frame state. Method is called only
456 if unwinder could not find CFI for current PC. PC is for the
457 existing frame. SETFUNC sets register in the previous frame. GETFUNC gets
458 register from the existing frame. Note that GETFUNC vs. SETFUNC act on
459 a disjunct set of registers. READFUNC reads memory. ARG has to be passed
460 for SETFUNC, GETFUNC and READFUNC. *SIGNAL_FRAMEP is initialized to false,
461 it can be set to true if existing frame is a signal frame. SIGNAL_FRAMEP is
462 never NULL. */
463extern bool ebl_unwind (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
464 ebl_tid_registers_get_t *getfunc,
465 ebl_pid_memory_read_t *readfunc, void *arg,
466 bool *signal_framep)
467 __nonnull_attribute__ (1, 3, 4, 5, 7);
468
Mark Wielaard159ac522013-12-18 11:05:54 +0100469/* Returns true if the value can be resolved to an address in an
470 allocated section, which will be returned in *ADDR
471 (e.g. function descriptor resolving) */
472extern bool ebl_resolve_sym_value (Ebl *ebl, GElf_Addr *addr)
473 __nonnull_attribute__ (2);
474
Ulrich Drepper41cbd762006-05-27 18:19:23 +0000475#ifdef __cplusplus
476}
477#endif
478
Ulrich Drepperb08d5a82005-07-26 05:00:05 +0000479#endif /* libebl.h */