1 /* 2 3 Copyright (C) 2000-2010 Silicon Graphics, Inc. All Rights Reserved. 4 Portions Copyright 2007-2010 Sun Microsystems, Inc. All rights reserved. 5 Portions Copyright 2008-2010 David Anderson. All rights reserved. 6 Portions Copyright 2008-2010 Arxan Technologies, Inc. All rights reserved. 7 8 This program is free software; you can redistribute it and/or modify it 9 under the terms of version 2.1 of the GNU Lesser General Public License 10 as published by the Free Software Foundation. 11 12 This program is distributed in the hope that it would be useful, but 13 WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 15 16 Further, this software is distributed without any warranty that it is 17 free of the rightful claim of any third person regarding infringement 18 or the like. Any license provided herein, whether implied or 19 otherwise, applies only to this software file. Patent licenses, if 20 any, provided herein do not apply to combinations of this program with 21 other software, or any other product whatsoever. 22 23 You should have received a copy of the GNU Lesser General Public 24 License along with this program; if not, write the Free Software 25 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, 26 USA. 27 28 Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, 29 Mountain View, CA 94043, or: 30 31 http://www.sgi.com 32 33 For further information regarding this notice, see: 34 35 http://oss.sgi.com/projects/GenInfo/NoticeExplan 36 37 */ 38 39 40 #ifndef _LIBDWARF_H 41 #define _LIBDWARF_H 42 #ifdef __cplusplus 43 extern "C" { 44 #endif 45 /* 46 libdwarf.h 47 $Revision: #9 $ $Date: 2008/01/17 $ 48 49 For libdwarf producers and consumers 50 51 The interface is defined as having 8-byte signed and unsigned 52 values so it can handle 64-or-32bit target on 64-or-32bit host. 53 Addr is the native size: it represents pointers on 54 the host machine (not the target!). 55 56 This contains declarations for types and all producer 57 and consumer functions. 58 59 Function declarations are written on a single line each here 60 so one can use grep to each declaration in its entirety. 61 The declarations are a little harder to read this way, but... 62 63 */ 64 65 struct Elf; 66 typedef struct Elf* dwarf_elf_handle; 67 68 /* To enable printing with printf regardless of the 69 actual underlying data type, we define the DW_PR_xxx macros. */ 70 #if (_MIPS_SZLONG == 64) 71 /* Special case for MIPS, so -64 (LP64) build gets simple -long-. 72 Non-MIPS LP64 or ILP64 environments should probably ensure 73 _MIPS_SZLONG set to 64 everywhere this header is #included. 74 */ 75 typedef int Dwarf_Bool; /* boolean type */ 76 typedef unsigned long Dwarf_Off; /* 4 or 8 byte file offset */ 77 typedef unsigned long Dwarf_Unsigned; /* 4 or 8 byte unsigned value */ 78 typedef unsigned short Dwarf_Half; /* 2 byte unsigned value */ 79 typedef unsigned char Dwarf_Small; /* 1 byte unsigned value */ 80 typedef signed long Dwarf_Signed; /* 4 or 8 byte signed value */ 81 typedef unsigned long Dwarf_Addr; /* target memory address */ 82 #define DW_PR_DUx "lx" 83 #define DW_PR_DSx "lx" 84 #define DW_PR_DUu "lu" 85 #define DW_PR_DSd "ld" 86 87 #else /* 32-bit */ 88 /* This is for ILP32, allowing i/o of 64bit dwarf info. 89 Also should be fine for LP64 and ILP64 cases. 90 */ 91 typedef int Dwarf_Bool; /* boolean type */ 92 typedef unsigned long long Dwarf_Off; /* 8 byte file offset */ 93 typedef unsigned long long Dwarf_Unsigned; /* 8 byte unsigned value*/ 94 typedef unsigned short Dwarf_Half; /* 2 byte unsigned value */ 95 typedef unsigned char Dwarf_Small; /* 1 byte unsigned value */ 96 typedef signed long long Dwarf_Signed; /* 8 byte signed value */ 97 typedef unsigned long long Dwarf_Addr; /* target memory address */ 98 #define DW_PR_DUx "llx" 99 #define DW_PR_DSx "llx" 100 #define DW_PR_DUu "llu" 101 #define DW_PR_DSd "lld" 102 #endif 103 #ifdef HAVE_NONSTANDARD_PRINTF_64_FORMAT 104 /* Windows does not use std C formatting, so allow it. */ 105 #undef DW_PR_DUx 106 #undef DW_PR_DSx 107 #undef DW_PR_DUu 108 #undef DW_PR_DSd 109 #define DW_PR_DUx "I64x" 110 #define DW_PR_DSx "I64x" 111 #define DW_PR_DUu "I64u" 112 #define DW_PR_DSd "I64d" 113 #endif /* HAVE_NONSTANDARD_FORMAT */ 114 115 typedef void* Dwarf_Ptr; /* host machine pointer */ 116 117 /* Used for DW_FORM_ref_sig8. It is not a string, it 118 is 8 bytes of a signature one would use to find 119 a type unit. See dwarf_formsig8() 120 */ 121 typedef struct { 122 char signature[8]; 123 } Dwarf_Sig8; 124 125 /* Contains info on an uninterpreted block of data 126 */ 127 typedef struct { 128 Dwarf_Unsigned bl_len; /* length of block */ 129 Dwarf_Ptr bl_data; /* uninterpreted data */ 130 Dwarf_Small bl_from_loclist; /*non-0 if loclist, else debug_info*/ 131 Dwarf_Unsigned bl_section_offset; /* Section (not CU) offset 132 which 'data' comes from. */ 133 } Dwarf_Block; 134 135 136 /* location record 137 */ 138 typedef struct { 139 Dwarf_Small lr_atom; /* location operation */ 140 Dwarf_Unsigned lr_number; /* operand */ 141 Dwarf_Unsigned lr_number2; /* for OP_BREGx */ 142 Dwarf_Unsigned lr_offset; /* offset in locexpr for OP_BRA etc */ 143 } Dwarf_Loc; 144 145 146 /* location description 147 */ 148 typedef struct { 149 Dwarf_Addr ld_lopc; /* beginning of active range */ 150 Dwarf_Addr ld_hipc; /* end of active range */ 151 Dwarf_Half ld_cents; /* count of location records */ 152 Dwarf_Loc* ld_s; /* pointer to list of same */ 153 Dwarf_Small ld_from_loclist; 154 /* non-0 if loclist, else debug_info*/ 155 156 Dwarf_Unsigned ld_section_offset; /* Section (not CU) offset 157 where loc-expr begins*/ 158 } Dwarf_Locdesc; 159 160 /* First appears in DWARF3. 161 The dwr_addr1/addr2 data is either an offset (DW_RANGES_ENTRY) 162 or an address (dwr_addr2 in DW_RANGES_ADDRESS_SELECTION) or 163 both are zero (DW_RANGES_END). 164 */ 165 enum Dwarf_Ranges_Entry_Type { DW_RANGES_ENTRY, 166 DW_RANGES_ADDRESS_SELECTION, 167 DW_RANGES_END }; 168 typedef struct { 169 Dwarf_Addr dwr_addr1; 170 Dwarf_Addr dwr_addr2; 171 enum Dwarf_Ranges_Entry_Type dwr_type; 172 } Dwarf_Ranges; 173 174 /* Frame description instructions expanded. 175 */ 176 typedef struct { 177 Dwarf_Small fp_base_op; 178 Dwarf_Small fp_extended_op; 179 Dwarf_Half fp_register; 180 181 /* Value may be signed, depends on op. 182 Any applicable data_alignment_factor has 183 not been applied, this is the raw offset. */ 184 Dwarf_Unsigned fp_offset; 185 Dwarf_Off fp_instr_offset; 186 } Dwarf_Frame_Op; /* DWARF2 */ 187 188 typedef struct { 189 Dwarf_Small fp_base_op; 190 Dwarf_Small fp_extended_op; 191 Dwarf_Half fp_register; 192 193 /* Value may be signed, depends on op. 194 Any applicable data_alignment_factor has 195 not been applied, this is the raw offset. */ 196 Dwarf_Unsigned fp_offset_or_block_len; 197 Dwarf_Small *fp_expr_block; 198 199 Dwarf_Off fp_instr_offset; 200 } Dwarf_Frame_Op3; /* DWARF3 and DWARF2 compatible */ 201 202 /* ***IMPORTANT NOTE, TARGET DEPENDENCY **** 203 DW_REG_TABLE_SIZE must be at least as large as 204 the number of registers 205 (DW_FRAME_LAST_REG_NUM) as defined in dwarf.h 206 Preferably identical to DW_FRAME_LAST_REG_NUM. 207 Ensure [0-DW_REG_TABLE_SIZE] does not overlap 208 DW_FRAME_UNDEFINED_VAL or DW_FRAME_SAME_VAL. 209 Also ensure DW_FRAME_REG_INITIAL_VALUE is set to what 210 is appropriate to your cpu. 211 For various CPUs DW_FRAME_UNDEFINED_VAL is correct 212 as the value for DW_FRAME_REG_INITIAL_VALUE. 213 214 For consumer apps, this can be set dynamically: see 215 dwarf_set_frame_rule_table_size(); 216 */ 217 #ifndef DW_REG_TABLE_SIZE 218 #define DW_REG_TABLE_SIZE 66 219 #endif 220 221 /* For MIPS, DW_FRAME_SAME_VAL is the correct default value 222 for a frame register value. For other CPUS another value 223 may be better, such as DW_FRAME_UNDEFINED_VAL. 224 See dwarf_set_frame_rule_table_size 225 */ 226 #ifndef DW_FRAME_REG_INITIAL_VALUE 227 #define DW_FRAME_REG_INITIAL_VALUE DW_FRAME_SAME_VAL 228 #endif 229 230 /* Taken as meaning 'undefined value', this is not 231 a column or register number. 232 Only present at libdwarf runtime in the consumer 233 interfaces. Never on disk. 234 DW_FRAME_* Values present on disk are in dwarf.h 235 Ensure this is > DW_REG_TABLE_SIZE (the reg table 236 size is changeable at runtime with the *reg3() interfaces, 237 and this value must be greater than the reg table size). 238 */ 239 #define DW_FRAME_UNDEFINED_VAL 1034 240 241 /* Taken as meaning 'same value' as caller had, not a column 242 or register number. 243 Only present at libdwarf runtime in the consumer 244 interfaces. Never on disk. 245 DW_FRAME_* Values present on disk are in dwarf.h 246 Ensure this is > DW_REG_TABLE_SIZE (the reg table 247 size is changeable at runtime with the *reg3() interfaces, 248 and this value must be greater than the reg table size). 249 */ 250 #define DW_FRAME_SAME_VAL 1035 251 252 /* For DWARF3 consumer interfaces, make the CFA a column with no 253 real table number. This is what should have been done 254 for the DWARF2 interfaces. This actually works for 255 both DWARF2 and DWARF3, but see the libdwarf documentation 256 on Dwarf_Regtable3 and dwarf_get_fde_info_for_reg3() 257 and dwarf_get_fde_info_for_all_regs3() 258 Do NOT use this with the older dwarf_get_fde_info_for_reg() 259 or dwarf_get_fde_info_for_all_regs() consumer interfaces. 260 Must be higher than any register count for *any* ABI 261 (ensures maximum applicability with minimum effort). 262 Ensure this is > DW_REG_TABLE_SIZE (the reg table 263 size is changeable at runtime with the *reg3() interfaces, 264 and this value must be greater than the reg table size). 265 Only present at libdwarf runtime in the consumer 266 interfaces. Never on disk. 267 */ 268 #define DW_FRAME_CFA_COL3 1436 269 270 /* The following are all needed to evaluate DWARF3 register rules. 271 */ 272 #define DW_EXPR_OFFSET 0 /* DWARF2 only sees this. */ 273 #define DW_EXPR_VAL_OFFSET 1 274 #define DW_EXPR_EXPRESSION 2 275 #define DW_EXPR_VAL_EXPRESSION 3 276 277 typedef struct Dwarf_Regtable_Entry_s { 278 /* For each index i (naming a hardware register with dwarf number 279 i) the following is true and defines the value of that register: 280 281 If dw_regnum is Register DW_FRAME_UNDEFINED_VAL 282 it is not DWARF register number but 283 a place holder indicating the register has no defined value. 284 If dw_regnum is Register DW_FRAME_SAME_VAL 285 it is not DWARF register number but 286 a place holder indicating the register has the same 287 value in the previous frame. 288 DW_FRAME_UNDEFINED_VAL, DW_FRAME_SAME_VAL are 289 only present at libdwarf runtime. Never on disk. 290 DW_FRAME_* Values present on disk are in dwarf.h 291 292 Otherwise: the register number is a DWARF register number 293 (see ABI documents for how this translates to hardware/ 294 software register numbers in the machine hardware) 295 and the following applies: 296 297 if dw_value_type == DW_EXPR_OFFSET (the only case for dwarf2): 298 If dw_offset_relevant is non-zero, then 299 the value is stored at at the address CFA+N where 300 N is a signed offset. 301 Rule: Offset(N) 302 If dw_offset_relevant is zero, then the value of the register 303 is the value of (DWARF) register number dw_regnum. 304 Rule: register(F) 305 Other values of dw_value_type are an error. 306 */ 307 Dwarf_Small dw_offset_relevant; 308 309 /* For DWARF2, always 0 */ 310 Dwarf_Small dw_value_type; 311 312 Dwarf_Half dw_regnum; 313 314 /* The data type here should the larger of Dwarf_Addr 315 and Dwarf_Unsigned and Dwarf_Signed. */ 316 Dwarf_Addr dw_offset; 317 } Dwarf_Regtable_Entry; 318 319 typedef struct Dwarf_Regtable_s { 320 struct Dwarf_Regtable_Entry_s rules[DW_REG_TABLE_SIZE]; 321 } Dwarf_Regtable; 322 323 /* opaque type. Functional interface shown later. */ 324 struct Dwarf_Reg_value3_s; 325 typedef struct Dwarf_Reg_value3_s Dwarf_Reg_Value3; 326 327 typedef struct Dwarf_Regtable_Entry3_s { 328 /* For each index i (naming a hardware register with dwarf number 329 i) the following is true and defines the value of that register: 330 331 If dw_regnum is Register DW_FRAME_UNDEFINED_VAL 332 it is not DWARF register number but 333 a place holder indicating the register has no defined value. 334 If dw_regnum is Register DW_FRAME_SAME_VAL 335 it is not DWARF register number but 336 a place holder indicating the register has the same 337 value in the previous frame. 338 DW_FRAME_UNDEFINED_VAL, DW_FRAME_SAME_VAL and 339 DW_FRAME_CFA_COL3 are only present at libdwarf runtime. 340 Never on disk. 341 DW_FRAME_* Values present on disk are in dwarf.h 342 Because DW_FRAME_SAME_VAL and DW_FRAME_UNDEFINED_VAL 343 and DW_FRAME_CFA_COL3 are defineable at runtime 344 consider the names symbolic in this comment, not absolute. 345 346 Otherwise: the register number is a DWARF register number 347 (see ABI documents for how this translates to hardware/ 348 software register numbers in the machine hardware) 349 and the following applies: 350 351 In a cfa-defining entry (rt3_cfa_rule) the regnum is the 352 CFA 'register number'. Which is some 'normal' register, 353 not DW_FRAME_CFA_COL3, nor DW_FRAME_SAME_VAL, nor 354 DW_FRAME_UNDEFINED_VAL. 355 356 If dw_value_type == DW_EXPR_OFFSET (the only possible case for 357 dwarf2): 358 If dw_offset_relevant is non-zero, then 359 the value is stored at at the address 360 CFA+N where N is a signed offset. 361 dw_regnum is the cfa register rule which means 362 one ignores dw_regnum and uses the CFA appropriately. 363 So dw_offset_or_block_len is a signed value, really, 364 and must be printed/evaluated as such. 365 Rule: Offset(N) 366 If dw_offset_relevant is zero, then the value of the register 367 is the value of (DWARF) register number dw_regnum. 368 Rule: register(R) 369 If dw_value_type == DW_EXPR_VAL_OFFSET 370 the value of this register is CFA +N where N is a signed offset. 371 dw_regnum is the cfa register rule which means 372 one ignores dw_regnum and uses the CFA appropriately. 373 Rule: val_offset(N) 374 If dw_value_type == DW_EXPR_EXPRESSION 375 The value of the register is the value at the address 376 computed by evaluating the DWARF expression E. 377 Rule: expression(E) 378 The expression E byte stream is pointed to by dw_block_ptr. 379 The expression length in bytes is given by 380 dw_offset_or_block_len. 381 If dw_value_type == DW_EXPR_VAL_EXPRESSION 382 The value of the register is the value 383 computed by evaluating the DWARF expression E. 384 Rule: val_expression(E) 385 The expression E byte stream is pointed to by dw_block_ptr. 386 The expression length in bytes is given by 387 dw_offset_or_block_len. 388 Other values of dw_value_type are an error. 389 */ 390 Dwarf_Small dw_offset_relevant; 391 Dwarf_Small dw_value_type; 392 Dwarf_Half dw_regnum; 393 Dwarf_Unsigned dw_offset_or_block_len; 394 Dwarf_Ptr dw_block_ptr; 395 396 }Dwarf_Regtable_Entry3; 397 398 /* For the DWARF3 version, moved the DW_FRAME_CFA_COL 399 out of the array and into its own struct. 400 Having it part of the array is not very easy to work 401 with from a portability point of view: changing 402 the number for every architecture is a pain (if one fails 403 to set it correctly a register rule gets clobbered when 404 setting CFA). With MIPS it just happened to be easy to use 405 DW_FRAME_CFA_COL (it was wrong conceptually but it was easy...). 406 407 rt3_rules and rt3_reg_table_size must be filled in before 408 calling libdwarf. Filled in with a pointer to an array 409 (pointer and array set up by the calling application) 410 of rt3_reg_table_size Dwarf_Regtable_Entry3_s structs. 411 libdwarf does not allocate or deallocate space for the 412 rules, you must do so. libdwarf will initialize the 413 contents rules array, you do not need to do so (though 414 if you choose to initialize the array somehow that is ok: 415 libdwarf will overwrite your initializations with its own). 416 417 */ 418 typedef struct Dwarf_Regtable3_s { 419 struct Dwarf_Regtable_Entry3_s rt3_cfa_rule; 420 421 Dwarf_Half rt3_reg_table_size; 422 struct Dwarf_Regtable_Entry3_s * rt3_rules; 423 } Dwarf_Regtable3; 424 425 426 /* Use for DW_EPXR_STANDARD., DW_EXPR_VAL_OFFSET. 427 Returns DW_DLV_OK if the value is available. 428 If DW_DLV_OK returns the regnum and offset thru the pointers 429 (which the consumer must use appropriately). 430 */ 431 int dwarf_frame_get_reg_register(struct Dwarf_Regtable_Entry3_s *reg_in, 432 Dwarf_Small *offset_relevant, 433 Dwarf_Half *regnum_out, 434 Dwarf_Signed *offset_out); 435 436 /* Use for DW_EXPR_EXPRESSION, DW_EXPR_VAL_EXPRESSION. 437 Returns DW_DLV_OK if the value is available. 438 The caller must pass in the address of a valid 439 Dwarf_Block (the caller need not initialize it). 440 */ 441 int dwarf_frame_get_reg_expression(struct Dwarf_Regtable_Entry3_s *reg_in, 442 Dwarf_Block *block_out); 443 444 445 /* For DW_DLC_SYMBOLIC_RELOCATIONS output to caller 446 v2, adding drd_length: some relocations are 4 and 447 some 8 bytes (pointers are 8, section offsets 4) in 448 some dwarf environments. (MIPS relocations are all one 449 size in any given ABI.) Changing drd_type to an unsigned char 450 to keep struct size down. 451 */ 452 enum Dwarf_Rel_Type { 453 dwarf_drt_none, /* Should not get to caller */ 454 dwarf_drt_data_reloc, /* Simple normal relocation. */ 455 dwarf_drt_segment_rel, /* Special reloc, exceptions. */ 456 /* dwarf_drt_first_of_length_pair and drt_second 457 are for for the .word end - begin case. */ 458 dwarf_drt_first_of_length_pair, 459 dwarf_drt_second_of_length_pair 460 }; 461 462 typedef struct Dwarf_P_Marker_s * Dwarf_P_Marker; 463 struct Dwarf_P_Marker_s { 464 Dwarf_Unsigned ma_marker; 465 Dwarf_Unsigned ma_offset; 466 }; 467 468 typedef struct Dwarf_Relocation_Data_s * Dwarf_Relocation_Data; 469 struct Dwarf_Relocation_Data_s { 470 unsigned char drd_type; /* Cast to/from Dwarf_Rel_Type 471 to keep size small in struct. */ 472 unsigned char drd_length; /* Length in bytes of data being 473 relocated. 4 for 32bit data, 474 8 for 64bit data. */ 475 Dwarf_Unsigned drd_offset; /* Where the data to reloc is. */ 476 Dwarf_Unsigned drd_symbol_index; 477 }; 478 479 typedef struct Dwarf_P_String_Attr_s * Dwarf_P_String_Attr; 480 struct Dwarf_P_String_Attr_s { 481 Dwarf_Unsigned sa_offset; /* Offset of string attribute data */ 482 Dwarf_Unsigned sa_nbytes; 483 }; 484 485 486 /* Opaque types for Consumer Library. */ 487 typedef struct Dwarf_Debug_s* Dwarf_Debug; 488 typedef struct Dwarf_Die_s* Dwarf_Die; 489 typedef struct Dwarf_Line_s* Dwarf_Line; 490 typedef struct Dwarf_Global_s* Dwarf_Global; 491 typedef struct Dwarf_Func_s* Dwarf_Func; 492 typedef struct Dwarf_Type_s* Dwarf_Type; 493 typedef struct Dwarf_Var_s* Dwarf_Var; 494 typedef struct Dwarf_Weak_s* Dwarf_Weak; 495 typedef struct Dwarf_Error_s* Dwarf_Error; 496 typedef struct Dwarf_Attribute_s* Dwarf_Attribute; 497 typedef struct Dwarf_Abbrev_s* Dwarf_Abbrev; 498 typedef struct Dwarf_Fde_s* Dwarf_Fde; 499 typedef struct Dwarf_Cie_s* Dwarf_Cie; 500 typedef struct Dwarf_Arange_s* Dwarf_Arange; 501 502 /* Opaque types for Producer Library. */ 503 typedef struct Dwarf_P_Debug_s* Dwarf_P_Debug; 504 typedef struct Dwarf_P_Die_s* Dwarf_P_Die; 505 typedef struct Dwarf_P_Attribute_s* Dwarf_P_Attribute; 506 typedef struct Dwarf_P_Fde_s* Dwarf_P_Fde; 507 typedef struct Dwarf_P_Expr_s* Dwarf_P_Expr; 508 typedef Dwarf_Unsigned Dwarf_Tag; 509 510 511 /* error handler function 512 */ 513 typedef void (*Dwarf_Handler)(Dwarf_Error /*error*/, Dwarf_Ptr /*errarg*/); 514 515 516 /* Begin libdwarf Object File Interface declarations. 517 518 As of February 2008 there are multiple dwarf_reader object access 519 initialization methods available: 520 The traditional dwarf_elf_init() and dwarf_init() and dwarf_finish() 521 which assume libelf and POSIX file access. 522 An object-file and library agnostic dwarf_object_init() and dwarf_object_finish() 523 which allow the coder to provide object access routines 524 abstracting away the elf interface. So there is no dependence in the 525 reader code on the object format and no dependence on libelf. 526 See the code in dwarf_elf_access.c and dwarf_original_elf_init.c 527 to see an example of initializing the structures mentioned below. 528 529 Projects using dwarf_elf_init() or dwarf_init() can ignore 530 the Dwarf_Obj_Access* structures entirely as all these details 531 are completed for you. 532 533 */ 534 535 typedef struct Dwarf_Obj_Access_Interface_s Dwarf_Obj_Access_Interface; 536 typedef struct Dwarf_Obj_Access_Methods_s Dwarf_Obj_Access_Methods; 537 typedef struct Dwarf_Obj_Access_Section_s Dwarf_Obj_Access_Section; 538 539 540 /* Used in the get_section interface function 541 in Dwarf_Obj_Access_Section_s. Since libdwarf 542 depends on standard DWARF section names an object 543 format that has no such names (but has some 544 method of setting up 'sections equivalents') 545 must arrange to return standard DWARF section 546 names in the 'name' field. libdwarf does 547 not free the strings in 'name'. */ 548 struct Dwarf_Obj_Access_Section_s { 549 Dwarf_Addr addr; 550 Dwarf_Unsigned size; 551 const char* name; 552 /* Set link to zero if it is meaningless. If non-zero 553 it should be a link to a rela section or from symtab 554 to strtab. In Elf it is sh_link. */ 555 Dwarf_Unsigned link; 556 }; 557 558 /* Returned by the get_endianness function in 559 Dwarf_Obj_Access_Methods_s. */ 560 typedef enum { 561 DW_OBJECT_MSB, 562 DW_OBJECT_LSB 563 } Dwarf_Endianness; 564 565 /* The functions we need to access object data from libdwarf are declared here. 566 567 In these function pointer declarations 568 'void *obj' is intended to be a pointer (the object field in 569 Dwarf_Obj_Access_Interface_s) 570 that hides the library-specific and object-specific data that makes 571 it possible to handle multiple object formats and multiple libraries. 572 It's not required that one handles multiple such in a single libdwarf 573 archive/shared-library (but not ruled out either). 574 See dwarf_elf_object_access_internals_t and dwarf_elf_access.c 575 for an example. 576 577 */ 578 struct Dwarf_Obj_Access_Methods_s { 579 /** 580 * get_section_info 581 * 582 * Get address, size, and name info about a section. 583 * 584 * Parameters 585 * section_index - Zero-based index. 586 * return_section - Pointer to a structure in which section info 587 * will be placed. Caller must provide a valid pointer to a 588 * structure area. The structure's contents will be overwritten 589 * by the call to get_section_info. 590 * error - A pointer to an integer in which an error code may be stored. 591 * 592 * Return 593 * DW_DLV_OK - Everything ok. 594 * DW_DLV_ERROR - Error occurred. Use 'error' to determine the 595 * libdwarf defined error. 596 * DW_DLV_NO_ENTRY - No such section. 597 */ 598 int (*get_section_info)(void* obj, Dwarf_Half section_index, 599 Dwarf_Obj_Access_Section* return_section, int* error); 600 /** 601 * get_byte_order 602 * 603 * Get whether the object file represented by this interface is big-endian 604 * (DW_OBJECT_MSB) or little endian (DW_OBJECT_LSB). 605 * 606 * Parameters 607 * obj - Equivalent to 'this' in OO languages. 608 * 609 * Return 610 * Endianness of object. Cannot fail. 611 */ 612 Dwarf_Endianness (*get_byte_order)(void* obj); 613 /** 614 * get_length_size 615 * 616 * Get the size of a length field in the underlying object file. 617 * libdwarf currently supports * 4 and 8 byte sizes, but may 618 * support larger in the future. 619 * Perhaps the return type should be an enumeration? 620 * 621 * Parameters 622 * obj - Equivalent to 'this' in OO languages. 623 * 624 * Return 625 * Size of length. Cannot fail. 626 */ 627 Dwarf_Small (*get_length_size)(void* obj); 628 /** 629 * get_pointer_size 630 * 631 * Get the size of a pointer field in the underlying object file. 632 * libdwarf currently supports 4 and 8 byte sizes. 633 * Perhaps the return type should be an enumeration? 634 635 * Return 636 * Size of pointer. Cannot fail. 637 */ 638 Dwarf_Small (*get_pointer_size)(void* obj); 639 /** 640 * get_section_count 641 * 642 * Get the number of sections in the object file. 643 * 644 * Parameters 645 * 646 * Return 647 * Number of sections 648 */ 649 Dwarf_Unsigned (*get_section_count)(void* obj); 650 /** 651 * load_section 652 * 653 * Get a pointer to an array of bytes that represent the section. 654 * 655 * Parameters 656 * section_index - Zero-based index. 657 * return_data - The address of a pointer to which the section data block 658 * will be assigned. 659 * error - Pointer to an integer for returning libdwarf-defined 660 * error numbers. 661 * 662 * Return 663 * DW_DLV_OK - No error. 664 * DW_DLV_ERROR - Error. Use 'error' to indicate a libdwarf-defined 665 * error number. 666 * DW_DLV_NO_ENTRY - No such section. 667 */ 668 int (*load_section)(void* obj, Dwarf_Half section_index, 669 Dwarf_Small** return_data, int* error); 670 671 /** 672 * relocate_a_section 673 * If relocations are not supported leave this pointer NULL. 674 * 675 * Get a pointer to an array of bytes that represent the section. 676 * 677 * Parameters 678 * section_index - Zero-based index of the section to be relocated. 679 * error - Pointer to an integer for returning libdwarf-defined 680 * error numbers. 681 * 682 * Return 683 * DW_DLV_OK - No error. 684 * DW_DLV_ERROR - Error. Use 'error' to indicate a libdwarf-defined 685 * error number. 686 * DW_DLV_NO_ENTRY - No such section. 687 */ 688 int (*relocate_a_section)(void* obj, Dwarf_Half section_index, 689 Dwarf_Debug dbg, 690 int* error); 691 692 }; 693 694 695 696 /* These structures are allocated and deallocated by your code 697 when you are using the libdwarf Object File Interface 698 [dwarf_object_init() and dwarf_object_finish()] directly. 699 dwarf_object_finish() does not free 700 struct Dwarf_Obj_Access_Interface_s or its content. 701 (libdwarf does record a pointer to this struct: you must 702 ensure that pointer remains valid for as long as 703 a libdwarf instance is open (meaning 704 after dwarf_init() and before dwarf_finish()). 705 706 If you are reading Elf objects and libelf use dwarf_init() 707 or dwarf_elf_init() which take care of these details. 708 */ 709 struct Dwarf_Obj_Access_Interface_s { 710 /* object is a void* as it hides the data the object access routines 711 need (which varies by library in use and object format). 712 */ 713 void* object; 714 const Dwarf_Obj_Access_Methods * methods; 715 }; 716 717 /* End libdwarf Object File Interface */ 718 719 /* 720 Dwarf_dealloc() alloc_type arguments. 721 Argument points to: 722 */ 723 #define DW_DLA_STRING 0x01 /* char* */ 724 #define DW_DLA_LOC 0x02 /* Dwarf_Loc */ 725 #define DW_DLA_LOCDESC 0x03 /* Dwarf_Locdesc */ 726 #define DW_DLA_ELLIST 0x04 /* Dwarf_Ellist (not used)*/ 727 #define DW_DLA_BOUNDS 0x05 /* Dwarf_Bounds (not used) */ 728 #define DW_DLA_BLOCK 0x06 /* Dwarf_Block */ 729 #define DW_DLA_DEBUG 0x07 /* Dwarf_Debug */ 730 #define DW_DLA_DIE 0x08 /* Dwarf_Die */ 731 #define DW_DLA_LINE 0x09 /* Dwarf_Line */ 732 #define DW_DLA_ATTR 0x0a /* Dwarf_Attribute */ 733 #define DW_DLA_TYPE 0x0b /* Dwarf_Type (not used) */ 734 #define DW_DLA_SUBSCR 0x0c /* Dwarf_Subscr (not used) */ 735 #define DW_DLA_GLOBAL 0x0d /* Dwarf_Global */ 736 #define DW_DLA_ERROR 0x0e /* Dwarf_Error */ 737 #define DW_DLA_LIST 0x0f /* a list */ 738 #define DW_DLA_LINEBUF 0x10 /* Dwarf_Line* (not used) */ 739 #define DW_DLA_ARANGE 0x11 /* Dwarf_Arange */ 740 #define DW_DLA_ABBREV 0x12 /* Dwarf_Abbrev */ 741 #define DW_DLA_FRAME_OP 0x13 /* Dwarf_Frame_Op */ 742 #define DW_DLA_CIE 0x14 /* Dwarf_Cie */ 743 #define DW_DLA_FDE 0x15 /* Dwarf_Fde */ 744 #define DW_DLA_LOC_BLOCK 0x16 /* Dwarf_Loc Block (not used) */ 745 #define DW_DLA_FRAME_BLOCK 0x17 /* Dwarf_Frame Block (not used) */ 746 #define DW_DLA_FUNC 0x18 /* Dwarf_Func */ 747 #define DW_DLA_TYPENAME 0x19 /* Dwarf_Type */ 748 #define DW_DLA_VAR 0x1a /* Dwarf_Var */ 749 #define DW_DLA_WEAK 0x1b /* Dwarf_Weak */ 750 #define DW_DLA_ADDR 0x1c /* Dwarf_Addr sized entries */ 751 #define DW_DLA_RANGES 0x1d /* Dwarf_Ranges */ 752 753 /* The augmenter string for CIE */ 754 #define DW_CIE_AUGMENTER_STRING_V0 "z" 755 756 /* dwarf_init() access arguments 757 */ 758 #define DW_DLC_READ 0 /* read only access */ 759 #define DW_DLC_WRITE 1 /* write only access */ 760 #define DW_DLC_RDWR 2 /* read/write access NOT SUPPORTED*/ 761 762 /* pro_init() access flag modifiers 763 If HAVE_DWARF2_99_EXTENSION is defined at libdwarf build time 764 and DW_DLC_OFFSET_SIZE_64 is passed in pro_init() flags then the DWARF3 765 64 bit offset extension is used to generate 64 bit offsets. 766 */ 767 #define DW_DLC_SIZE_64 0x40000000 /* 32-bit address-size target */ 768 #define DW_DLC_SIZE_32 0x20000000 /* 64-bit address-size target */ 769 #define DW_DLC_OFFSET_SIZE_64 0x10000000 /* 64-bit offset-size DWARF */ 770 771 /* dwarf_pro_init() access flag modifiers 772 */ 773 #define DW_DLC_ISA_MIPS 0x00000000 /* MIPS target */ 774 #define DW_DLC_ISA_IA64 0x01000000 /* IA64 target */ 775 #define DW_DLC_STREAM_RELOCATIONS 0x02000000 /* Old style binary relocs */ 776 777 /* Usable with assembly output because it is up to the producer to 778 deal with locations in whatever manner the producer code wishes. 779 Possibly emitting text an assembler will recognize. */ 780 #define DW_DLC_SYMBOLIC_RELOCATIONS 0x04000000 781 782 #define DW_DLC_TARGET_BIGENDIAN 0x08000000 /* Big endian target */ 783 #define DW_DLC_TARGET_LITTLEENDIAN 0x00100000 /* Little endian target */ 784 785 #if 0 786 /* 787 The libdwarf producer interfaces jumble these two semantics together in 788 confusing ways. We *should* have flags like these... 789 But changing the code means a lot of diffs. So for now, 790 we leave things as they are 791 */ 792 #define DW_DLC_SUN_OFFSET32 0x00010000 /* use 32-bit sec offsets */ 793 #define DW_DLC_SUN_OFFSET64 0x00020000 /* use 64-bit sec offsets */ 794 #define DW_DLC_SUN_POINTER32 0x00040000 /* use 4 for address_size */ 795 #define DW_DLC_SUN_POINTER64 0x00080000 /* use 8 for address_size */ 796 #endif 797 798 /* dwarf_pcline() slide arguments 799 */ 800 #define DW_DLS_BACKWARD -1 /* slide backward to find line */ 801 #define DW_DLS_NOSLIDE 0 /* match exactly without sliding */ 802 #define DW_DLS_FORWARD 1 /* slide forward to find line */ 803 804 /* libdwarf error numbers 805 */ 806 #define DW_DLE_NE 0 /* no error */ 807 #define DW_DLE_VMM 1 /* dwarf format/library version mismatch */ 808 #define DW_DLE_MAP 2 /* memory map failure */ 809 #define DW_DLE_LEE 3 /* libelf error */ 810 #define DW_DLE_NDS 4 /* no debug section */ 811 #define DW_DLE_NLS 5 /* no line section */ 812 #define DW_DLE_ID 6 /* invalid descriptor for query */ 813 #define DW_DLE_IOF 7 /* I/O failure */ 814 #define DW_DLE_MAF 8 /* memory allocation failure */ 815 #define DW_DLE_IA 9 /* invalid argument */ 816 #define DW_DLE_MDE 10 /* mangled debugging entry */ 817 #define DW_DLE_MLE 11 /* mangled line number entry */ 818 #define DW_DLE_FNO 12 /* file not open */ 819 #define DW_DLE_FNR 13 /* file not a regular file */ 820 #define DW_DLE_FWA 14 /* file open with wrong access */ 821 #define DW_DLE_NOB 15 /* not an object file */ 822 #define DW_DLE_MOF 16 /* mangled object file header */ 823 #define DW_DLE_EOLL 17 /* end of location list entries */ 824 #define DW_DLE_NOLL 18 /* no location list section */ 825 #define DW_DLE_BADOFF 19 /* Invalid offset */ 826 #define DW_DLE_EOS 20 /* end of section */ 827 #define DW_DLE_ATRUNC 21 /* abbreviations section appears truncated*/ 828 #define DW_DLE_BADBITC 22 /* Address size passed to dwarf bad*/ 829 /* It is not an allowed size (64 or 32) */ 830 /* Error codes defined by the current Libdwarf Implementation. */ 831 #define DW_DLE_DBG_ALLOC 23 832 #define DW_DLE_FSTAT_ERROR 24 833 #define DW_DLE_FSTAT_MODE_ERROR 25 834 #define DW_DLE_INIT_ACCESS_WRONG 26 835 #define DW_DLE_ELF_BEGIN_ERROR 27 836 #define DW_DLE_ELF_GETEHDR_ERROR 28 837 #define DW_DLE_ELF_GETSHDR_ERROR 29 838 #define DW_DLE_ELF_STRPTR_ERROR 30 839 #define DW_DLE_DEBUG_INFO_DUPLICATE 31 840 #define DW_DLE_DEBUG_INFO_NULL 32 841 #define DW_DLE_DEBUG_ABBREV_DUPLICATE 33 842 #define DW_DLE_DEBUG_ABBREV_NULL 34 843 #define DW_DLE_DEBUG_ARANGES_DUPLICATE 35 844 #define DW_DLE_DEBUG_ARANGES_NULL 36 845 #define DW_DLE_DEBUG_LINE_DUPLICATE 37 846 #define DW_DLE_DEBUG_LINE_NULL 38 847 #define DW_DLE_DEBUG_LOC_DUPLICATE 39 848 #define DW_DLE_DEBUG_LOC_NULL 40 849 #define DW_DLE_DEBUG_MACINFO_DUPLICATE 41 850 #define DW_DLE_DEBUG_MACINFO_NULL 42 851 #define DW_DLE_DEBUG_PUBNAMES_DUPLICATE 43 852 #define DW_DLE_DEBUG_PUBNAMES_NULL 44 853 #define DW_DLE_DEBUG_STR_DUPLICATE 45 854 #define DW_DLE_DEBUG_STR_NULL 46 855 #define DW_DLE_CU_LENGTH_ERROR 47 856 #define DW_DLE_VERSION_STAMP_ERROR 48 857 #define DW_DLE_ABBREV_OFFSET_ERROR 49 858 #define DW_DLE_ADDRESS_SIZE_ERROR 50 859 #define DW_DLE_DEBUG_INFO_PTR_NULL 51 860 #define DW_DLE_DIE_NULL 52 861 #define DW_DLE_STRING_OFFSET_BAD 53 862 #define DW_DLE_DEBUG_LINE_LENGTH_BAD 54 863 #define DW_DLE_LINE_PROLOG_LENGTH_BAD 55 864 #define DW_DLE_LINE_NUM_OPERANDS_BAD 56 865 #define DW_DLE_LINE_SET_ADDR_ERROR 57 /* No longer used. */ 866 #define DW_DLE_LINE_EXT_OPCODE_BAD 58 867 #define DW_DLE_DWARF_LINE_NULL 59 868 #define DW_DLE_INCL_DIR_NUM_BAD 60 869 #define DW_DLE_LINE_FILE_NUM_BAD 61 870 #define DW_DLE_ALLOC_FAIL 62 871 #define DW_DLE_NO_CALLBACK_FUNC 63 872 #define DW_DLE_SECT_ALLOC 64 873 #define DW_DLE_FILE_ENTRY_ALLOC 65 874 #define DW_DLE_LINE_ALLOC 66 875 #define DW_DLE_FPGM_ALLOC 67 876 #define DW_DLE_INCDIR_ALLOC 68 877 #define DW_DLE_STRING_ALLOC 69 878 #define DW_DLE_CHUNK_ALLOC 70 879 #define DW_DLE_BYTEOFF_ERR 71 880 #define DW_DLE_CIE_ALLOC 72 881 #define DW_DLE_FDE_ALLOC 73 882 #define DW_DLE_REGNO_OVFL 74 883 #define DW_DLE_CIE_OFFS_ALLOC 75 884 #define DW_DLE_WRONG_ADDRESS 76 885 #define DW_DLE_EXTRA_NEIGHBORS 77 886 #define DW_DLE_WRONG_TAG 78 887 #define DW_DLE_DIE_ALLOC 79 888 #define DW_DLE_PARENT_EXISTS 80 889 #define DW_DLE_DBG_NULL 81 890 #define DW_DLE_DEBUGLINE_ERROR 82 891 #define DW_DLE_DEBUGFRAME_ERROR 83 892 #define DW_DLE_DEBUGINFO_ERROR 84 893 #define DW_DLE_ATTR_ALLOC 85 894 #define DW_DLE_ABBREV_ALLOC 86 895 #define DW_DLE_OFFSET_UFLW 87 896 #define DW_DLE_ELF_SECT_ERR 88 897 #define DW_DLE_DEBUG_FRAME_LENGTH_BAD 89 898 #define DW_DLE_FRAME_VERSION_BAD 90 899 #define DW_DLE_CIE_RET_ADDR_REG_ERROR 91 900 #define DW_DLE_FDE_NULL 92 901 #define DW_DLE_FDE_DBG_NULL 93 902 #define DW_DLE_CIE_NULL 94 903 #define DW_DLE_CIE_DBG_NULL 95 904 #define DW_DLE_FRAME_TABLE_COL_BAD 96 905 #define DW_DLE_PC_NOT_IN_FDE_RANGE 97 906 #define DW_DLE_CIE_INSTR_EXEC_ERROR 98 907 #define DW_DLE_FRAME_INSTR_EXEC_ERROR 99 908 #define DW_DLE_FDE_PTR_NULL 100 909 #define DW_DLE_RET_OP_LIST_NULL 101 910 #define DW_DLE_LINE_CONTEXT_NULL 102 911 #define DW_DLE_DBG_NO_CU_CONTEXT 103 912 #define DW_DLE_DIE_NO_CU_CONTEXT 104 913 #define DW_DLE_FIRST_DIE_NOT_CU 105 914 #define DW_DLE_NEXT_DIE_PTR_NULL 106 915 #define DW_DLE_DEBUG_FRAME_DUPLICATE 107 916 #define DW_DLE_DEBUG_FRAME_NULL 108 917 #define DW_DLE_ABBREV_DECODE_ERROR 109 918 #define DW_DLE_DWARF_ABBREV_NULL 110 919 #define DW_DLE_ATTR_NULL 111 920 #define DW_DLE_DIE_BAD 112 921 #define DW_DLE_DIE_ABBREV_BAD 113 922 #define DW_DLE_ATTR_FORM_BAD 114 923 #define DW_DLE_ATTR_NO_CU_CONTEXT 115 924 #define DW_DLE_ATTR_FORM_SIZE_BAD 116 925 #define DW_DLE_ATTR_DBG_NULL 117 926 #define DW_DLE_BAD_REF_FORM 118 927 #define DW_DLE_ATTR_FORM_OFFSET_BAD 119 928 #define DW_DLE_LINE_OFFSET_BAD 120 929 #define DW_DLE_DEBUG_STR_OFFSET_BAD 121 930 #define DW_DLE_STRING_PTR_NULL 122 931 #define DW_DLE_PUBNAMES_VERSION_ERROR 123 932 #define DW_DLE_PUBNAMES_LENGTH_BAD 124 933 #define DW_DLE_GLOBAL_NULL 125 934 #define DW_DLE_GLOBAL_CONTEXT_NULL 126 935 #define DW_DLE_DIR_INDEX_BAD 127 936 #define DW_DLE_LOC_EXPR_BAD 128 937 #define DW_DLE_DIE_LOC_EXPR_BAD 129 938 #define DW_DLE_ADDR_ALLOC 130 939 #define DW_DLE_OFFSET_BAD 131 940 #define DW_DLE_MAKE_CU_CONTEXT_FAIL 132 941 #define DW_DLE_REL_ALLOC 133 942 #define DW_DLE_ARANGE_OFFSET_BAD 134 943 #define DW_DLE_SEGMENT_SIZE_BAD 135 944 #define DW_DLE_ARANGE_LENGTH_BAD 136 945 #define DW_DLE_ARANGE_DECODE_ERROR 137 946 #define DW_DLE_ARANGES_NULL 138 947 #define DW_DLE_ARANGE_NULL 139 948 #define DW_DLE_NO_FILE_NAME 140 949 #define DW_DLE_NO_COMP_DIR 141 950 #define DW_DLE_CU_ADDRESS_SIZE_BAD 142 951 #define DW_DLE_INPUT_ATTR_BAD 143 952 #define DW_DLE_EXPR_NULL 144 953 #define DW_DLE_BAD_EXPR_OPCODE 145 954 #define DW_DLE_EXPR_LENGTH_BAD 146 955 #define DW_DLE_MULTIPLE_RELOC_IN_EXPR 147 956 #define DW_DLE_ELF_GETIDENT_ERROR 148 957 #define DW_DLE_NO_AT_MIPS_FDE 149 958 #define DW_DLE_NO_CIE_FOR_FDE 150 959 #define DW_DLE_DIE_ABBREV_LIST_NULL 151 960 #define DW_DLE_DEBUG_FUNCNAMES_DUPLICATE 152 961 #define DW_DLE_DEBUG_FUNCNAMES_NULL 153 962 #define DW_DLE_DEBUG_FUNCNAMES_VERSION_ERROR 154 963 #define DW_DLE_DEBUG_FUNCNAMES_LENGTH_BAD 155 964 #define DW_DLE_FUNC_NULL 156 965 #define DW_DLE_FUNC_CONTEXT_NULL 157 966 #define DW_DLE_DEBUG_TYPENAMES_DUPLICATE 158 967 #define DW_DLE_DEBUG_TYPENAMES_NULL 159 968 #define DW_DLE_DEBUG_TYPENAMES_VERSION_ERROR 160 969 #define DW_DLE_DEBUG_TYPENAMES_LENGTH_BAD 161 970 #define DW_DLE_TYPE_NULL 162 971 #define DW_DLE_TYPE_CONTEXT_NULL 163 972 #define DW_DLE_DEBUG_VARNAMES_DUPLICATE 164 973 #define DW_DLE_DEBUG_VARNAMES_NULL 165 974 #define DW_DLE_DEBUG_VARNAMES_VERSION_ERROR 166 975 #define DW_DLE_DEBUG_VARNAMES_LENGTH_BAD 167 976 #define DW_DLE_VAR_NULL 168 977 #define DW_DLE_VAR_CONTEXT_NULL 169 978 #define DW_DLE_DEBUG_WEAKNAMES_DUPLICATE 170 979 #define DW_DLE_DEBUG_WEAKNAMES_NULL 171 980 #define DW_DLE_DEBUG_WEAKNAMES_VERSION_ERROR 172 981 #define DW_DLE_DEBUG_WEAKNAMES_LENGTH_BAD 173 982 #define DW_DLE_WEAK_NULL 174 983 #define DW_DLE_WEAK_CONTEXT_NULL 175 984 #define DW_DLE_LOCDESC_COUNT_WRONG 176 985 #define DW_DLE_MACINFO_STRING_NULL 177 986 #define DW_DLE_MACINFO_STRING_EMPTY 178 987 #define DW_DLE_MACINFO_INTERNAL_ERROR_SPACE 179 988 #define DW_DLE_MACINFO_MALLOC_FAIL 180 989 #define DW_DLE_DEBUGMACINFO_ERROR 181 990 #define DW_DLE_DEBUG_MACRO_LENGTH_BAD 182 991 #define DW_DLE_DEBUG_MACRO_MAX_BAD 183 992 #define DW_DLE_DEBUG_MACRO_INTERNAL_ERR 184 993 #define DW_DLE_DEBUG_MACRO_MALLOC_SPACE 185 994 #define DW_DLE_DEBUG_MACRO_INCONSISTENT 186 995 #define DW_DLE_DF_NO_CIE_AUGMENTATION 187 996 #define DW_DLE_DF_REG_NUM_TOO_HIGH 188 997 #define DW_DLE_DF_MAKE_INSTR_NO_INIT 189 998 #define DW_DLE_DF_NEW_LOC_LESS_OLD_LOC 190 999 #define DW_DLE_DF_POP_EMPTY_STACK 191 1000 #define DW_DLE_DF_ALLOC_FAIL 192 1001 #define DW_DLE_DF_FRAME_DECODING_ERROR 193 1002 #define DW_DLE_DEBUG_LOC_SECTION_SHORT 194 1003 #define DW_DLE_FRAME_AUGMENTATION_UNKNOWN 195 1004 #define DW_DLE_PUBTYPE_CONTEXT 196 /* Unused. */ 1005 #define DW_DLE_DEBUG_PUBTYPES_LENGTH_BAD 197 1006 #define DW_DLE_DEBUG_PUBTYPES_VERSION_ERROR 198 1007 #define DW_DLE_DEBUG_PUBTYPES_DUPLICATE 199 1008 #define DW_DLE_FRAME_CIE_DECODE_ERROR 200 1009 #define DW_DLE_FRAME_REGISTER_UNREPRESENTABLE 201 1010 #define DW_DLE_FRAME_REGISTER_COUNT_MISMATCH 202 1011 #define DW_DLE_LINK_LOOP 203 1012 #define DW_DLE_STRP_OFFSET_BAD 204 1013 #define DW_DLE_DEBUG_RANGES_DUPLICATE 205 1014 #define DW_DLE_DEBUG_RANGES_OFFSET_BAD 206 1015 #define DW_DLE_DEBUG_RANGES_MISSING_END 207 1016 #define DW_DLE_DEBUG_RANGES_OUT_OF_MEM 208 1017 #define DW_DLE_DEBUG_SYMTAB_ERR 209 1018 #define DW_DLE_DEBUG_STRTAB_ERR 210 1019 #define DW_DLE_RELOC_MISMATCH_INDEX 211 1020 #define DW_DLE_RELOC_MISMATCH_RELOC_INDEX 212 1021 #define DW_DLE_RELOC_MISMATCH_STRTAB_INDEX 213 1022 #define DW_DLE_RELOC_SECTION_MISMATCH 214 1023 #define DW_DLE_RELOC_SECTION_MISSING_INDEX 215 1024 #define DW_DLE_RELOC_SECTION_LENGTH_ODD 216 1025 #define DW_DLE_RELOC_SECTION_PTR_NULL 217 1026 #define DW_DLE_RELOC_SECTION_MALLOC_FAIL 218 1027 #define DW_DLE_NO_ELF64_SUPPORT 219 1028 #define DW_DLE_MISSING_ELF64_SUPPORT 220 1029 #define DW_DLE_ORPHAN_FDE 221 1030 #define DW_DLE_DUPLICATE_INST_BLOCK 222 1031 #define DW_DLE_BAD_REF_SIG8_FORM 223 1032 #define DW_DLE_ATTR_EXPRLOC_FORM_BAD 224 1033 #define DW_DLE_FORM_SEC_OFFSET_LENGTH_BAD 225 1034 #define DW_DLE_NOT_REF_FORM 226 1035 #define DW_DLE_DEBUG_FRAME_LENGTH_NOT_MULTIPLE 227 1036 1037 1038 1039 /* DW_DLE_LAST MUST EQUAL LAST ERROR NUMBER */ 1040 #define DW_DLE_LAST 227 1041 #define DW_DLE_LO_USER 0x10000 1042 1043 /* Taken as meaning 'undefined value', this is not 1044 a column or register number. 1045 Only present at libdwarf runtime. Never on disk. 1046 DW_FRAME_* Values present on disk are in dwarf.h 1047 */ 1048 #define DW_FRAME_UNDEFINED_VAL 1034 1049 1050 /* Taken as meaning 'same value' as caller had, not a column 1051 or register number 1052 Only present at libdwarf runtime. Never on disk. 1053 DW_FRAME_* Values present on disk are in dwarf.h 1054 */ 1055 #define DW_FRAME_SAME_VAL 1035 1056 1057 1058 1059 /* error return values 1060 */ 1061 #define DW_DLV_BADADDR (~(Dwarf_Addr)0) 1062 /* for functions returning target address */ 1063 1064 #define DW_DLV_NOCOUNT ((Dwarf_Signed)-1) 1065 /* for functions returning count */ 1066 1067 #define DW_DLV_BADOFFSET (~(Dwarf_Off)0) 1068 /* for functions returning offset */ 1069 1070 /* standard return values for functions */ 1071 #define DW_DLV_NO_ENTRY -1 1072 #define DW_DLV_OK 0 1073 #define DW_DLV_ERROR 1 1074 1075 /* Special values for offset_into_exception_table field of dwarf fde's. */ 1076 /* The following value indicates that there is no Exception table offset 1077 associated with a dwarf frame. */ 1078 #define DW_DLX_NO_EH_OFFSET (-1LL) 1079 /* The following value indicates that the producer was unable to analyse the 1080 source file to generate Exception tables for this function. */ 1081 #define DW_DLX_EH_OFFSET_UNAVAILABLE (-2LL) 1082 1083 1084 /*===========================================================================*/ 1085 /* Dwarf consumer interface initialization and termination operations */ 1086 1087 /* Initialization based on Unix open fd (using libelf internally). */ 1088 int dwarf_init(int /*fd*/, 1089 Dwarf_Unsigned /*access*/, 1090 Dwarf_Handler /*errhand*/, 1091 Dwarf_Ptr /*errarg*/, 1092 Dwarf_Debug* /*dbg*/, 1093 Dwarf_Error* /*error*/); 1094 1095 /* Initialization based on libelf/sgi-fastlibelf open pointer. */ 1096 int dwarf_elf_init(dwarf_elf_handle /*elf*/, 1097 Dwarf_Unsigned /*access*/, 1098 Dwarf_Handler /*errhand*/, 1099 Dwarf_Ptr /*errarg*/, 1100 Dwarf_Debug* /*dbg*/, 1101 Dwarf_Error* /*error*/); 1102 1103 /* Undocumented function for memory allocator. */ 1104 void dwarf_print_memory_stats(Dwarf_Debug /*dbg*/); 1105 1106 int dwarf_get_elf(Dwarf_Debug /*dbg*/, 1107 dwarf_elf_handle* /*return_elfptr*/, 1108 Dwarf_Error* /*error*/); 1109 1110 int dwarf_finish(Dwarf_Debug /*dbg*/, Dwarf_Error* /*error*/); 1111 1112 1113 int dwarf_object_init(Dwarf_Obj_Access_Interface* /* obj */, 1114 Dwarf_Handler /* errhand */, 1115 Dwarf_Ptr /* errarg */, 1116 Dwarf_Debug* /* dbg */, 1117 Dwarf_Error* /* error */); 1118 1119 int dwarf_object_finish(Dwarf_Debug /* dbg */, 1120 Dwarf_Error* /* error */); 1121 1122 /* die traversal operations */ 1123 int dwarf_next_cu_header_b(Dwarf_Debug /*dbg*/, 1124 Dwarf_Unsigned* /*cu_header_length*/, 1125 Dwarf_Half* /*version_stamp*/, 1126 Dwarf_Off* /*abbrev_offset*/, 1127 Dwarf_Half* /*address_size*/, 1128 Dwarf_Half* /*length_size*/, 1129 Dwarf_Half* /*extension_size*/, 1130 Dwarf_Unsigned* /*next_cu_header_offset*/, 1131 Dwarf_Error* /*error*/); 1132 /* The following is now obsolete, though supported. November 2009. */ 1133 int dwarf_next_cu_header(Dwarf_Debug /*dbg*/, 1134 Dwarf_Unsigned* /*cu_header_length*/, 1135 Dwarf_Half* /*version_stamp*/, 1136 Dwarf_Off* /*abbrev_offset*/, 1137 Dwarf_Half* /*address_size*/, 1138 Dwarf_Unsigned* /*next_cu_header_offset*/, 1139 Dwarf_Error* /*error*/); 1140 1141 int dwarf_siblingof(Dwarf_Debug /*dbg*/, 1142 Dwarf_Die /*die*/, 1143 Dwarf_Die* /*return_siblingdie*/, 1144 Dwarf_Error* /*error*/); 1145 1146 int dwarf_child(Dwarf_Die /*die*/, 1147 Dwarf_Die* /*return_childdie*/, 1148 Dwarf_Error* /*error*/); 1149 1150 /* Finding die given global (not CU-relative) offset */ 1151 int dwarf_offdie(Dwarf_Debug /*dbg*/, 1152 Dwarf_Off /*offset*/, 1153 Dwarf_Die* /*return_die*/, 1154 Dwarf_Error* /*error*/); 1155 1156 /* Higher level functions (Unimplemented) */ 1157 int dwarf_pcfile(Dwarf_Debug /*dbg*/, 1158 Dwarf_Addr /*pc*/, 1159 Dwarf_Die* /*return_die*/, 1160 Dwarf_Error* /*error*/); 1161 1162 /* Unimplemented */ 1163 int dwarf_pcsubr(Dwarf_Debug /*dbg*/, 1164 Dwarf_Addr /*pc*/, 1165 Dwarf_Die* /*return_die*/, 1166 Dwarf_Error* /*error*/); 1167 1168 /* Unimplemented */ 1169 int dwarf_pcscope(Dwarf_Debug /*dbg*/, 1170 Dwarf_Addr /*pc*/, 1171 Dwarf_Die* /*return_die*/, 1172 Dwarf_Error* /*error*/); 1173 1174 /* operations on DIEs */ 1175 int dwarf_tag(Dwarf_Die /*die*/, 1176 Dwarf_Half* /*return_tag*/, 1177 Dwarf_Error* /*error*/); 1178 1179 /* utility? */ 1180 /* dwarf_dieoffset returns the global debug_info 1181 section offset, not the CU relative offset. */ 1182 int dwarf_dieoffset(Dwarf_Die /*die*/, 1183 Dwarf_Off* /*return_offset*/, 1184 Dwarf_Error* /*error*/); 1185 1186 /* dwarf_CU_dieoffset_given_die returns 1187 the global debug_info section offset of the CU die 1188 that is the CU containing the given_die 1189 (the passed in DIE can be any DIE). 1190 This information makes it possible for a consumer to 1191 find and print CU context information for any die. 1192 See also dwarf_get_cu_die_offset_given_cu_header_offset(). */ 1193 int dwarf_CU_dieoffset_given_die(Dwarf_Die /*given_die*/, 1194 Dwarf_Off* /*return_offset*/, 1195 Dwarf_Error* /*error*/); 1196 1197 /* dwarf_die_CU_offset returns the CU relative offset 1198 not the global debug_info section offset, given 1199 any DIE in the CU. See also dwarf_CU_dieoffset_given_die(). 1200 */ 1201 int dwarf_die_CU_offset(Dwarf_Die /*die*/, 1202 Dwarf_Off* /*return_offset*/, 1203 Dwarf_Error* /*error*/); 1204 1205 int dwarf_die_CU_offset_range(Dwarf_Die /*die*/, 1206 Dwarf_Off* /*return_CU_header_offset*/, 1207 Dwarf_Off* /*return_CU_length_bytes*/, 1208 Dwarf_Error* /*error*/); 1209 1210 int dwarf_attr (Dwarf_Die /*die*/, 1211 Dwarf_Half /*attr*/, 1212 Dwarf_Attribute * /*returned_attr*/, 1213 Dwarf_Error* /*error*/); 1214 1215 int dwarf_diename(Dwarf_Die /*die*/, 1216 char ** /*diename*/, 1217 Dwarf_Error* /*error*/); 1218 1219 /* Returns the abbrev code of the die. Cannot fail. */ 1220 int dwarf_die_abbrev_code(Dwarf_Die /*die */); 1221 1222 1223 /* convenience functions, alternative to using dwarf_attrlist() */ 1224 int dwarf_hasattr(Dwarf_Die /*die*/, 1225 Dwarf_Half /*attr*/, 1226 Dwarf_Bool * /*returned_bool*/, 1227 Dwarf_Error* /*error*/); 1228 1229 /* dwarf_loclist_n preferred over dwarf_loclist */ 1230 int dwarf_loclist_n(Dwarf_Attribute /*attr*/, 1231 Dwarf_Locdesc*** /*llbuf*/, 1232 Dwarf_Signed * /*locCount*/, 1233 Dwarf_Error* /*error*/); 1234 1235 int dwarf_loclist(Dwarf_Attribute /*attr*/, /* inflexible! */ 1236 Dwarf_Locdesc** /*llbuf*/, 1237 Dwarf_Signed * /*locCount*/, 1238 Dwarf_Error* /*error*/); 1239 1240 /* Extracts a dwarf expression from an expression byte stream. 1241 Useful to get expressions from DW_CFA_def_cfa_expression 1242 DW_CFA_expression DW_CFA_val_expression expression bytes. 1243 27 April 2009: dwarf_loclist_from_expr() interface with 1244 no addr_size is obsolete but supported, 1245 use dwarf_loclist_from_expr_a() instead. 1246 */ 1247 int dwarf_loclist_from_expr(Dwarf_Debug dbg, 1248 Dwarf_Ptr expression_in, 1249 Dwarf_Unsigned expression_length, 1250 Dwarf_Locdesc ** llbuf, 1251 Dwarf_Signed * listlen, Dwarf_Error * error); 1252 1253 /* dwarf_loclist_from_expr_a() new 27 Apr 2009: added addr_size argument. */ 1254 int dwarf_loclist_from_expr_a(Dwarf_Debug dbg, 1255 Dwarf_Ptr expression_in, 1256 Dwarf_Unsigned expression_length, 1257 Dwarf_Half addr_size, 1258 Dwarf_Locdesc ** llbuf, 1259 Dwarf_Signed * listlen, Dwarf_Error * error); 1260 1261 /* Unimplemented */ 1262 int dwarf_stringlen(Dwarf_Die /*die*/, 1263 Dwarf_Locdesc ** /*returned_locdesc*/, 1264 Dwarf_Error* /*error*/); 1265 1266 /* Unimplemented */ 1267 int dwarf_subscrcnt(Dwarf_Die /*die*/, 1268 Dwarf_Signed * /*returned_count*/, 1269 Dwarf_Error* /*error*/); 1270 1271 /* Unimplemented */ 1272 int dwarf_nthsubscr(Dwarf_Die /*die*/, 1273 Dwarf_Unsigned /*ssndx*/, 1274 Dwarf_Die * /*returned_die*/, 1275 Dwarf_Error* /*error*/); 1276 1277 int dwarf_lowpc(Dwarf_Die /*die*/, 1278 Dwarf_Addr * /*returned_addr*/, 1279 Dwarf_Error* /*error*/); 1280 1281 int dwarf_highpc(Dwarf_Die /*die*/, 1282 Dwarf_Addr * /*returned_addr*/, 1283 Dwarf_Error* /*error*/); 1284 1285 int dwarf_bytesize(Dwarf_Die /*die*/, 1286 Dwarf_Unsigned * /*returned_size*/, 1287 Dwarf_Error* /*error*/); 1288 1289 /* Unimplemented */ 1290 int dwarf_isbitfield(Dwarf_Die /*die*/, 1291 Dwarf_Bool * /*returned_bool*/, 1292 Dwarf_Error* /*error*/); 1293 1294 int dwarf_bitsize(Dwarf_Die /*die*/, 1295 Dwarf_Unsigned * /*returned_size*/, 1296 Dwarf_Error* /*error*/); 1297 1298 int dwarf_bitoffset(Dwarf_Die /*die*/, 1299 Dwarf_Unsigned * /*returned_offset*/, 1300 Dwarf_Error* /*error*/); 1301 1302 int dwarf_srclang(Dwarf_Die /*die*/, 1303 Dwarf_Unsigned * /*returned_lang*/, 1304 Dwarf_Error* /*error*/); 1305 1306 int dwarf_arrayorder(Dwarf_Die /*die*/, 1307 Dwarf_Unsigned * /*returned_order*/, 1308 Dwarf_Error* /*error*/); 1309 1310 /* end of convenience function list */ 1311 1312 /* this is the main interface to attributes of a DIE */ 1313 int dwarf_attrlist(Dwarf_Die /*die*/, 1314 Dwarf_Attribute** /*attrbuf*/, 1315 Dwarf_Signed * /*attrcount*/, 1316 Dwarf_Error* /*error*/); 1317 1318 /* query operations for attributes */ 1319 int dwarf_hasform(Dwarf_Attribute /*attr*/, 1320 Dwarf_Half /*form*/, 1321 Dwarf_Bool * /*returned_bool*/, 1322 Dwarf_Error* /*error*/); 1323 1324 int dwarf_whatform(Dwarf_Attribute /*attr*/, 1325 Dwarf_Half * /*returned_form*/, 1326 Dwarf_Error* /*error*/); 1327 1328 int dwarf_whatform_direct(Dwarf_Attribute /*attr*/, 1329 Dwarf_Half * /*returned_form*/, 1330 Dwarf_Error* /*error*/); 1331 1332 int dwarf_whatattr(Dwarf_Attribute /*attr*/, 1333 Dwarf_Half * /*returned_attr_num*/, 1334 Dwarf_Error* /*error*/); 1335 1336 /* 1337 The following are concerned with the Primary Interface: getting 1338 the actual data values. One function per 'kind' of FORM. 1339 */ 1340 /* dwarf_formref returns, thru return_offset, a CU-relative offset 1341 and does not allow DW_FORM_ref_addr*/ 1342 int dwarf_formref(Dwarf_Attribute /*attr*/, 1343 Dwarf_Off* /*return_offset*/, 1344 Dwarf_Error* /*error*/); 1345 /* dwarf_global_formref returns, thru return_offset, 1346 a debug_info-relative offset and does allow all reference forms*/ 1347 int dwarf_global_formref(Dwarf_Attribute /*attr*/, 1348 Dwarf_Off* /*return_offset*/, 1349 Dwarf_Error* /*error*/); 1350 1351 /* dwarf_formsig8 returns in the caller-provided 8 byte area 1352 the 8 bytes of a DW_FORM_ref_sig8. Not a string. */ 1353 int dwarf_formsig8(Dwarf_Attribute /*attr*/, 1354 Dwarf_Sig8 * /*returned sig bytes*/, 1355 Dwarf_Error* /*error*/); 1356 1357 int dwarf_formaddr(Dwarf_Attribute /*attr*/, 1358 Dwarf_Addr * /*returned_addr*/, 1359 Dwarf_Error* /*error*/); 1360 1361 int dwarf_formflag(Dwarf_Attribute /*attr*/, 1362 Dwarf_Bool * /*returned_bool*/, 1363 Dwarf_Error* /*error*/); 1364 1365 int dwarf_formudata(Dwarf_Attribute /*attr*/, 1366 Dwarf_Unsigned * /*returned_val*/, 1367 Dwarf_Error* /*error*/); 1368 1369 int dwarf_formsdata(Dwarf_Attribute /*attr*/, 1370 Dwarf_Signed * /*returned_val*/, 1371 Dwarf_Error* /*error*/); 1372 1373 int dwarf_formblock(Dwarf_Attribute /*attr*/, 1374 Dwarf_Block ** /*returned_block*/, 1375 Dwarf_Error* /*error*/); 1376 1377 int dwarf_formstring(Dwarf_Attribute /*attr*/, 1378 char ** /*returned_string*/, 1379 Dwarf_Error* /*error*/); 1380 1381 int dwarf_formexprloc(Dwarf_Attribute /*attr*/, 1382 Dwarf_Unsigned * /*return_exprlen*/, 1383 Dwarf_Ptr * /*block_ptr*/, 1384 Dwarf_Error * /*error*/); 1385 1386 1387 /* end attribute query operations. */ 1388 1389 /* line number operations */ 1390 /* dwarf_srclines is the normal interface */ 1391 int dwarf_srclines(Dwarf_Die /*die*/, 1392 Dwarf_Line** /*linebuf*/, 1393 Dwarf_Signed * /*linecount*/, 1394 Dwarf_Error* /*error*/); 1395 1396 /* dwarf_srclines_dealloc, created July 2005, is the new 1397 method for deallocating what dwarf_srclines returns. 1398 More complete free than using dwarf_dealloc directly. */ 1399 void dwarf_srclines_dealloc(Dwarf_Debug /*dbg*/, 1400 Dwarf_Line* /*linebuf*/, 1401 Dwarf_Signed /*count */); 1402 1403 1404 int dwarf_srcfiles(Dwarf_Die /*die*/, 1405 char*** /*srcfiles*/, 1406 Dwarf_Signed * /*filecount*/, 1407 Dwarf_Error* /*error*/); 1408 1409 /* Unimplemented. */ 1410 int dwarf_dieline(Dwarf_Die /*die*/, 1411 Dwarf_Line * /*returned_line*/, 1412 Dwarf_Error * /*error*/); 1413 1414 int dwarf_linebeginstatement(Dwarf_Line /*line*/, 1415 Dwarf_Bool * /*returned_bool*/, 1416 Dwarf_Error* /*error*/); 1417 1418 int dwarf_lineendsequence(Dwarf_Line /*line*/, 1419 Dwarf_Bool * /*returned_bool*/, 1420 Dwarf_Error* /*error*/); 1421 1422 int dwarf_lineno(Dwarf_Line /*line*/, 1423 Dwarf_Unsigned * /*returned_lineno*/, 1424 Dwarf_Error* /*error*/); 1425 1426 int dwarf_line_srcfileno(Dwarf_Line /*line*/, 1427 Dwarf_Unsigned * /*ret_fileno*/, 1428 Dwarf_Error * /*error*/); 1429 1430 int dwarf_lineaddr(Dwarf_Line /*line*/, 1431 Dwarf_Addr * /*returned_addr*/, 1432 Dwarf_Error* /*error*/); 1433 1434 int dwarf_lineoff(Dwarf_Line /*line*/, 1435 Dwarf_Signed * /*returned_lineoffset*/, 1436 Dwarf_Error* /*error*/); 1437 1438 int dwarf_linesrc(Dwarf_Line /*line*/, 1439 char ** /*returned_name*/, 1440 Dwarf_Error* /*error*/); 1441 1442 int dwarf_lineblock(Dwarf_Line /*line*/, 1443 Dwarf_Bool * /*returned_bool*/, 1444 Dwarf_Error* /*error*/); 1445 1446 /* tertiary interface to line info */ 1447 /* Unimplemented */ 1448 int dwarf_pclines(Dwarf_Debug /*dbg*/, 1449 Dwarf_Addr /*pc*/, 1450 Dwarf_Line** /*linebuf*/, 1451 Dwarf_Signed * /*linecount*/, 1452 Dwarf_Signed /*slide*/, 1453 Dwarf_Error* /*error*/); 1454 /* end line number operations */ 1455 1456 /* global name space operations (.debug_pubnames access) */ 1457 int dwarf_get_globals(Dwarf_Debug /*dbg*/, 1458 Dwarf_Global** /*globals*/, 1459 Dwarf_Signed * /*number_of_globals*/, 1460 Dwarf_Error* /*error*/); 1461 void dwarf_globals_dealloc(Dwarf_Debug /*dbg*/, 1462 Dwarf_Global* /*globals*/, 1463 Dwarf_Signed /*number_of_globals*/); 1464 1465 int dwarf_globname(Dwarf_Global /*glob*/, 1466 char ** /*returned_name*/, 1467 Dwarf_Error* /*error*/); 1468 1469 int dwarf_global_die_offset(Dwarf_Global /*global*/, 1470 Dwarf_Off* /*return_offset*/, 1471 Dwarf_Error * /*error*/); 1472 1473 /* This returns the CU die global offset if one knows the 1474 CU header global offset. 1475 See also dwarf_CU_dieoffset_given_die(). */ 1476 int dwarf_get_cu_die_offset_given_cu_header_offset( 1477 Dwarf_Debug /*dbg*/, 1478 Dwarf_Off /*in_cu_header_offset*/, 1479 Dwarf_Off * /*out_cu_die_offset*/, 1480 Dwarf_Error * /*err*/); 1481 #ifdef __sgi /* pragma is sgi MIPS only */ 1482 #pragma optional dwarf_get_cu_die_offset_given_cu_header_offset 1483 #endif 1484 1485 int dwarf_global_cu_offset(Dwarf_Global /*global*/, 1486 Dwarf_Off* /*return_offset*/, 1487 Dwarf_Error* /*error*/); 1488 1489 int dwarf_global_name_offsets(Dwarf_Global /*global*/, 1490 char ** /*returned_name*/, 1491 Dwarf_Off* /*die_offset*/, 1492 Dwarf_Off* /*cu_offset*/, 1493 Dwarf_Error* /*error*/); 1494 1495 /* Static function name operations. */ 1496 int dwarf_get_funcs(Dwarf_Debug /*dbg*/, 1497 Dwarf_Func** /*funcs*/, 1498 Dwarf_Signed * /*number_of_funcs*/, 1499 Dwarf_Error* /*error*/); 1500 void dwarf_funcs_dealloc(Dwarf_Debug /*dbg*/, 1501 Dwarf_Func* /*funcs*/, 1502 Dwarf_Signed /*number_of_funcs*/); 1503 1504 int dwarf_funcname(Dwarf_Func /*func*/, 1505 char ** /*returned_name*/, 1506 Dwarf_Error* /*error*/); 1507 1508 int dwarf_func_die_offset(Dwarf_Func /*func*/, 1509 Dwarf_Off* /*return_offset*/, 1510 Dwarf_Error* /*error*/); 1511 1512 int dwarf_func_cu_offset(Dwarf_Func /*func*/, 1513 Dwarf_Off* /*return_offset*/, 1514 Dwarf_Error* /*error*/); 1515 1516 int dwarf_func_name_offsets(Dwarf_Func /*func*/, 1517 char ** /*returned_name*/, 1518 Dwarf_Off* /*die_offset*/, 1519 Dwarf_Off* /*cu_offset*/, 1520 Dwarf_Error* /*error*/); 1521 1522 /* User-defined type name operations, SGI IRIX .debug_typenames section. 1523 Same content as DWARF3 .debug_pubtypes, but defined years before 1524 .debug_pubtypes was defined. SGI IRIX only. */ 1525 int dwarf_get_types(Dwarf_Debug /*dbg*/, 1526 Dwarf_Type** /*types*/, 1527 Dwarf_Signed * /*number_of_types*/, 1528 Dwarf_Error* /*error*/); 1529 void dwarf_types_dealloc(Dwarf_Debug /*dbg*/, 1530 Dwarf_Type* /*types*/, 1531 Dwarf_Signed /*number_of_types*/); 1532 1533 1534 int dwarf_typename(Dwarf_Type /*type*/, 1535 char ** /*returned_name*/, 1536 Dwarf_Error* /*error*/); 1537 1538 int dwarf_type_die_offset(Dwarf_Type /*type*/, 1539 Dwarf_Off* /*return_offset*/, 1540 Dwarf_Error* /*error*/); 1541 1542 int dwarf_type_cu_offset(Dwarf_Type /*type*/, 1543 Dwarf_Off* /*return_offset*/, 1544 Dwarf_Error* /*error*/); 1545 1546 int dwarf_type_name_offsets(Dwarf_Type /*type*/, 1547 char ** /*returned_name*/, 1548 Dwarf_Off* /*die_offset*/, 1549 Dwarf_Off* /*cu_offset*/, 1550 Dwarf_Error* /*error*/); 1551 1552 /* User-defined type name operations, DWARF3 .debug_pubtypes section. 1553 */ 1554 int dwarf_get_pubtypes(Dwarf_Debug /*dbg*/, 1555 Dwarf_Type** /*types*/, 1556 Dwarf_Signed * /*number_of_types*/, 1557 Dwarf_Error* /*error*/); 1558 void dwarf_pubtypes_dealloc(Dwarf_Debug /*dbg*/, 1559 Dwarf_Type* /*pubtypes*/, 1560 Dwarf_Signed /*number_of_pubtypes*/); 1561 1562 1563 int dwarf_pubtypename(Dwarf_Type /*type*/, 1564 char ** /*returned_name*/, 1565 Dwarf_Error* /*error*/); 1566 1567 int dwarf_pubtype_die_offset(Dwarf_Type /*type*/, 1568 Dwarf_Off* /*return_offset*/, 1569 Dwarf_Error* /*error*/); 1570 1571 int dwarf_pubtype_cu_offset(Dwarf_Type /*type*/, 1572 Dwarf_Off* /*return_offset*/, 1573 Dwarf_Error* /*error*/); 1574 1575 int dwarf_pubtype_name_offsets(Dwarf_Type /*type*/, 1576 char ** /*returned_name*/, 1577 Dwarf_Off* /*die_offset*/, 1578 Dwarf_Off* /*cu_offset*/, 1579 Dwarf_Error* /*error*/); 1580 1581 /* File-scope static variable name operations. */ 1582 int dwarf_get_vars(Dwarf_Debug /*dbg*/, 1583 Dwarf_Var** /*vars*/, 1584 Dwarf_Signed * /*number_of_vars*/, 1585 Dwarf_Error* /*error*/); 1586 void dwarf_vars_dealloc(Dwarf_Debug /*dbg*/, 1587 Dwarf_Var* /*vars*/, 1588 Dwarf_Signed /*number_of_vars*/); 1589 1590 1591 int dwarf_varname(Dwarf_Var /*var*/, 1592 char ** /*returned_name*/, 1593 Dwarf_Error* /*error*/); 1594 1595 int dwarf_var_die_offset(Dwarf_Var /*var*/, 1596 Dwarf_Off* /*return_offset*/, 1597 Dwarf_Error* /*error*/); 1598 1599 int dwarf_var_cu_offset(Dwarf_Var /*var*/, 1600 Dwarf_Off* /*return_offset*/, 1601 Dwarf_Error* /*error*/); 1602 1603 int dwarf_var_name_offsets(Dwarf_Var /*var*/, 1604 char ** /*returned_name*/, 1605 Dwarf_Off* /*die_offset*/, 1606 Dwarf_Off* /*cu_offset*/, 1607 Dwarf_Error* /*error*/); 1608 1609 /* weak name operations. */ 1610 int dwarf_get_weaks(Dwarf_Debug /*dbg*/, 1611 Dwarf_Weak** /*weaks*/, 1612 Dwarf_Signed * /*number_of_weaks*/, 1613 Dwarf_Error* /*error*/); 1614 void dwarf_weaks_dealloc(Dwarf_Debug /*dbg*/, 1615 Dwarf_Weak* /*weaks*/, 1616 Dwarf_Signed /*number_of_weaks*/); 1617 1618 1619 int dwarf_weakname(Dwarf_Weak /*weak*/, 1620 char ** /*returned_name*/, 1621 Dwarf_Error* /*error*/); 1622 1623 int dwarf_weak_die_offset(Dwarf_Weak /*weak*/, 1624 Dwarf_Off* /*return_offset*/, 1625 Dwarf_Error* /*error*/); 1626 1627 int dwarf_weak_cu_offset(Dwarf_Weak /*weak*/, 1628 Dwarf_Off* /*return_offset*/, 1629 Dwarf_Error* /*error*/); 1630 1631 int dwarf_weak_name_offsets(Dwarf_Weak /*weak*/, 1632 char ** /*returned_name*/, 1633 Dwarf_Off* /*die_offset*/, 1634 Dwarf_Off* /*cu_offset*/, 1635 Dwarf_Error* /*error*/); 1636 1637 /* location list section operation. (.debug_loc access) */ 1638 int dwarf_get_loclist_entry(Dwarf_Debug /*dbg*/, 1639 Dwarf_Unsigned /*offset*/, 1640 Dwarf_Addr* /*hipc*/, 1641 Dwarf_Addr* /*lopc*/, 1642 Dwarf_Ptr* /*data*/, 1643 Dwarf_Unsigned* /*entry_len*/, 1644 Dwarf_Unsigned* /*next_entry*/, 1645 Dwarf_Error* /*error*/); 1646 1647 /* abbreviation section operations */ 1648 int dwarf_get_abbrev(Dwarf_Debug /*dbg*/, 1649 Dwarf_Unsigned /*offset*/, 1650 Dwarf_Abbrev * /*returned_abbrev*/, 1651 Dwarf_Unsigned* /*length*/, 1652 Dwarf_Unsigned* /*attr_count*/, 1653 Dwarf_Error* /*error*/); 1654 1655 int dwarf_get_abbrev_tag(Dwarf_Abbrev /*abbrev*/, 1656 Dwarf_Half* /*return_tag_number*/, 1657 Dwarf_Error* /*error*/); 1658 int dwarf_get_abbrev_code(Dwarf_Abbrev /*abbrev*/, 1659 Dwarf_Unsigned* /*return_code_number*/, 1660 Dwarf_Error* /*error*/); 1661 1662 int dwarf_get_abbrev_children_flag(Dwarf_Abbrev /*abbrev*/, 1663 Dwarf_Signed* /*return_flag*/, 1664 Dwarf_Error* /*error*/); 1665 1666 int dwarf_get_abbrev_entry(Dwarf_Abbrev /*abbrev*/, 1667 Dwarf_Signed /*index*/, 1668 Dwarf_Half * /*returned_attr_num*/, 1669 Dwarf_Signed* /*form*/, 1670 Dwarf_Off* /*offset*/, 1671 Dwarf_Error* /*error*/); 1672 1673 /* consumer string section operation */ 1674 int dwarf_get_str(Dwarf_Debug /*dbg*/, 1675 Dwarf_Off /*offset*/, 1676 char** /*string*/, 1677 Dwarf_Signed * /*strlen_of_string*/, 1678 Dwarf_Error* /*error*/); 1679 1680 /* Consumer op on gnu .eh_frame info */ 1681 int dwarf_get_fde_list_eh( 1682 Dwarf_Debug /*dbg*/, 1683 Dwarf_Cie** /*cie_data*/, 1684 Dwarf_Signed* /*cie_element_count*/, 1685 Dwarf_Fde** /*fde_data*/, 1686 Dwarf_Signed* /*fde_element_count*/, 1687 Dwarf_Error* /*error*/); 1688 1689 1690 /* consumer operations on frame info: .debug_frame */ 1691 int dwarf_get_fde_list(Dwarf_Debug /*dbg*/, 1692 Dwarf_Cie** /*cie_data*/, 1693 Dwarf_Signed* /*cie_element_count*/, 1694 Dwarf_Fde** /*fde_data*/, 1695 Dwarf_Signed* /*fde_element_count*/, 1696 Dwarf_Error* /*error*/); 1697 1698 /* Release storage gotten by dwarf_get_fde_list_eh() or 1699 dwarf_get_fde_list() */ 1700 void dwarf_fde_cie_list_dealloc(Dwarf_Debug dbg, 1701 Dwarf_Cie *cie_data, 1702 Dwarf_Signed cie_element_count, 1703 Dwarf_Fde *fde_data, 1704 Dwarf_Signed fde_element_count); 1705 1706 1707 1708 int dwarf_get_fde_range(Dwarf_Fde /*fde*/, 1709 Dwarf_Addr* /*low_pc*/, 1710 Dwarf_Unsigned* /*func_length*/, 1711 Dwarf_Ptr* /*fde_bytes*/, 1712 Dwarf_Unsigned* /*fde_byte_length*/, 1713 Dwarf_Off* /*cie_offset*/, 1714 Dwarf_Signed* /*cie_index*/, 1715 Dwarf_Off* /*fde_offset*/, 1716 Dwarf_Error* /*error*/); 1717 1718 /* Useful for IRIX only: see dwarf_get_cie_augmentation_data() 1719 dwarf_get_fde_augmentation_data() for GNU .eh_frame. */ 1720 int dwarf_get_fde_exception_info(Dwarf_Fde /*fde*/, 1721 Dwarf_Signed* /* offset_into_exception_tables */, 1722 Dwarf_Error* /*error*/); 1723 1724 1725 int dwarf_get_cie_of_fde(Dwarf_Fde /*fde*/, 1726 Dwarf_Cie * /*cie_returned*/, 1727 Dwarf_Error* /*error*/); 1728 1729 int dwarf_get_cie_info(Dwarf_Cie /*cie*/, 1730 Dwarf_Unsigned * /*bytes_in_cie*/, 1731 Dwarf_Small* /*version*/, 1732 char ** /*augmenter*/, 1733 Dwarf_Unsigned* /*code_alignment_factor*/, 1734 Dwarf_Signed* /*data_alignment_factor*/, 1735 Dwarf_Half* /*return_address_register_rule*/, 1736 Dwarf_Ptr* /*initial_instructions*/, 1737 Dwarf_Unsigned* /*initial_instructions_length*/, 1738 Dwarf_Error* /*error*/); 1739 1740 /* dwarf_get_cie_index new September 2009. */ 1741 int dwarf_get_cie_index( 1742 Dwarf_Cie /*cie*/, 1743 Dwarf_Signed* /*index*/, 1744 Dwarf_Error* /*error*/ ); 1745 1746 1747 int dwarf_get_fde_instr_bytes(Dwarf_Fde /*fde*/, 1748 Dwarf_Ptr * /*outinstrs*/, Dwarf_Unsigned * /*outlen*/, 1749 Dwarf_Error * /*error*/); 1750 1751 int dwarf_get_fde_info_for_all_regs(Dwarf_Fde /*fde*/, 1752 Dwarf_Addr /*pc_requested*/, 1753 Dwarf_Regtable* /*reg_table*/, 1754 Dwarf_Addr* /*row_pc*/, 1755 Dwarf_Error* /*error*/); 1756 1757 int dwarf_get_fde_info_for_all_regs3(Dwarf_Fde /*fde*/, 1758 Dwarf_Addr /*pc_requested*/, 1759 Dwarf_Regtable3* /*reg_table*/, 1760 Dwarf_Addr* /*row_pc*/, 1761 Dwarf_Error* /*error*/); 1762 1763 /* In this older interface DW_FRAME_CFA_COL is a meaningful 1764 column (which does not work well with DWARF3 or 1765 non-MIPS architectures). */ 1766 int dwarf_get_fde_info_for_reg(Dwarf_Fde /*fde*/, 1767 Dwarf_Half /*table_column*/, 1768 Dwarf_Addr /*pc_requested*/, 1769 Dwarf_Signed* /*offset_relevant*/, 1770 Dwarf_Signed* /*register*/, 1771 Dwarf_Signed* /*offset*/, 1772 Dwarf_Addr* /*row_pc*/, 1773 Dwarf_Error* /*error*/); 1774 1775 /* See discussion of dw_value_type, libdwarf.h. 1776 Use of DW_FRAME_CFA_COL is not meaningful in this interface. 1777 See dwarf_get_fde_info_for_cfa_reg3(). 1778 */ 1779 /* dwarf_get_fde_info_for_reg3 is useful on a single column, but 1780 it is inefficient to iterate across all table_columns using this 1781 function. Instead call dwarf_get_fde_info_for_all_regs3() and index 1782 into the table it fills in. */ 1783 int dwarf_get_fde_info_for_reg3(Dwarf_Fde /*fde*/, 1784 Dwarf_Half /*table_column*/, 1785 Dwarf_Addr /*pc_requested*/, 1786 Dwarf_Small * /*value_type*/, 1787 Dwarf_Signed * /*offset_relevant*/, 1788 Dwarf_Signed* /*register*/, 1789 Dwarf_Signed* /*offset_or_block_len*/, 1790 Dwarf_Ptr * /*block_ptr */, 1791 Dwarf_Addr* /*row_pc_out*/, 1792 Dwarf_Error* /*error*/); 1793 1794 /* Use this to get the cfa. */ 1795 int dwarf_get_fde_info_for_cfa_reg3(Dwarf_Fde /*fde*/, 1796 Dwarf_Addr /*pc_requested*/, 1797 Dwarf_Small * /*value_type*/, 1798 Dwarf_Signed * /*offset_relevant*/, 1799 Dwarf_Signed* /*register*/, 1800 Dwarf_Signed* /*offset_or_block_len*/, 1801 Dwarf_Ptr * /*block_ptr */, 1802 Dwarf_Addr* /*row_pc_out*/, 1803 Dwarf_Error* /*error*/); 1804 1805 int dwarf_get_fde_for_die(Dwarf_Debug /*dbg*/, 1806 Dwarf_Die /*subr_die */, 1807 Dwarf_Fde * /*returned_fde*/, 1808 Dwarf_Error* /*error*/); 1809 1810 int dwarf_get_fde_n(Dwarf_Fde* /*fde_data*/, 1811 Dwarf_Unsigned /*fde_index*/, 1812 Dwarf_Fde * /*returned_fde*/, 1813 Dwarf_Error* /*error*/); 1814 1815 int dwarf_get_fde_at_pc(Dwarf_Fde* /*fde_data*/, 1816 Dwarf_Addr /*pc_of_interest*/, 1817 Dwarf_Fde * /*returned_fde*/, 1818 Dwarf_Addr* /*lopc*/, 1819 Dwarf_Addr* /*hipc*/, 1820 Dwarf_Error* /*error*/); 1821 1822 /* GNU .eh_frame augmentation information, raw form, see 1823 Linux Standard Base Core Specification version 3.0 . */ 1824 int dwarf_get_cie_augmentation_data(Dwarf_Cie /* cie*/, 1825 Dwarf_Small ** /* augdata */, 1826 Dwarf_Unsigned * /* augdata_len */, 1827 Dwarf_Error* /*error*/); 1828 /* GNU .eh_frame augmentation information, raw form, see 1829 Linux Standard Base Core Specification version 3.0 . */ 1830 int dwarf_get_fde_augmentation_data(Dwarf_Fde /* fde*/, 1831 Dwarf_Small ** /* augdata */, 1832 Dwarf_Unsigned * /* augdata_len */, 1833 Dwarf_Error* /*error*/); 1834 1835 int dwarf_expand_frame_instructions(Dwarf_Cie /*cie*/, 1836 Dwarf_Ptr /*instruction*/, 1837 Dwarf_Unsigned /*i_length*/, 1838 Dwarf_Frame_Op** /*returned_op_list*/, 1839 Dwarf_Signed* /*op_count*/, 1840 Dwarf_Error* /*error*/); 1841 1842 /* Operations on .debug_aranges. */ 1843 int dwarf_get_aranges(Dwarf_Debug /*dbg*/, 1844 Dwarf_Arange** /*aranges*/, 1845 Dwarf_Signed * /*arange_count*/, 1846 Dwarf_Error* /*error*/); 1847 1848 1849 1850 int dwarf_get_arange( 1851 Dwarf_Arange* /*aranges*/, 1852 Dwarf_Unsigned /*arange_count*/, 1853 Dwarf_Addr /*address*/, 1854 Dwarf_Arange * /*returned_arange*/, 1855 Dwarf_Error* /*error*/); 1856 1857 int dwarf_get_cu_die_offset( 1858 Dwarf_Arange /*arange*/, 1859 Dwarf_Off* /*return_offset*/, 1860 Dwarf_Error* /*error*/); 1861 1862 int dwarf_get_arange_cu_header_offset( 1863 Dwarf_Arange /*arange*/, 1864 Dwarf_Off* /*return_cu_header_offset*/, 1865 Dwarf_Error* /*error*/); 1866 #ifdef __sgi /* pragma is sgi MIPS only */ 1867 #pragma optional dwarf_get_arange_cu_header_offset 1868 #endif 1869 1870 /* DWARF2,3 interface. No longer really adequate (it was never 1871 right for segmented address spaces, please switch 1872 to using dwarf_get_arange_info_b instead. 1873 There is no effective difference between these 1874 functions if the address space 1875 of the target is not segmented. */ 1876 int dwarf_get_arange_info( 1877 Dwarf_Arange /*arange*/, 1878 Dwarf_Addr* /*start*/, 1879 Dwarf_Unsigned* /*length*/, 1880 Dwarf_Off* /*cu_die_offset*/, 1881 Dwarf_Error* /*error*/ ); 1882 1883 /* New for DWARF4, entries may have segment information. 1884 *segment is only meaningful if *segment_entry_size is non-zero. */ 1885 int dwarf_get_arange_info_b( 1886 Dwarf_Arange /*arange*/, 1887 Dwarf_Unsigned* /*segment*/, 1888 Dwarf_Unsigned* /*segment_entry_size*/, 1889 Dwarf_Addr * /*start*/, 1890 Dwarf_Unsigned* /*length*/, 1891 Dwarf_Off * /*cu_die_offset*/, 1892 Dwarf_Error * /*error*/ ); 1893 1894 1895 /* consumer .debug_macinfo information interface. 1896 */ 1897 struct Dwarf_Macro_Details_s { 1898 Dwarf_Off dmd_offset; /* offset, in the section, 1899 of this macro info */ 1900 Dwarf_Small dmd_type; /* the type, DW_MACINFO_define etc*/ 1901 Dwarf_Signed dmd_lineno; /* the source line number where 1902 applicable and vend_def # if 1903 vendor_extension op 1904 */ 1905 1906 Dwarf_Signed dmd_fileindex;/* the source file index: 1907 applies to define undef start_file 1908 */ 1909 char * dmd_macro; /* macro name (with value for defineop) 1910 string from vendor ext 1911 */ 1912 }; 1913 1914 /* dwarf_print_lines is for use by dwarfdump: it prints 1915 line info to stdout. 1916 The _dwarf name is obsolete. Use dwarf_ instead. 1917 Added extra argnument 2/2009 for better checking. 1918 */ 1919 int _dwarf_print_lines(Dwarf_Die /*cu_die*/,Dwarf_Error * /*error*/); 1920 int dwarf_print_lines(Dwarf_Die /*cu_die*/,Dwarf_Error * /*error*/, 1921 int * /*error_count_out */); 1922 1923 /* dwarf_check_lineheader lets dwarfdump get detailed messages 1924 about some compiler errors we detect. 1925 We return the count of detected errors throught the 1926 pointer. 1927 */ 1928 void dwarf_check_lineheader(Dwarf_Die /*cu_die*/,int *errcount_out); 1929 1930 /* dwarf_ld_sort_lines helps SGI IRIX ld 1931 rearrange lines in .debug_line in a .o created with a text 1932 section per function. 1933 -OPT:procedure_reorder=ON 1934 where ld-cord (cord(1)ing by ld, 1935 not by cord(1)) may have changed the function order. 1936 The _dwarf name is obsolete. Use dwarf_ instead. 1937 */ 1938 int _dwarf_ld_sort_lines( 1939 void * /*orig_buffer*/, 1940 unsigned long /* buffer_len*/, 1941 int /*is_64_bit*/, 1942 int * /*any_change*/, 1943 int * /*err_code*/); 1944 int dwarf_ld_sort_lines( 1945 void * /*orig_buffer*/, 1946 unsigned long /*buffer_len*/, 1947 int /*is_64_bit*/, 1948 int * /*any_change*/, 1949 int * /*err_code*/); 1950 1951 /* Used by dwarfdump -v to print fde offsets from debugging 1952 info. 1953 The _dwarf name is obsolete. Use dwarf_ instead. 1954 */ 1955 int _dwarf_fde_section_offset(Dwarf_Debug dbg, 1956 Dwarf_Fde /*in_fde*/, 1957 Dwarf_Off * /*fde_off*/, 1958 Dwarf_Off * /*cie_off*/, 1959 Dwarf_Error * /*err*/); 1960 int dwarf_fde_section_offset(Dwarf_Debug dbg, 1961 Dwarf_Fde /*in_fde*/, 1962 Dwarf_Off * /*fde_off*/, 1963 Dwarf_Off * /*cie_off*/, 1964 Dwarf_Error * /*err*/); 1965 1966 /* Used by dwarfdump -v to print cie offsets from debugging 1967 info. 1968 The _dwarf name is obsolete. Use dwarf_ instead. 1969 */ 1970 int dwarf_cie_section_offset(Dwarf_Debug /*dbg*/, 1971 Dwarf_Cie /*in_cie*/, 1972 Dwarf_Off * /*cie_off */, 1973 Dwarf_Error * /*err*/); 1974 int _dwarf_cie_section_offset(Dwarf_Debug /*dbg*/, 1975 Dwarf_Cie /*in_cie*/, 1976 Dwarf_Off * /*cie_off*/, 1977 Dwarf_Error * /*err*/); 1978 1979 typedef struct Dwarf_Macro_Details_s Dwarf_Macro_Details; 1980 1981 int dwarf_get_macro(Dwarf_Debug /*dbg*/, 1982 char * /*requested_macro_name*/, 1983 Dwarf_Addr /*pc_of_request*/, 1984 char ** /*returned_macro_value*/, 1985 Dwarf_Error * /*error*/); 1986 1987 int dwarf_get_all_defined_macros(Dwarf_Debug /*dbg*/, 1988 Dwarf_Addr /*pc_of_request*/, 1989 Dwarf_Signed * /*returned_count*/, 1990 char *** /*returned_pointers_to_macros*/, 1991 Dwarf_Error * /*error*/); 1992 1993 char *dwarf_find_macro_value_start(char * /*macro_string*/); 1994 1995 int dwarf_get_macro_details(Dwarf_Debug /*dbg*/, 1996 Dwarf_Off /*macro_offset*/, 1997 Dwarf_Unsigned /*maximum_count*/, 1998 Dwarf_Signed * /*entry_count*/, 1999 Dwarf_Macro_Details ** /*details*/, 2000 Dwarf_Error * /*err*/); 2001 2002 2003 int dwarf_get_address_size(Dwarf_Debug /*dbg*/, 2004 Dwarf_Half * /*addr_size*/, 2005 Dwarf_Error * /*error*/); 2006 int dwarf_get_die_address_size(Dwarf_Die /*die*/, 2007 Dwarf_Half * /*addr_size*/, 2008 Dwarf_Error * /*error*/); 2009 2010 /* The dwarf specification separates FORMs into 2011 different classes. To do the seperation properly 2012 requires 4 pieces of data as of DWARF4 (thus the 2013 function arguments listed here). 2014 The DWARF4 specification class definition suffices to 2015 describe all DWARF versions. 2016 See section 7.5.4, Attribute Encodings. 2017 A return of DW_FORM_CLASS_UNKNOWN means we could not properly figure 2018 out what form-class it is. 2019 2020 DW_FORM_CLASS_FRAMEPTR is MIPS/IRIX only, and refers 2021 to the DW_AT_MIPS_fde attribute (a reference to the 2022 .debug_frame section). 2023 */ 2024 enum Dwarf_Form_Class { 2025 DW_FORM_CLASS_UNKNOWN, DW_FORM_CLASS_ADDRESS, 2026 DW_FORM_CLASS_BLOCK, DW_FORM_CLASS_CONSTANT, 2027 DW_FORM_CLASS_EXPRLOC, DW_FORM_CLASS_FLAG, 2028 DW_FORM_CLASS_LINEPTR, DW_FORM_CLASS_LOCLISTPTR, 2029 DW_FORM_CLASS_MACPTR, DW_FORM_CLASS_RANGELISTPTR, 2030 DW_FORM_CLASS_REFERENCE, DW_FORM_CLASS_STRING, 2031 DW_FORM_CLASS_FRAMEPTR 2032 }; 2033 2034 enum Dwarf_Form_Class dwarf_get_form_class( 2035 Dwarf_Half /* dwversion */, 2036 Dwarf_Half /* attrnum */, 2037 Dwarf_Half /*offset_size */, 2038 Dwarf_Half /*form*/); 2039 2040 /* utility operations */ 2041 Dwarf_Unsigned dwarf_errno(Dwarf_Error /*error*/); 2042 2043 char* dwarf_errmsg(Dwarf_Error /*error*/); 2044 2045 /* stringcheck zero is default and means do all 2046 ** string length validity checks. 2047 ** Call with parameter value 1 to turn off many such checks (and 2048 ** increase performance). 2049 ** Call with zero for safest running. 2050 ** Actual value saved and returned is only 8 bits! Upper bits 2051 ** ignored by libdwarf (and zero on return). 2052 ** Returns previous value. 2053 */ 2054 int dwarf_set_stringcheck(int /*stringcheck*/); 2055 2056 /* 'apply' defaults to 1 and means do all 2057 * 'rela' relocations on reading in a dwarf object section with 2058 * such relocations. 2059 * Call with parameter value 0 to turn off application of 2060 * such relocations. 2061 * Since the static linker leaves 'bogus' data in object sections 2062 * with a 'rela' relocation section such data cannot be read 2063 * sensibly without processing the relocations. Such relocations 2064 * do not exist in executables and shared objects (.so), the 2065 * relocations only exist in plain .o relocatable object files. 2066 * Actual value saved and returned is only 8 bits! Upper bits 2067 * ignored by libdwarf (and zero on return). 2068 * Returns previous value. 2069 * */ 2070 int dwarf_set_reloc_application(int /*apply*/); 2071 2072 2073 /* Unimplemented */ 2074 Dwarf_Handler dwarf_seterrhand(Dwarf_Debug /*dbg*/, Dwarf_Handler /*errhand*/); 2075 2076 /* Unimplemented */ 2077 Dwarf_Ptr dwarf_seterrarg(Dwarf_Debug /*dbg*/, Dwarf_Ptr /*errarg*/); 2078 2079 void dwarf_dealloc(Dwarf_Debug /*dbg*/, void* /*space*/, 2080 Dwarf_Unsigned /*type*/); 2081 2082 /* DWARF Producer Interface */ 2083 2084 typedef int (*Dwarf_Callback_Func)( 2085 char* /*name*/, 2086 int /*size*/, 2087 Dwarf_Unsigned /*type*/, 2088 Dwarf_Unsigned /*flags*/, 2089 Dwarf_Unsigned /*link*/, 2090 Dwarf_Unsigned /*info*/, 2091 int* /*sect name index*/, 2092 int* /*error*/); 2093 2094 Dwarf_P_Debug dwarf_producer_init( 2095 Dwarf_Unsigned /*creation_flags*/, 2096 Dwarf_Callback_Func /*func*/, 2097 Dwarf_Handler /*errhand*/, 2098 Dwarf_Ptr /*errarg*/, 2099 Dwarf_Error* /*error*/); 2100 2101 typedef int (*Dwarf_Callback_Func_b)( 2102 char* /*name*/, 2103 int /*size*/, 2104 Dwarf_Unsigned /*type*/, 2105 Dwarf_Unsigned /*flags*/, 2106 Dwarf_Unsigned /*link*/, 2107 Dwarf_Unsigned /*info*/, 2108 Dwarf_Unsigned* /*sect_name_index*/, 2109 int* /*error*/); 2110 2111 2112 Dwarf_P_Debug dwarf_producer_init_b( 2113 Dwarf_Unsigned /*flags*/, 2114 Dwarf_Callback_Func_b /*func*/, 2115 Dwarf_Handler /*errhand*/, 2116 Dwarf_Ptr /*errarg*/, 2117 Dwarf_Error * /*error*/); 2118 2119 2120 Dwarf_Signed dwarf_transform_to_disk_form(Dwarf_P_Debug /*dbg*/, 2121 Dwarf_Error* /*error*/); 2122 2123 Dwarf_Ptr dwarf_get_section_bytes(Dwarf_P_Debug /*dbg*/, 2124 Dwarf_Signed /*dwarf_section*/, 2125 Dwarf_Signed* /*elf_section_index*/, 2126 Dwarf_Unsigned* /*length*/, 2127 Dwarf_Error* /*error*/); 2128 2129 int dwarf_get_relocation_info_count( 2130 Dwarf_P_Debug /*dbg*/, 2131 Dwarf_Unsigned * /*count_of_relocation_sections*/, 2132 int * /*drd_buffer_version*/, 2133 Dwarf_Error* /*error*/); 2134 2135 int dwarf_get_relocation_info( 2136 Dwarf_P_Debug /*dbg*/, 2137 Dwarf_Signed * /*elf_section_index*/, 2138 Dwarf_Signed * /*elf_section_index_link*/, 2139 Dwarf_Unsigned * /*relocation_buffer_count*/, 2140 Dwarf_Relocation_Data * /*reldata_buffer*/, 2141 Dwarf_Error* /*error*/); 2142 2143 /* v1: no drd_length field, enum explicit */ 2144 /* v2: has the drd_length field, enum value in uchar member */ 2145 #define DWARF_DRD_BUFFER_VERSION 2 2146 2147 /* Markers are not written to DWARF2/3/4, they are user 2148 defined and may be used for any purpose. 2149 */ 2150 Dwarf_Signed dwarf_get_die_markers( 2151 Dwarf_P_Debug /*dbg*/, 2152 Dwarf_P_Marker * /*marker_list*/, 2153 Dwarf_Unsigned * /*marker_count*/, 2154 Dwarf_Error * /*error*/); 2155 2156 int dwarf_get_string_attributes_count(Dwarf_P_Debug, 2157 Dwarf_Unsigned *, 2158 int *, 2159 Dwarf_Error *); 2160 2161 int dwarf_get_string_attributes_info(Dwarf_P_Debug, 2162 Dwarf_Signed *, 2163 Dwarf_Unsigned *, 2164 Dwarf_P_String_Attr *, 2165 Dwarf_Error *); 2166 2167 void dwarf_reset_section_bytes(Dwarf_P_Debug /*dbg*/); 2168 2169 Dwarf_Unsigned dwarf_producer_finish(Dwarf_P_Debug /*dbg*/, 2170 Dwarf_Error* /*error*/); 2171 2172 /* Producer attribute addition functions. */ 2173 Dwarf_P_Attribute dwarf_add_AT_targ_address(Dwarf_P_Debug /*dbg*/, 2174 Dwarf_P_Die /*ownerdie*/, 2175 Dwarf_Half /*attr*/, 2176 Dwarf_Unsigned /*pc_value*/, 2177 Dwarf_Signed /*sym_index*/, 2178 Dwarf_Error* /*error*/); 2179 2180 Dwarf_P_Attribute dwarf_add_AT_block(Dwarf_P_Debug /*dbg*/, 2181 Dwarf_P_Die /*ownerdie*/, 2182 Dwarf_Half /*attr*/, 2183 Dwarf_Small* /*block_data*/, 2184 Dwarf_Unsigned /*block_len*/, 2185 Dwarf_Error* /*error*/); 2186 2187 Dwarf_P_Attribute dwarf_add_AT_targ_address_b(Dwarf_P_Debug /*dbg*/, 2188 Dwarf_P_Die /*ownerdie*/, 2189 Dwarf_Half /*attr*/, 2190 Dwarf_Unsigned /*pc_value*/, 2191 Dwarf_Unsigned /*sym_index*/, 2192 Dwarf_Error* /*error*/); 2193 2194 Dwarf_P_Attribute dwarf_add_AT_ref_address(Dwarf_P_Debug /*dbg*/, 2195 Dwarf_P_Die /*ownerdie*/, 2196 Dwarf_Half /*attr*/, 2197 Dwarf_Unsigned /*pc_value*/, 2198 Dwarf_Unsigned /*sym_index*/, 2199 Dwarf_Error* /*error*/); 2200 2201 Dwarf_P_Attribute dwarf_add_AT_unsigned_const(Dwarf_P_Debug /*dbg*/, 2202 Dwarf_P_Die /*ownerdie*/, 2203 Dwarf_Half /*attr*/, 2204 Dwarf_Unsigned /*value*/, 2205 Dwarf_Error* /*error*/); 2206 2207 Dwarf_P_Attribute dwarf_add_AT_signed_const(Dwarf_P_Debug /*dbg*/, 2208 Dwarf_P_Die /*ownerdie*/, 2209 Dwarf_Half /*attr*/, 2210 Dwarf_Signed /*value*/, 2211 Dwarf_Error* /*error*/); 2212 2213 Dwarf_P_Attribute dwarf_add_AT_reference(Dwarf_P_Debug /*dbg*/, 2214 Dwarf_P_Die /*ownerdie*/, 2215 Dwarf_Half /*attr*/, 2216 Dwarf_P_Die /*otherdie*/, 2217 Dwarf_Error* /*error*/); 2218 2219 Dwarf_P_Attribute dwarf_add_AT_dataref( 2220 Dwarf_P_Debug /* dbg*/, 2221 Dwarf_P_Die /*ownerdie*/, 2222 Dwarf_Half /*attr*/, 2223 Dwarf_Unsigned /*pcvalue*/, 2224 Dwarf_Unsigned /*sym_index*/, 2225 Dwarf_Error* /*error*/); 2226 2227 Dwarf_P_Attribute dwarf_add_AT_const_value_string(Dwarf_P_Die /*ownerdie*/, 2228 char* /*string_value*/, 2229 Dwarf_Error* /*error*/); 2230 2231 Dwarf_P_Attribute dwarf_add_AT_location_expr(Dwarf_P_Debug /*dbg*/, 2232 Dwarf_P_Die /*ownerdie*/, 2233 Dwarf_Half /*attr*/, 2234 Dwarf_P_Expr /*loc_expr*/, 2235 Dwarf_Error* /*error*/); 2236 2237 Dwarf_P_Attribute dwarf_add_AT_string(Dwarf_P_Debug /*dbg*/, 2238 Dwarf_P_Die /*ownerdie*/, 2239 Dwarf_Half /*attr*/, 2240 char* /*string*/, 2241 Dwarf_Error* /*error*/); 2242 2243 Dwarf_P_Attribute dwarf_add_AT_flag(Dwarf_P_Debug /*dbg*/, 2244 Dwarf_P_Die /*ownerdie*/, 2245 Dwarf_Half /*attr*/, 2246 Dwarf_Small /*flag*/, 2247 Dwarf_Error* /*error*/); 2248 2249 Dwarf_P_Attribute dwarf_add_AT_producer(Dwarf_P_Die /*ownerdie*/, 2250 char* /*producer_string*/, 2251 Dwarf_Error* /*error*/); 2252 2253 Dwarf_P_Attribute dwarf_add_AT_const_value_signedint(Dwarf_P_Die /*ownerdie*/, 2254 Dwarf_Signed /*signed_value*/, 2255 Dwarf_Error* /*error*/); 2256 2257 Dwarf_P_Attribute dwarf_add_AT_const_value_unsignedint( 2258 Dwarf_P_Die /*ownerdie*/, 2259 Dwarf_Unsigned /*unsigned_value*/, 2260 Dwarf_Error* /*error*/); 2261 2262 Dwarf_P_Attribute dwarf_add_AT_comp_dir(Dwarf_P_Die /*ownerdie*/, 2263 char* /*current_working_directory*/, 2264 Dwarf_Error* /*error*/); 2265 2266 Dwarf_P_Attribute dwarf_add_AT_name(Dwarf_P_Die /*die*/, 2267 char* /*name*/, 2268 Dwarf_Error* /*error*/); 2269 2270 /* Producer line creation functions (.debug_line) */ 2271 Dwarf_Unsigned dwarf_add_directory_decl(Dwarf_P_Debug /*dbg*/, 2272 char* /*name*/, 2273 Dwarf_Error* /*error*/); 2274 2275 Dwarf_Unsigned dwarf_add_file_decl(Dwarf_P_Debug /*dbg*/, 2276 char* /*name*/, 2277 Dwarf_Unsigned /*dir_index*/, 2278 Dwarf_Unsigned /*time_last_modified*/, 2279 Dwarf_Unsigned /*length*/, 2280 Dwarf_Error* /*error*/); 2281 2282 Dwarf_Unsigned dwarf_add_line_entry(Dwarf_P_Debug /*dbg*/, 2283 Dwarf_Unsigned /*file_index*/, 2284 Dwarf_Addr /*code_address*/, 2285 Dwarf_Unsigned /*lineno*/, 2286 Dwarf_Signed /*column_number*/, 2287 Dwarf_Bool /*is_source_stmt_begin*/, 2288 Dwarf_Bool /*is_basic_block_begin*/, 2289 Dwarf_Error* /*error*/); 2290 2291 Dwarf_Unsigned dwarf_lne_set_address(Dwarf_P_Debug /*dbg*/, 2292 Dwarf_Unsigned /*offset*/, 2293 Dwarf_Unsigned /*symbol_index*/, 2294 Dwarf_Error* /*error*/); 2295 2296 Dwarf_Unsigned dwarf_lne_end_sequence(Dwarf_P_Debug /*dbg*/, 2297 Dwarf_Addr /*end_address*/, 2298 Dwarf_Error* /*error*/); 2299 2300 /* Producer .debug_frame functions */ 2301 Dwarf_Unsigned dwarf_add_frame_cie(Dwarf_P_Debug /*dbg*/, 2302 char* /*augmenter*/, 2303 Dwarf_Small /*code_alignent_factor*/, 2304 Dwarf_Small /*data_alignment_factor*/, 2305 Dwarf_Small /*return_address_reg*/, 2306 Dwarf_Ptr /*initialization_bytes*/, 2307 Dwarf_Unsigned /*init_byte_len*/, 2308 Dwarf_Error* /*error*/); 2309 2310 Dwarf_Unsigned dwarf_add_frame_fde( 2311 Dwarf_P_Debug /*dbg*/, 2312 Dwarf_P_Fde /*fde*/, 2313 Dwarf_P_Die /*corresponding subprogram die*/, 2314 Dwarf_Unsigned /*cie_to_use*/, 2315 Dwarf_Unsigned /*virt_addr_of_described_code*/, 2316 Dwarf_Unsigned /*length_of_code*/, 2317 Dwarf_Unsigned /*symbol_index*/, 2318 Dwarf_Error* /*error*/); 2319 2320 Dwarf_Unsigned dwarf_add_frame_fde_b( 2321 Dwarf_P_Debug /*dbg*/, 2322 Dwarf_P_Fde /*fde*/, 2323 Dwarf_P_Die /*die*/, 2324 Dwarf_Unsigned /*cie*/, 2325 Dwarf_Addr /*virt_addr*/, 2326 Dwarf_Unsigned /*code_len*/, 2327 Dwarf_Unsigned /*sym_idx*/, 2328 Dwarf_Unsigned /*sym_idx_of_end*/, 2329 Dwarf_Addr /*offset_from_end_sym*/, 2330 Dwarf_Error* /*error*/); 2331 2332 Dwarf_Unsigned dwarf_add_frame_info_b( 2333 Dwarf_P_Debug dbg /*dbg*/, 2334 Dwarf_P_Fde /*fde*/, 2335 Dwarf_P_Die /*die*/, 2336 Dwarf_Unsigned /*cie*/, 2337 Dwarf_Addr /*virt_addr*/, 2338 Dwarf_Unsigned /*code_len*/, 2339 Dwarf_Unsigned /*symidx*/, 2340 Dwarf_Unsigned /*end_symbol */, 2341 Dwarf_Addr /*offset_from_end_symbol */, 2342 Dwarf_Signed /*offset_into_exception_tables*/, 2343 Dwarf_Unsigned /*exception_table_symbol*/, 2344 Dwarf_Error* /*error*/); 2345 2346 Dwarf_Unsigned dwarf_add_frame_info( 2347 Dwarf_P_Debug dbg /*dbg*/, 2348 Dwarf_P_Fde /*fde*/, 2349 Dwarf_P_Die /*die*/, 2350 Dwarf_Unsigned /*cie*/, 2351 Dwarf_Addr /*virt_addr*/, 2352 Dwarf_Unsigned /*code_len*/, 2353 Dwarf_Unsigned /*symidx*/, 2354 Dwarf_Signed /*offset_into_exception_tables*/, 2355 Dwarf_Unsigned /*exception_table_symbol*/, 2356 Dwarf_Error* /*error*/); 2357 2358 Dwarf_P_Fde dwarf_add_fde_inst( 2359 Dwarf_P_Fde /*fde*/, 2360 Dwarf_Small /*op*/, 2361 Dwarf_Unsigned /*val1*/, 2362 Dwarf_Unsigned /*val2*/, 2363 Dwarf_Error* /*error*/); 2364 2365 /* New September 17, 2009 */ 2366 int dwarf_insert_fde_inst_bytes( 2367 Dwarf_P_Debug /*dbg*/, 2368 Dwarf_P_Fde /*fde*/, 2369 Dwarf_Unsigned /*len*/, 2370 Dwarf_Ptr /*ibytes*/, 2371 Dwarf_Error* /*error*/); 2372 2373 2374 Dwarf_P_Fde dwarf_new_fde(Dwarf_P_Debug /*dbg*/, Dwarf_Error* /*error*/); 2375 2376 Dwarf_P_Fde dwarf_fde_cfa_offset( 2377 Dwarf_P_Fde /*fde*/, 2378 Dwarf_Unsigned /*register_number*/, 2379 Dwarf_Signed /*offset*/, 2380 Dwarf_Error* /*error*/); 2381 2382 /* die creation & addition routines */ 2383 Dwarf_P_Die dwarf_new_die( 2384 Dwarf_P_Debug /*dbg*/, 2385 Dwarf_Tag /*tag*/, 2386 Dwarf_P_Die /*parent*/, 2387 Dwarf_P_Die /*child*/, 2388 Dwarf_P_Die /*left */, 2389 Dwarf_P_Die /*right*/, 2390 Dwarf_Error* /*error*/); 2391 2392 Dwarf_Unsigned dwarf_add_die_to_debug( 2393 Dwarf_P_Debug /*dbg*/, 2394 Dwarf_P_Die /*die*/, 2395 Dwarf_Error* /*error*/); 2396 2397 /* Markers are not written to DWARF2/3/4, they are user 2398 defined and may be used for any purpose. 2399 */ 2400 Dwarf_Unsigned dwarf_add_die_marker( 2401 Dwarf_P_Debug /*dbg*/, 2402 Dwarf_P_Die /*die*/, 2403 Dwarf_Unsigned /*marker*/, 2404 Dwarf_Error * /*error*/); 2405 2406 Dwarf_Unsigned dwarf_get_die_marker( 2407 Dwarf_P_Debug /*dbg*/, 2408 Dwarf_P_Die /*die*/, 2409 Dwarf_Unsigned * /*marker*/, 2410 Dwarf_Error * /*error*/); 2411 2412 Dwarf_P_Die dwarf_die_link( 2413 Dwarf_P_Die /*die*/, 2414 Dwarf_P_Die /*parent*/, 2415 Dwarf_P_Die /*child*/, 2416 Dwarf_P_Die /*left*/, 2417 Dwarf_P_Die /*right*/, 2418 Dwarf_Error* /*error*/); 2419 2420 void dwarf_dealloc_compressed_block( 2421 Dwarf_P_Debug, 2422 void * 2423 ); 2424 2425 /* Call this passing in return value from dwarf_uncompress_integer_block() 2426 * to free the space the decompression allocated. */ 2427 void dwarf_dealloc_uncompressed_block( 2428 Dwarf_Debug, 2429 void * 2430 ); 2431 2432 void * dwarf_compress_integer_block( 2433 Dwarf_P_Debug, /* dbg */ 2434 Dwarf_Bool, /* signed==true (or unsigned) */ 2435 Dwarf_Small, /* size of integer units: 8, 16, 32, 64 */ 2436 void*, /* data */ 2437 Dwarf_Unsigned, /* number of elements */ 2438 Dwarf_Unsigned*, /* number of bytes in output block */ 2439 Dwarf_Error* /* error */ 2440 ); 2441 2442 /* Decode an array of signed leb integers (so of course the 2443 * array is not composed of fixed length values, but is instead 2444 * a sequence of sleb values). 2445 * Returns a DW_DLV_BADADDR on error. 2446 * Otherwise returns a pointer to an array of 32bit integers. 2447 * The signed argument must be non-zero (the decode 2448 * assumes sleb integers in the input data) at this time. 2449 * Size of integer units must be 32 (32 bits each) at this time. 2450 * Number of bytes in block is a byte count (not array count). 2451 * Returns number of units in output block (ie, number of elements 2452 * of the array that the return value points to) thru the argument. 2453 */ 2454 void * dwarf_uncompress_integer_block( 2455 Dwarf_Debug, /* dbg */ 2456 Dwarf_Bool, /* signed==true (or unsigned) */ 2457 Dwarf_Small, /* size of integer units: 8, 16, 32, 64 */ 2458 void*, /* input data */ 2459 Dwarf_Unsigned, /* number of bytes in input */ 2460 Dwarf_Unsigned*, /* number of units in output block */ 2461 Dwarf_Error* /* error */ 2462 ); 2463 2464 /* Operations to create location expressions. */ 2465 Dwarf_P_Expr dwarf_new_expr(Dwarf_P_Debug /*dbg*/, Dwarf_Error* /*error*/); 2466 2467 void dwarf_expr_reset( 2468 Dwarf_P_Expr /*expr*/, 2469 Dwarf_Error* /*error*/); 2470 2471 Dwarf_Unsigned dwarf_add_expr_gen( 2472 Dwarf_P_Expr /*expr*/, 2473 Dwarf_Small /*opcode*/, 2474 Dwarf_Unsigned /*val1*/, 2475 Dwarf_Unsigned /*val2*/, 2476 Dwarf_Error* /*error*/); 2477 2478 Dwarf_Unsigned dwarf_add_expr_addr( 2479 Dwarf_P_Expr /*expr*/, 2480 Dwarf_Unsigned /*addr*/, 2481 Dwarf_Signed /*sym_index*/, 2482 Dwarf_Error* /*error*/); 2483 2484 Dwarf_Unsigned dwarf_add_expr_addr_b( 2485 Dwarf_P_Expr /*expr*/, 2486 Dwarf_Unsigned /*addr*/, 2487 Dwarf_Unsigned /*sym_index*/, 2488 Dwarf_Error* /*error*/); 2489 2490 Dwarf_Unsigned dwarf_expr_current_offset( 2491 Dwarf_P_Expr /*expr*/, 2492 Dwarf_Error* /*error*/); 2493 2494 Dwarf_Addr dwarf_expr_into_block( 2495 Dwarf_P_Expr /*expr*/, 2496 Dwarf_Unsigned* /*length*/, 2497 Dwarf_Error* /*error*/); 2498 2499 Dwarf_Unsigned dwarf_add_arange(Dwarf_P_Debug /*dbg*/, 2500 Dwarf_Addr /*begin_address*/, 2501 Dwarf_Unsigned /*length*/, 2502 Dwarf_Signed /*symbol_index*/, 2503 Dwarf_Error* /*error*/); 2504 2505 Dwarf_Unsigned dwarf_add_arange_b( 2506 Dwarf_P_Debug /*dbg*/, 2507 Dwarf_Addr /*begin_address*/, 2508 Dwarf_Unsigned /*length*/, 2509 Dwarf_Unsigned /*symbol_index*/, 2510 Dwarf_Unsigned /*end_symbol_index*/, 2511 Dwarf_Addr /*offset_from_end_symbol*/, 2512 Dwarf_Error * /*error*/); 2513 2514 Dwarf_Unsigned dwarf_add_pubname( 2515 Dwarf_P_Debug /*dbg*/, 2516 Dwarf_P_Die /*die*/, 2517 char* /*pubname_name*/, 2518 Dwarf_Error* /*error*/); 2519 2520 Dwarf_Unsigned dwarf_add_funcname( 2521 Dwarf_P_Debug /*dbg*/, 2522 Dwarf_P_Die /*die*/, 2523 char* /*func_name*/, 2524 Dwarf_Error* /*error*/); 2525 2526 Dwarf_Unsigned dwarf_add_typename( 2527 Dwarf_P_Debug /*dbg*/, 2528 Dwarf_P_Die /*die*/, 2529 char* /*type_name*/, 2530 Dwarf_Error* /*error*/); 2531 2532 Dwarf_Unsigned dwarf_add_varname( 2533 Dwarf_P_Debug /*dbg*/, 2534 Dwarf_P_Die /*die*/, 2535 char* /*var_name*/, 2536 Dwarf_Error* /*error*/); 2537 2538 Dwarf_Unsigned dwarf_add_weakname( 2539 Dwarf_P_Debug /*dbg*/, 2540 Dwarf_P_Die /*die*/, 2541 char* /*weak_name*/, 2542 Dwarf_Error* /*error*/); 2543 2544 /* .debug_macinfo producer functions 2545 Functions must be called in right order: the section is output 2546 In the order these are presented. 2547 */ 2548 int dwarf_def_macro(Dwarf_P_Debug /*dbg*/, 2549 Dwarf_Unsigned /*line*/, 2550 char * /*macname, with (arglist), no space before (*/, 2551 char * /*macvalue*/, 2552 Dwarf_Error* /*error*/); 2553 2554 int dwarf_undef_macro(Dwarf_P_Debug /*dbg*/, 2555 Dwarf_Unsigned /*line*/, 2556 char * /*macname, no arglist, of course*/, 2557 Dwarf_Error* /*error*/); 2558 2559 int dwarf_start_macro_file(Dwarf_P_Debug /*dbg*/, 2560 Dwarf_Unsigned /*fileindex*/, 2561 Dwarf_Unsigned /*linenumber*/, 2562 Dwarf_Error* /*error*/); 2563 2564 int dwarf_end_macro_file(Dwarf_P_Debug /*dbg*/, 2565 Dwarf_Error* /*error*/); 2566 2567 int dwarf_vendor_ext(Dwarf_P_Debug /*dbg*/, 2568 Dwarf_Unsigned /*constant*/, 2569 char * /*string*/, 2570 Dwarf_Error* /*error*/); 2571 2572 /* end macinfo producer functions */ 2573 2574 int dwarf_attr_offset(Dwarf_Die /*die*/, 2575 Dwarf_Attribute /*attr of above die*/, 2576 Dwarf_Off * /*returns offset thru this ptr */, 2577 Dwarf_Error * /*error*/); 2578 2579 /* This is a hack so clients can verify offsets. 2580 Added April 2005 so that debugger can detect broken offsets 2581 (which happened in an IRIX executable larger than 2GB 2582 with MIPSpro 7.3.1.3 toolchain.). 2583 */ 2584 int 2585 dwarf_get_section_max_offsets(Dwarf_Debug /*dbg*/, 2586 Dwarf_Unsigned * /*debug_info_size*/, 2587 Dwarf_Unsigned * /*debug_abbrev_size*/, 2588 Dwarf_Unsigned * /*debug_line_size*/, 2589 Dwarf_Unsigned * /*debug_loc_size*/, 2590 Dwarf_Unsigned * /*debug_aranges_size*/, 2591 Dwarf_Unsigned * /*debug_macinfo_size*/, 2592 Dwarf_Unsigned * /*debug_pubnames_size*/, 2593 Dwarf_Unsigned * /*debug_str_size*/, 2594 Dwarf_Unsigned * /*debug_frame_size*/, 2595 Dwarf_Unsigned * /*debug_ranges_size*/, 2596 Dwarf_Unsigned * /*debug_pubtypes_size*/); 2597 2598 /* Multiple releases spelled 'initial' as 'inital' . 2599 The 'inital' spelling should not be used. */ 2600 Dwarf_Half dwarf_set_frame_rule_inital_value(Dwarf_Debug /*dbg*/, 2601 Dwarf_Half /*value*/); 2602 /* Additional interface with correct 'initial' spelling. */ 2603 /* It is likely you will want to call the following 5 functions 2604 before accessing any frame information. All are useful 2605 to tailor handling of pseudo-registers needed to turn 2606 frame operation references into simpler forms and to 2607 reflect ABI specific data. Of course altering libdwarf.h 2608 and dwarf.h allow the same capabilities, but such header changes 2609 do not let one change these values at runtime. */ 2610 Dwarf_Half dwarf_set_frame_rule_initial_value(Dwarf_Debug /*dbg*/, 2611 Dwarf_Half /*value*/); 2612 Dwarf_Half dwarf_set_frame_rule_table_size(Dwarf_Debug /*dbg*/, 2613 Dwarf_Half /*value*/); 2614 Dwarf_Half dwarf_set_frame_cfa_value(Dwarf_Debug /*dbg*/, 2615 Dwarf_Half /*value*/); 2616 Dwarf_Half dwarf_set_frame_same_value(Dwarf_Debug /*dbg*/, 2617 Dwarf_Half /*value*/); 2618 Dwarf_Half dwarf_set_frame_undefined_value(Dwarf_Debug /*dbg*/, 2619 Dwarf_Half /*value*/); 2620 2621 /* As of April 27, 2009, this version with no diepointer is 2622 obsolete though supported. Use dwarf_get_ranges_a() instead. */ 2623 int dwarf_get_ranges(Dwarf_Debug /*dbg*/, 2624 Dwarf_Off /*rangesoffset*/, 2625 Dwarf_Ranges ** /*rangesbuf*/, 2626 Dwarf_Signed * /*listlen*/, 2627 Dwarf_Unsigned * /*bytecount*/, 2628 Dwarf_Error * /*error*/); 2629 2630 /* This adds the address_size argument. New April 27, 2009 */ 2631 int dwarf_get_ranges_a(Dwarf_Debug /*dbg*/, 2632 Dwarf_Off /*rangesoffset*/, 2633 Dwarf_Die /* diepointer */, 2634 Dwarf_Ranges ** /*rangesbuf*/, 2635 Dwarf_Signed * /*listlen*/, 2636 Dwarf_Unsigned * /*bytecount*/, 2637 Dwarf_Error * /*error*/); 2638 2639 void dwarf_ranges_dealloc(Dwarf_Debug /*dbg*/, 2640 Dwarf_Ranges * /*rangesbuf*/, 2641 Dwarf_Signed /*rangecount*/); 2642 2643 /* The harmless error list is a circular buffer of 2644 errors we note but which do not stop us from processing 2645 the object. Created so dwarfdump or other tools 2646 can report such inconsequential errors without causing 2647 anything to stop early. */ 2648 #define DW_HARMLESS_ERROR_CIRCULAR_LIST_DEFAULT_SIZE 4 2649 #define DW_HARMLESS_ERROR_MSG_STRING_SIZE 200 2650 /* User code supplies size of array of pointers errmsg_ptrs_array 2651 in count and the array of pointers (the pointers themselves 2652 need not be initialized). 2653 The pointers returned in the array of pointers 2654 are invalidated by ANY call to libdwarf. 2655 Use them before making another libdwarf call! 2656 The array of string pointers passed in always has 2657 a final null pointer, so if there are N pointers the 2658 and M actual strings, then MIN(M,N-1) pointers are 2659 set to point to error strings. The array of pointers 2660 to strings always terminates with a NULL pointer. 2661 If 'count' is passed in zero then errmsg_ptrs_array 2662 is not touched. 2663 2664 The function returns DW_DLV_NO_ENTRY if no harmless errors 2665 were noted so far. Returns DW_DLV_OK if there are errors. 2666 Never returns DW_DLV_ERROR. 2667 2668 Each call empties the error list (discarding all current entries). 2669 If newerr_count is non-NULL the count of harmless errors 2670 since the last call is returned through the pointer 2671 (some may have been discarded or not returned, it is a circular 2672 list...). 2673 If DW_DLV_NO_ENTRY is returned none of the arguments 2674 here are touched or used. 2675 */ 2676 int dwarf_get_harmless_error_list(Dwarf_Debug /*dbg*/, 2677 unsigned /*count*/, 2678 const char ** /*errmsg_ptrs_array*/, 2679 unsigned * /*newerr_count*/); 2680 2681 /* Insertion is only for testing the harmless error code, it is not 2682 necessarily useful otherwise. */ 2683 void dwarf_insert_harmless_error(Dwarf_Debug /*dbg*/, 2684 char * /*newerror*/); 2685 2686 /* The size of the circular list of strings may be set 2687 and reset as needed. If it is shortened excess 2688 messages are simply dropped. It returns the previous 2689 size. If zero passed in the size is unchanged 2690 and it simply returns the current size */ 2691 unsigned dwarf_set_harmless_error_list_size(Dwarf_Debug /*dbg*/, 2692 unsigned /*maxcount*/); 2693 /* The harmless error strings (if any) are freed when the dbg 2694 is dwarf_finish()ed. */ 2695 2696 /* When the val_in is known these dwarf_get_TAG_name (etc) 2697 functions return the string corresponding to the val_in passed in 2698 through the pointer s_out and the value returned is DW_DLV_OK. 2699 The strings are in static storage 2700 and must not be freed. 2701 If DW_DLV_NO_ENTRY is returned the val_in is not known and 2702 *s_out is not set. DW_DLV_ERROR is never returned.*/ 2703 2704 extern int dwarf_get_TAG_name(unsigned int /*val_in*/, const char ** /*s_out */); 2705 extern int dwarf_get_children_name(unsigned int /*val_in*/, const char ** /*s_out */); 2706 extern int dwarf_get_FORM_name(unsigned int /*val_in*/, const char ** /*s_out */); 2707 extern int dwarf_get_AT_name(unsigned int /*val_in*/, const char ** /*s_out */); 2708 extern int dwarf_get_OP_name(unsigned int /*val_in*/, const char ** /*s_out */); 2709 extern int dwarf_get_ATE_name(unsigned int /*val_in*/, const char ** /*s_out */); 2710 extern int dwarf_get_DS_name(unsigned int /*val_in*/, const char ** /*s_out */); 2711 extern int dwarf_get_END_name(unsigned int /*val_in*/, const char ** /*s_out */); 2712 extern int dwarf_get_ATCF_name(unsigned int /*val_in*/, const char ** /*s_out */); 2713 extern int dwarf_get_ACCESS_name(unsigned int /*val_in*/, const char ** /*s_out */); 2714 extern int dwarf_get_VIS_name(unsigned int /*val_in*/, const char ** /*s_out */); 2715 extern int dwarf_get_VIRTUALITY_name(unsigned int /*val_in*/, const char ** /*s_out */); 2716 extern int dwarf_get_LANG_name(unsigned int /*val_in*/, const char ** /*s_out */); 2717 extern int dwarf_get_ID_name(unsigned int /*val_in*/, const char ** /*s_out */); 2718 extern int dwarf_get_CC_name(unsigned int /*val_in*/, const char ** /*s_out */); 2719 extern int dwarf_get_INL_name(unsigned int /*val_in*/, const char ** /*s_out */); 2720 extern int dwarf_get_ORD_name(unsigned int /*val_in*/, const char ** /*s_out */); 2721 extern int dwarf_get_DSC_name(unsigned int /*val_in*/, const char ** /*s_out */); 2722 extern int dwarf_get_LNS_name(unsigned int /*val_in*/, const char ** /*s_out */); 2723 extern int dwarf_get_LNE_name(unsigned int /*val_in*/, const char ** /*s_out */); 2724 extern int dwarf_get_MACINFO_name(unsigned int /*val_in*/, const char ** /*s_out */); 2725 extern int dwarf_get_CFA_name(unsigned int /*val_in*/, const char ** /*s_out */); 2726 extern int dwarf_get_EH_name(unsigned int /*val_in*/, const char ** /*s_out */); 2727 extern int dwarf_get_FRAME_name(unsigned int /*val_in*/, const char ** /*s_out */); 2728 extern int dwarf_get_CHILDREN_name(unsigned int /*val_in*/, const char ** /*s_out */); 2729 extern int dwarf_get_ADDR_name(unsigned int /*val_in*/, const char ** /*s_out */); 2730 2731 #ifdef __cplusplus 2732 } 2733 #endif 2734 #endif /* _LIBDWARF_H */ 2735 2736 2737