1 /* $NetBSD: _libdwarf.h,v 1.2 2014/03/09 16:58:03 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 2007 John Birrell (jb@freebsd.org) 5 * Copyright (c) 2009-2011 Kai Wang 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * Id: _libdwarf.h 2075 2011-10-27 03:47:28Z jkoshy 30 */ 31 32 #ifndef __LIBDWARF_H_ 33 #define __LIBDWARF_H_ 34 35 #if HAVE_NBTOOL_CONFIG_H 36 # include "nbtool_config.h" 37 #endif 38 39 #include <sys/param.h> 40 #include <sys/queue.h> 41 #include <assert.h> 42 #include <limits.h> 43 #include <stdio.h> 44 #include <stdlib.h> 45 #include <string.h> 46 #include <gelf.h> 47 #include "dwarf.h" 48 #include "libdwarf.h" 49 #include "uthash.h" 50 51 #include "_elftc.h" 52 53 #define DWARF_DIE_HASH_SIZE 8191 54 55 struct _libdwarf_globals { 56 Dwarf_Handler errhand; 57 Dwarf_Ptr errarg; 58 int applyrela; 59 }; 60 61 extern struct _libdwarf_globals _libdwarf; 62 63 #define _DWARF_SET_ERROR(_d, _e, _err, _elf_err) \ 64 _dwarf_set_error(_d, _e, _err, _elf_err, __func__, __LINE__) 65 #define DWARF_SET_ERROR(_d, _e, _err) \ 66 _DWARF_SET_ERROR(_d, _e, _err, 0) 67 #define DWARF_SET_ELF_ERROR(_d, _e) \ 68 _DWARF_SET_ERROR(_d, _e, DW_DLE_ELF, elf_errno()) 69 70 /* 71 * Convenient macros for producer bytes stream generation. 72 */ 73 #define WRITE_VALUE(value, bytes) \ 74 dbg->write_alloc(&ds->ds_data, &ds->ds_cap, &ds->ds_size, \ 75 (value), (bytes), error) 76 #define WRITE_ULEB128(value) \ 77 _dwarf_write_uleb128_alloc(&ds->ds_data, &ds->ds_cap, \ 78 &ds->ds_size, (value), error) 79 #define WRITE_SLEB128(value) \ 80 _dwarf_write_sleb128_alloc(&ds->ds_data, &ds->ds_cap, \ 81 &ds->ds_size, (value), error) 82 #define WRITE_STRING(string) \ 83 _dwarf_write_string_alloc(&ds->ds_data, &ds->ds_cap, \ 84 &ds->ds_size, (string), error) 85 #define WRITE_BLOCK(blk, size) \ 86 _dwarf_write_block_alloc(&ds->ds_data, &ds->ds_cap, \ 87 &ds->ds_size, (blk), (size), error) 88 #define WRITE_PADDING(byte, cnt) \ 89 _dwarf_write_padding_alloc(&ds->ds_data, &ds->ds_cap, \ 90 &ds->ds_size, (byte), (cnt), error) 91 #define RCHECK(expr) \ 92 do { \ 93 ret = expr; \ 94 if (ret != DW_DLE_NONE) \ 95 goto gen_fail; \ 96 } while (/*CONSTCOND*/0) 97 98 99 struct _Dwarf_AttrDef { 100 uint64_t ad_attrib; /* DW_AT_XXX */ 101 uint64_t ad_form; /* DW_FORM_XXX */ 102 uint64_t ad_offset; /* Offset in abbrev section. */ 103 STAILQ_ENTRY(_Dwarf_AttrDef) ad_next; /* Next attribute define. */ 104 }; 105 106 struct _Dwarf_Attribute { 107 Dwarf_Die at_die; /* Ptr to containing DIE. */ 108 Dwarf_Die at_refdie; /* Ptr to reference DIE. */ 109 uint64_t at_offset; /* Offset in info section. */ 110 uint64_t at_attrib; /* DW_AT_XXX */ 111 uint64_t at_form; /* DW_FORM_XXX */ 112 int at_indirect; /* Has indirect form. */ 113 union { 114 uint64_t u64; /* Unsigned value. */ 115 int64_t s64; /* Signed value. */ 116 char *s; /* String. */ 117 uint8_t *u8p; /* Block data. */ 118 } u[2]; /* Value. */ 119 Dwarf_Block at_block; /* Block. */ 120 Dwarf_Locdesc *at_ld; /* at value is locdesc. */ 121 Dwarf_P_Expr at_expr; /* at value is expr. */ 122 uint64_t at_relsym; /* Relocation symbol index. */ 123 const char *at_relsec; /* Rel. to dwarf section. */ 124 STAILQ_ENTRY(_Dwarf_Attribute) at_next; /* Next attribute. */ 125 }; 126 127 struct _Dwarf_Abbrev { 128 uint64_t ab_entry; /* Abbrev entry. */ 129 uint64_t ab_tag; /* Tag: DW_TAG_ */ 130 uint8_t ab_children; /* DW_CHILDREN_no or DW_CHILDREN_yes */ 131 uint64_t ab_offset; /* Offset in abbrev section. */ 132 uint64_t ab_length; /* Length of this abbrev entry. */ 133 uint64_t ab_atnum; /* Number of attribute defines. */ 134 UT_hash_handle ab_hh; /* Uthash handle. */ 135 STAILQ_HEAD(, _Dwarf_AttrDef) ab_attrdef; /* List of attribute defs. */ 136 }; 137 138 struct _Dwarf_Die { 139 Dwarf_Die die_parent; /* Parent DIE. */ 140 Dwarf_Die die_child; /* First child DIE. */ 141 Dwarf_Die die_left; /* Left sibling DIE. */ 142 Dwarf_Die die_right; /* Right sibling DIE. */ 143 uint64_t die_offset; /* DIE offset in section. */ 144 uint64_t die_next_off; /* Next DIE offset in section. */ 145 uint64_t die_abnum; /* Abbrev number. */ 146 Dwarf_Abbrev die_ab; /* Abbrev pointer. */ 147 Dwarf_Tag die_tag; /* DW_TAG_ */ 148 Dwarf_Debug die_dbg; /* Dwarf_Debug pointer. */ 149 Dwarf_CU die_cu; /* Compilation unit pointer. */ 150 char *die_name; /* Ptr to the name string. */ 151 Dwarf_Attribute *die_attrarray; /* Array of attributes. */ 152 STAILQ_HEAD(, _Dwarf_Attribute) die_attr; /* List of attributes. */ 153 STAILQ_ENTRY(_Dwarf_Die) die_pro_next; /* Next die in pro-die list. */ 154 }; 155 156 struct _Dwarf_Loclist { 157 Dwarf_Locdesc **ll_ldlist; /* Array of Locdesc pointer. */ 158 int ll_ldlen; /* Number of Locdesc. */ 159 Dwarf_Unsigned ll_offset; /* Offset in .debug_loc section. */ 160 Dwarf_Unsigned ll_length; /* Length (in bytes) of the loclist. */ 161 TAILQ_ENTRY(_Dwarf_Loclist) ll_next; /* Next loclist in list. */ 162 }; 163 164 struct _Dwarf_P_Expr_Entry { 165 Dwarf_Loc ee_loc; /* Location expression. */ 166 Dwarf_Unsigned ee_sym; /* Optional related reloc sym index. */ 167 STAILQ_ENTRY(_Dwarf_P_Expr_Entry) ee_next; /* Next entry in list. */ 168 }; 169 170 struct _Dwarf_P_Expr { 171 Dwarf_Debug pe_dbg; /* Dwarf_Debug pointer. */ 172 uint8_t *pe_block; /* Expression block data. */ 173 int pe_invalid; /* Block data is up-to-date or not. */ 174 Dwarf_Unsigned pe_length; /* Length of the block. */ 175 STAILQ_HEAD(, _Dwarf_P_Expr_Entry) pe_eelist; /* List of entries. */ 176 STAILQ_ENTRY(_Dwarf_P_Expr) pe_next; /* Next expr in list. */ 177 }; 178 179 struct _Dwarf_Line { 180 Dwarf_LineInfo ln_li; /* Ptr to line info. */ 181 Dwarf_Addr ln_addr; /* Line address. */ 182 Dwarf_Unsigned ln_symndx; /* Symbol index for relocation. */ 183 Dwarf_Unsigned ln_fileno; /* File number. */ 184 Dwarf_Unsigned ln_lineno; /* Line number. */ 185 Dwarf_Signed ln_column; /* Column number. */ 186 Dwarf_Bool ln_bblock; /* Basic block flag. */ 187 Dwarf_Bool ln_stmt; /* Begin statement flag. */ 188 Dwarf_Bool ln_endseq; /* End sequence flag. */ 189 STAILQ_ENTRY(_Dwarf_Line) ln_next; /* Next line in list. */ 190 }; 191 192 struct _Dwarf_LineFile { 193 char *lf_fname; /* Filename. */ 194 char *lf_fullpath; /* Full pathname of the file. */ 195 Dwarf_Unsigned lf_dirndx; /* Dir index. */ 196 Dwarf_Unsigned lf_mtime; /* Modification time. */ 197 Dwarf_Unsigned lf_size; /* File size. */ 198 STAILQ_ENTRY(_Dwarf_LineFile) lf_next; /* Next file in list. */ 199 }; 200 201 struct _Dwarf_LineInfo { 202 Dwarf_Unsigned li_length; /* Length of line info data. */ 203 Dwarf_Half li_version; /* Version of line info. */ 204 Dwarf_Unsigned li_hdrlen; /* Length of line info header. */ 205 Dwarf_Small li_minlen; /* Minimum instrutction length. */ 206 Dwarf_Small li_defstmt; /* Default value of is_stmt. */ 207 int8_t li_lbase; /* Line base for special opcode. */ 208 Dwarf_Small li_lrange; /* Line range for special opcode. */ 209 Dwarf_Small li_opbase; /* Fisrt std opcode number. */ 210 Dwarf_Small *li_oplen; /* Array of std opcode len. */ 211 char **li_incdirs; /* Array of include dirs. */ 212 Dwarf_Unsigned li_inclen; /* Length of inc dir array. */ 213 char **li_lfnarray; /* Array of file names. */ 214 Dwarf_Unsigned li_lflen; /* Length of filename array. */ 215 STAILQ_HEAD(, _Dwarf_LineFile) li_lflist; /* List of files. */ 216 Dwarf_Line *li_lnarray; /* Array of lines. */ 217 Dwarf_Unsigned li_lnlen; /* Length of the line array. */ 218 STAILQ_HEAD(, _Dwarf_Line) li_lnlist; /* List of lines. */ 219 }; 220 221 struct _Dwarf_NamePair { 222 Dwarf_NameTbl np_nt; /* Ptr to containing name table. */ 223 Dwarf_Die np_die; /* Ptr to Ref. Die. */ 224 Dwarf_Unsigned np_offset; /* Offset in CU. */ 225 char *np_name; /* Object/Type name. */ 226 STAILQ_ENTRY(_Dwarf_NamePair) np_next; /* Next pair in the list. */ 227 }; 228 229 struct _Dwarf_NameTbl { 230 Dwarf_Unsigned nt_length; /* Name lookup table length. */ 231 Dwarf_Half nt_version; /* Name lookup table version. */ 232 Dwarf_CU nt_cu; /* Ptr to Ref. CU. */ 233 Dwarf_Off nt_cu_offset; /* Ref. CU offset in .debug_info */ 234 Dwarf_Unsigned nt_cu_length; /* Ref. CU length. */ 235 STAILQ_HEAD(, _Dwarf_NamePair) nt_nplist; /* List of offset+name pairs. */ 236 STAILQ_ENTRY(_Dwarf_NameTbl) nt_next; /* Next name table in the list. */ 237 }; 238 239 struct _Dwarf_NameSec { 240 STAILQ_HEAD(, _Dwarf_NameTbl) ns_ntlist; /* List of name tables. */ 241 Dwarf_NamePair *ns_array; /* Array of pairs of all tables. */ 242 Dwarf_Unsigned ns_len; /* Length of the pair array. */ 243 }; 244 245 struct _Dwarf_Fde { 246 Dwarf_Debug fde_dbg; /* Ptr to containing dbg. */ 247 Dwarf_Cie fde_cie; /* Ptr to associated CIE. */ 248 Dwarf_FrameSec fde_fs; /* Ptr to containing .debug_frame. */ 249 Dwarf_Ptr fde_addr; /* Ptr to start of the FDE. */ 250 Dwarf_Unsigned fde_offset; /* Offset of the FDE. */ 251 Dwarf_Unsigned fde_length; /* Length of the FDE. */ 252 Dwarf_Unsigned fde_cieoff; /* Offset of associated CIE. */ 253 Dwarf_Unsigned fde_initloc; /* Initial location. */ 254 Dwarf_Unsigned fde_adrange; /* Address range. */ 255 Dwarf_Unsigned fde_auglen; /* Augmentation length. */ 256 uint8_t *fde_augdata; /* Augmentation data. */ 257 uint8_t *fde_inst; /* Instructions. */ 258 Dwarf_Unsigned fde_instlen; /* Length of instructions. */ 259 Dwarf_Unsigned fde_instcap; /* Capacity of inst buffer. */ 260 Dwarf_Unsigned fde_symndx; /* Symbol index for relocation. */ 261 Dwarf_Unsigned fde_esymndx; /* End symbol index for relocation. */ 262 Dwarf_Addr fde_eoff; /* Offset from the end symbol. */ 263 STAILQ_ENTRY(_Dwarf_Fde) fde_next; /* Next FDE in list. */ 264 }; 265 266 struct _Dwarf_Cie { 267 Dwarf_Debug cie_dbg; /* Ptr to containing dbg. */ 268 Dwarf_Unsigned cie_index; /* Index of the CIE. */ 269 Dwarf_Unsigned cie_offset; /* Offset of the CIE. */ 270 Dwarf_Unsigned cie_length; /* Length of the CIE. */ 271 Dwarf_Half cie_version; /* CIE version. */ 272 uint8_t *cie_augment; /* CIE augmentation (UTF-8). */ 273 Dwarf_Unsigned cie_ehdata; /* Optional EH Data. */ 274 Dwarf_Unsigned cie_caf; /* Code alignment factor. */ 275 Dwarf_Signed cie_daf; /* Data alignment factor. */ 276 Dwarf_Unsigned cie_ra; /* Return address register. */ 277 Dwarf_Unsigned cie_auglen; /* Augmentation length. */ 278 uint8_t *cie_augdata; /* Augmentation data; */ 279 uint8_t cie_fde_encode; /* FDE PC start/range encode. */ 280 Dwarf_Ptr cie_initinst; /* Initial instructions. */ 281 Dwarf_Unsigned cie_instlen; /* Length of init instructions. */ 282 STAILQ_ENTRY(_Dwarf_Cie) cie_next; /* Next CIE in list. */ 283 }; 284 285 struct _Dwarf_FrameSec { 286 STAILQ_HEAD(, _Dwarf_Cie) fs_cielist; /* List of CIE. */ 287 STAILQ_HEAD(, _Dwarf_Fde) fs_fdelist; /* List of FDE. */ 288 Dwarf_Cie *fs_ciearray; /* Array of CIE. */ 289 Dwarf_Unsigned fs_cielen; /* Length of CIE array. */ 290 Dwarf_Fde *fs_fdearray; /* Array of FDE.*/ 291 Dwarf_Unsigned fs_fdelen; /* Length of FDE array. */ 292 }; 293 294 struct _Dwarf_Arange { 295 Dwarf_ArangeSet ar_as; /* Ptr to the set it belongs to. */ 296 Dwarf_Unsigned ar_address; /* Start PC. */ 297 Dwarf_Unsigned ar_range; /* PC range. */ 298 Dwarf_Unsigned ar_symndx; /* First symbol index for reloc. */ 299 Dwarf_Unsigned ar_esymndx; /* Second symbol index for reloc. */ 300 Dwarf_Addr ar_eoff; /* Offset from second symbol. */ 301 STAILQ_ENTRY(_Dwarf_Arange) ar_next; /* Next arange in list. */ 302 }; 303 304 struct _Dwarf_ArangeSet { 305 Dwarf_Unsigned as_length; /* Length of the arange set. */ 306 Dwarf_Half as_version; /* Version of the arange set. */ 307 Dwarf_Off as_cu_offset; /* Offset of associated CU. */ 308 Dwarf_CU as_cu; /* Ptr to associated CU. */ 309 Dwarf_Small as_addrsz; /* Target address size. */ 310 Dwarf_Small as_segsz; /* Target segment size. */ 311 STAILQ_HEAD (, _Dwarf_Arange) as_arlist; /* List of ae entries. */ 312 STAILQ_ENTRY(_Dwarf_ArangeSet) as_next; /* Next set in list. */ 313 }; 314 315 struct _Dwarf_MacroSet { 316 Dwarf_Macro_Details *ms_mdlist; /* Array of macinfo entries. */ 317 Dwarf_Unsigned ms_cnt; /* Length of the array. */ 318 STAILQ_ENTRY(_Dwarf_MacroSet) ms_next; /* Next set in list. */ 319 }; 320 321 struct _Dwarf_Rangelist { 322 Dwarf_CU rl_cu; /* Ptr to associated CU. */ 323 Dwarf_Unsigned rl_offset; /* Offset of the rangelist. */ 324 Dwarf_Ranges *rl_rgarray; /* Array of ranges. */ 325 Dwarf_Unsigned rl_rglen; /* Length of the ranges array. */ 326 STAILQ_ENTRY(_Dwarf_Rangelist) rl_next; /* Next rangelist in list. */ 327 }; 328 329 struct _Dwarf_CU { 330 Dwarf_Debug cu_dbg; /* Ptr to containing dbg. */ 331 Dwarf_Off cu_offset; /* Offset to the this CU. */ 332 uint32_t cu_length; /* Length of CU data. */ 333 uint16_t cu_length_size; /* Size in bytes of the length field. */ 334 uint16_t cu_version; /* DWARF version. */ 335 uint64_t cu_abbrev_offset; /* Offset into .debug_abbrev. */ 336 uint64_t cu_abbrev_offset_cur; /* Current abbrev offset. */ 337 int cu_abbrev_loaded; /* Abbrev table parsed. */ 338 uint64_t cu_abbrev_cnt; /* Abbrev entry count. */ 339 uint64_t cu_lineno_offset; /* Offset into .debug_lineno. */ 340 uint8_t cu_pointer_size;/* Number of bytes in pointer. */ 341 uint8_t cu_dwarf_size; /* CU section dwarf size. */ 342 Dwarf_Off cu_next_offset; /* Offset to the next CU. */ 343 uint64_t cu_1st_offset; /* First DIE offset. */ 344 int cu_pass2; /* Two pass DIE traverse. */ 345 Dwarf_LineInfo cu_lineinfo; /* Ptr to Dwarf_LineInfo. */ 346 Dwarf_Abbrev cu_abbrev_hash; /* Abbrev hash table. */ 347 STAILQ_ENTRY(_Dwarf_CU) cu_next; /* Next compilation unit. */ 348 }; 349 350 typedef struct _Dwarf_Section { 351 const char *ds_name; /* Section name. */ 352 Dwarf_Small *ds_data; /* Section data. */ 353 Dwarf_Unsigned ds_addr; /* Section virtual addr. */ 354 Dwarf_Unsigned ds_size; /* Section size. */ 355 } Dwarf_Section; 356 357 typedef struct _Dwarf_P_Section { 358 char *ds_name; /* Section name. */ 359 Dwarf_Small *ds_data; /* Section data. */ 360 Dwarf_Unsigned ds_size; /* Section size. */ 361 Dwarf_Unsigned ds_cap; /* Section capacity. */ 362 Dwarf_Unsigned ds_ndx; /* ELF section index. */ 363 Dwarf_Unsigned ds_symndx; /* Section symbol index. (for reloc) */ 364 STAILQ_ENTRY(_Dwarf_P_Section) ds_next; /* Next section in the list. */ 365 } *Dwarf_P_Section; 366 367 typedef struct _Dwarf_Rel_Entry { 368 unsigned char dre_type; /* Reloc type. */ 369 unsigned char dre_length; /* Reloc storage unit length. */ 370 Dwarf_Unsigned dre_offset; /* Reloc storage unit offset. */ 371 Dwarf_Unsigned dre_addend; /* Reloc addend. */ 372 Dwarf_Unsigned dre_symndx; /* Reloc symbol index. */ 373 const char *dre_secname; /* Refer to some debug section. */ 374 STAILQ_ENTRY(_Dwarf_Rel_Entry) dre_next; /* Next reloc entry. */ 375 } *Dwarf_Rel_Entry; 376 377 typedef struct _Dwarf_Rel_Section { 378 struct _Dwarf_P_Section *drs_ds; /* Ptr to actual reloc ELF section. */ 379 struct _Dwarf_P_Section *drs_ref; /* Which debug section it refers. */ 380 struct Dwarf_Relocation_Data_s *drs_drd; /* Reloc data array. */ 381 STAILQ_HEAD(, _Dwarf_Rel_Entry) drs_dre; /* Reloc entry list. */ 382 Dwarf_Unsigned drs_drecnt; /* Count of entries. */ 383 Dwarf_Unsigned drs_size; /* Size of ELF section in bytes. */ 384 int drs_addend; /* Elf_Rel or Elf_Rela */ 385 STAILQ_ENTRY(_Dwarf_Rel_Section) drs_next; /* Next reloc section. */ 386 } *Dwarf_Rel_Section; 387 388 typedef struct { 389 Elf_Data *ed_data; 390 void *ed_alloc; 391 } Dwarf_Elf_Data; 392 393 typedef struct { 394 Elf *eo_elf; 395 GElf_Ehdr eo_ehdr; 396 GElf_Shdr *eo_shdr; 397 Dwarf_Elf_Data *eo_data; 398 Dwarf_Unsigned eo_seccnt; 399 size_t eo_strndx; 400 Dwarf_Obj_Access_Methods eo_methods; 401 } Dwarf_Elf_Object; 402 403 struct _Dwarf_Debug { 404 Dwarf_Obj_Access_Interface *dbg_iface; 405 Dwarf_Section *dbg_section; /* Dwarf section list. */ 406 Dwarf_Section *dbg_info_sec; /* Pointer to info section. */ 407 Dwarf_Off dbg_info_off; /* Current info section offset. */ 408 Dwarf_Unsigned dbg_seccnt; /* Total number of dwarf sections. */ 409 int dbg_mode; /* Access mode. */ 410 int dbg_pointer_size; /* Object address size. */ 411 int dbg_offset_size; /* DWARF offset size. */ 412 int dbg_info_loaded; /* Flag indicating all CU loaded. */ 413 Dwarf_Half dbg_machine; /* ELF machine architecture. */ 414 Dwarf_Handler dbg_errhand; /* Error handler. */ 415 Dwarf_Ptr dbg_errarg; /* Argument to the error handler. */ 416 STAILQ_HEAD(, _Dwarf_CU) dbg_cu;/* List of compilation units. */ 417 Dwarf_CU dbg_cu_current; /* Ptr to the current CU. */ 418 TAILQ_HEAD(, _Dwarf_Loclist) dbg_loclist; /* List of location list. */ 419 Dwarf_NameSec dbg_globals; /* Ptr to pubnames lookup section. */ 420 Dwarf_NameSec dbg_pubtypes; /* Ptr to pubtypes lookup section. */ 421 Dwarf_NameSec dbg_weaks; /* Ptr to weaknames lookup section. */ 422 Dwarf_NameSec dbg_funcs; /* Ptr to static funcs lookup sect. */ 423 Dwarf_NameSec dbg_vars; /* Ptr to static vars lookup sect. */ 424 Dwarf_NameSec dbg_types; /* Ptr to types lookup section. */ 425 Dwarf_FrameSec dbg_frame; /* Ptr to .debug_frame section. */ 426 Dwarf_FrameSec dbg_eh_frame; /* Ptr to .eh_frame section. */ 427 STAILQ_HEAD(, _Dwarf_ArangeSet) dbg_aslist; /* List of arange set. */ 428 Dwarf_Arange *dbg_arange_array; /* Array of arange. */ 429 Dwarf_Unsigned dbg_arange_cnt; /* Length of the arange array. */ 430 char *dbg_strtab; /* Dwarf string table. */ 431 Dwarf_Unsigned dbg_strtab_cap; /* Dwarf string table capacity. */ 432 Dwarf_Unsigned dbg_strtab_size; /* Dwarf string table size. */ 433 STAILQ_HEAD(, _Dwarf_MacroSet) dbg_mslist; /* List of macro set. */ 434 STAILQ_HEAD(, _Dwarf_Rangelist) dbg_rllist; /* List of rangelist. */ 435 uint64_t (*read)(uint8_t *, uint64_t *, int); 436 void (*write)(uint8_t *, uint64_t *, uint64_t, int); 437 int (*write_alloc)(uint8_t **, uint64_t *, uint64_t *, 438 uint64_t, int, Dwarf_Error *); 439 uint64_t (*decode)(uint8_t **, int); 440 441 Dwarf_Half dbg_frame_rule_table_size; 442 Dwarf_Half dbg_frame_rule_initial_value; 443 Dwarf_Half dbg_frame_cfa_value; 444 Dwarf_Half dbg_frame_same_value; 445 Dwarf_Half dbg_frame_undefined_value; 446 447 Dwarf_Regtable3 *dbg_internal_reg_table; 448 449 /* 450 * Fields used by libdwarf producer. 451 */ 452 453 Dwarf_Unsigned dbgp_flags; 454 Dwarf_Unsigned dbgp_isa; 455 Dwarf_Callback_Func dbgp_func; 456 Dwarf_Callback_Func_b dbgp_func_b; 457 Dwarf_Die dbgp_root_die; 458 STAILQ_HEAD(, _Dwarf_Die) dbgp_dielist; 459 STAILQ_HEAD(, _Dwarf_P_Expr) dbgp_pelist; 460 Dwarf_LineInfo dbgp_lineinfo; 461 Dwarf_ArangeSet dbgp_as; 462 Dwarf_Macro_Details *dbgp_mdlist; 463 Dwarf_Unsigned dbgp_mdcnt; 464 STAILQ_HEAD(, _Dwarf_Cie) dbgp_cielist; 465 STAILQ_HEAD(, _Dwarf_Fde) dbgp_fdelist; 466 Dwarf_Unsigned dbgp_cielen; 467 Dwarf_Unsigned dbgp_fdelen; 468 Dwarf_NameTbl dbgp_pubs; 469 Dwarf_NameTbl dbgp_weaks; 470 Dwarf_NameTbl dbgp_funcs; 471 Dwarf_NameTbl dbgp_types; 472 Dwarf_NameTbl dbgp_vars; 473 STAILQ_HEAD(, _Dwarf_P_Section) dbgp_seclist; 474 Dwarf_Unsigned dbgp_seccnt; 475 Dwarf_P_Section dbgp_secpos; 476 Dwarf_P_Section dbgp_info; 477 STAILQ_HEAD(, _Dwarf_Rel_Section) dbgp_drslist; 478 Dwarf_Unsigned dbgp_drscnt; 479 Dwarf_Rel_Section dbgp_drspos; 480 }; 481 482 /* 483 * Internal function prototypes. 484 */ 485 486 int _dwarf_abbrev_add(Dwarf_CU, uint64_t, uint64_t, uint8_t, 487 uint64_t, Dwarf_Abbrev *, Dwarf_Error *); 488 void _dwarf_abbrev_cleanup(Dwarf_CU); 489 int _dwarf_abbrev_find(Dwarf_CU, uint64_t, Dwarf_Abbrev *, 490 Dwarf_Error *); 491 int _dwarf_abbrev_gen(Dwarf_P_Debug, Dwarf_Error *); 492 int _dwarf_abbrev_parse(Dwarf_Debug, Dwarf_CU, Dwarf_Unsigned *, 493 Dwarf_Abbrev *, Dwarf_Error *); 494 int _dwarf_add_AT_dataref(Dwarf_P_Debug, Dwarf_P_Die, Dwarf_Half, 495 Dwarf_Unsigned, Dwarf_Unsigned, const char *, 496 Dwarf_P_Attribute *, Dwarf_Error *); 497 int _dwarf_add_string_attr(Dwarf_P_Die, Dwarf_P_Attribute *, 498 Dwarf_Half, char *, Dwarf_Error *); 499 int _dwarf_alloc(Dwarf_Debug *, int, Dwarf_Error *); 500 void _dwarf_arange_cleanup(Dwarf_Debug); 501 int _dwarf_arange_gen(Dwarf_P_Debug, Dwarf_Error *); 502 int _dwarf_arange_init(Dwarf_Debug, Dwarf_Error *); 503 void _dwarf_arange_pro_cleanup(Dwarf_P_Debug); 504 int _dwarf_attr_alloc(Dwarf_Die, Dwarf_Attribute *, Dwarf_Error *); 505 Dwarf_Attribute _dwarf_attr_find(Dwarf_Die, Dwarf_Half); 506 int _dwarf_attr_gen(Dwarf_P_Debug, Dwarf_P_Section, Dwarf_Rel_Section, 507 Dwarf_CU, Dwarf_Die, int, Dwarf_Error *); 508 int _dwarf_attr_init(Dwarf_Debug, Dwarf_Section *, uint64_t *, int, 509 Dwarf_CU, Dwarf_Die, Dwarf_AttrDef, uint64_t, int, 510 Dwarf_Error *); 511 int _dwarf_attrdef_add(Dwarf_Debug, Dwarf_Abbrev, uint64_t, 512 uint64_t, uint64_t, Dwarf_AttrDef *, Dwarf_Error *); 513 uint64_t _dwarf_decode_lsb(uint8_t **, int); 514 uint64_t _dwarf_decode_msb(uint8_t **, int); 515 int64_t _dwarf_decode_sleb128(uint8_t **); 516 uint64_t _dwarf_decode_uleb128(uint8_t **); 517 void _dwarf_deinit(Dwarf_Debug); 518 int _dwarf_die_alloc(Dwarf_Debug, Dwarf_Die *, Dwarf_Error *); 519 int _dwarf_die_count_links(Dwarf_P_Die, Dwarf_P_Die, 520 Dwarf_P_Die, Dwarf_P_Die); 521 Dwarf_Die _dwarf_die_find(Dwarf_Die, Dwarf_Unsigned); 522 int _dwarf_die_gen(Dwarf_P_Debug, Dwarf_CU, Dwarf_Rel_Section, 523 Dwarf_Error *); 524 void _dwarf_die_link(Dwarf_P_Die, Dwarf_P_Die, Dwarf_P_Die, 525 Dwarf_P_Die, Dwarf_P_Die); 526 int _dwarf_die_parse(Dwarf_Debug, Dwarf_Section *, Dwarf_CU, int, 527 uint64_t, uint64_t, Dwarf_Die *, int, Dwarf_Error *); 528 void _dwarf_die_pro_cleanup(Dwarf_P_Debug); 529 void _dwarf_elf_deinit(Dwarf_Debug); 530 int _dwarf_elf_init(Dwarf_Debug, Elf *, Dwarf_Error *); 531 int _dwarf_elf_load_section(void *, Dwarf_Half, Dwarf_Small **, 532 int *); 533 Dwarf_Endianness _dwarf_elf_get_byte_order(void *); 534 Dwarf_Small _dwarf_elf_get_length_size(void *); 535 Dwarf_Small _dwarf_elf_get_pointer_size(void *); 536 Dwarf_Unsigned _dwarf_elf_get_section_count(void *); 537 int _dwarf_elf_get_section_info(void *, Dwarf_Half, 538 Dwarf_Obj_Access_Section *, int *); 539 void _dwarf_expr_cleanup(Dwarf_P_Debug); 540 int _dwarf_expr_into_block(Dwarf_P_Expr, Dwarf_Error *); 541 Dwarf_Section *_dwarf_find_section(Dwarf_Debug, const char *); 542 void _dwarf_frame_cleanup(Dwarf_Debug); 543 int _dwarf_frame_fde_add_inst(Dwarf_P_Fde, Dwarf_Small, 544 Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); 545 int _dwarf_frame_gen(Dwarf_P_Debug, Dwarf_Error *); 546 int _dwarf_frame_get_fop(Dwarf_Debug, uint8_t *, Dwarf_Unsigned, 547 Dwarf_Frame_Op **, Dwarf_Signed *, Dwarf_Error *); 548 int _dwarf_frame_get_internal_table(Dwarf_Fde, Dwarf_Addr, 549 Dwarf_Regtable3 **, Dwarf_Addr *, Dwarf_Error *); 550 int _dwarf_frame_interal_table_init(Dwarf_Debug, Dwarf_Error *); 551 void _dwarf_frame_params_init(Dwarf_Debug); 552 void _dwarf_frame_pro_cleanup(Dwarf_P_Debug); 553 int _dwarf_frame_regtable_copy(Dwarf_Debug, Dwarf_Regtable3 **, 554 Dwarf_Regtable3 *, Dwarf_Error *); 555 int _dwarf_frame_section_load(Dwarf_Debug, Dwarf_Error *); 556 int _dwarf_frame_section_load_eh(Dwarf_Debug, Dwarf_Error *); 557 int _dwarf_generate_sections(Dwarf_P_Debug, Dwarf_Error *); 558 Dwarf_Unsigned _dwarf_get_reloc_type(Dwarf_P_Debug, int); 559 int _dwarf_get_reloc_size(Dwarf_Debug, Dwarf_Unsigned); 560 void _dwarf_info_cleanup(Dwarf_Debug); 561 int _dwarf_info_first_cu(Dwarf_Debug, Dwarf_Error *); 562 int _dwarf_info_gen(Dwarf_P_Debug, Dwarf_Error *); 563 int _dwarf_info_load(Dwarf_Debug, int, Dwarf_Error *); 564 int _dwarf_info_next_cu(Dwarf_Debug, Dwarf_Error *); 565 void _dwarf_info_pro_cleanup(Dwarf_P_Debug); 566 int _dwarf_init(Dwarf_Debug, Dwarf_Unsigned, Dwarf_Handler, 567 Dwarf_Ptr, Dwarf_Error *); 568 int _dwarf_lineno_gen(Dwarf_P_Debug, Dwarf_Error *); 569 int _dwarf_lineno_init(Dwarf_Die, uint64_t, Dwarf_Error *); 570 void _dwarf_lineno_cleanup(Dwarf_LineInfo); 571 void _dwarf_lineno_pro_cleanup(Dwarf_P_Debug); 572 int _dwarf_loc_fill_locdesc(Dwarf_Debug, Dwarf_Locdesc *, uint8_t *, 573 uint64_t, uint8_t, Dwarf_Error *); 574 int _dwarf_loc_fill_locexpr(Dwarf_Debug, Dwarf_Locdesc **, 575 uint8_t *, uint64_t, uint8_t, Dwarf_Error *); 576 int _dwarf_loc_add(Dwarf_Die, Dwarf_Attribute, Dwarf_Error *); 577 int _dwarf_loc_expr_add_atom(Dwarf_Debug, uint8_t *, uint8_t *, 578 Dwarf_Small, Dwarf_Unsigned, Dwarf_Unsigned, int *, 579 Dwarf_Error *); 580 int _dwarf_loclist_find(Dwarf_Debug, Dwarf_CU, uint64_t, 581 Dwarf_Loclist *, Dwarf_Error *); 582 void _dwarf_loclist_cleanup(Dwarf_Debug); 583 void _dwarf_loclist_free(Dwarf_Loclist); 584 int _dwarf_loclist_add(Dwarf_Debug, Dwarf_CU, uint64_t, 585 Dwarf_Loclist *, Dwarf_Error *); 586 void _dwarf_macinfo_cleanup(Dwarf_Debug); 587 int _dwarf_macinfo_gen(Dwarf_P_Debug, Dwarf_Error *); 588 int _dwarf_macinfo_init(Dwarf_Debug, Dwarf_Error *); 589 void _dwarf_macinfo_pro_cleanup(Dwarf_P_Debug); 590 int _dwarf_nametbl_init(Dwarf_Debug, Dwarf_NameSec *, 591 Dwarf_Section *, Dwarf_Error *); 592 void _dwarf_nametbl_cleanup(Dwarf_NameSec *); 593 int _dwarf_nametbl_gen(Dwarf_P_Debug, const char *, Dwarf_NameTbl, 594 Dwarf_Error *); 595 void _dwarf_nametbl_pro_cleanup(Dwarf_NameTbl *); 596 int _dwarf_pro_callback(Dwarf_P_Debug, char *, int, Dwarf_Unsigned, 597 Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned, 598 Dwarf_Unsigned *, int *); 599 Dwarf_P_Section _dwarf_pro_find_section(Dwarf_P_Debug, const char *); 600 int _dwarf_ranges_add(Dwarf_Debug, Dwarf_CU, uint64_t, 601 Dwarf_Rangelist *, Dwarf_Error *); 602 void _dwarf_ranges_cleanup(Dwarf_Debug); 603 int _dwarf_ranges_find(Dwarf_Debug, uint64_t, Dwarf_Rangelist *); 604 uint64_t _dwarf_read_lsb(uint8_t *, uint64_t *, int); 605 uint64_t _dwarf_read_msb(uint8_t *, uint64_t *, int); 606 int64_t _dwarf_read_sleb128(uint8_t *, uint64_t *); 607 uint64_t _dwarf_read_uleb128(uint8_t *, uint64_t *); 608 char *_dwarf_read_string(void *, Dwarf_Unsigned, uint64_t *); 609 uint8_t *_dwarf_read_block(void *, uint64_t *, uint64_t); 610 int _dwarf_reloc_section_finalize(Dwarf_P_Debug, Dwarf_Rel_Section, 611 Dwarf_Error *); 612 int _dwarf_reloc_entry_add(Dwarf_P_Debug, Dwarf_Rel_Section, 613 Dwarf_P_Section, unsigned char, unsigned char, 614 Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned, 615 const char *, Dwarf_Error *); 616 int _dwarf_reloc_entry_add_pair(Dwarf_P_Debug, Dwarf_Rel_Section, 617 Dwarf_P_Section, unsigned char, Dwarf_Unsigned, 618 Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned, 619 Dwarf_Unsigned, Dwarf_Error *); 620 void _dwarf_reloc_cleanup(Dwarf_P_Debug); 621 int _dwarf_reloc_gen(Dwarf_P_Debug, Dwarf_Error *); 622 int _dwarf_reloc_section_gen(Dwarf_P_Debug, Dwarf_Rel_Section, 623 Dwarf_Error *); 624 int _dwarf_reloc_section_init(Dwarf_P_Debug, Dwarf_Rel_Section *, 625 Dwarf_P_Section, Dwarf_Error *); 626 void _dwarf_reloc_section_free(Dwarf_P_Debug, Dwarf_Rel_Section *); 627 void _dwarf_section_cleanup(Dwarf_P_Debug); 628 int _dwarf_section_callback(Dwarf_P_Debug, Dwarf_P_Section, 629 Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Unsigned, 630 Dwarf_Unsigned, Dwarf_Error *); 631 void _dwarf_section_free(Dwarf_P_Debug, Dwarf_P_Section *); 632 int _dwarf_section_init(Dwarf_P_Debug, Dwarf_P_Section *, 633 const char *, int, Dwarf_Error *); 634 void _dwarf_set_error(Dwarf_Debug, Dwarf_Error *, int, int, 635 const char *, int); 636 int _dwarf_strtab_add(Dwarf_Debug, char *, uint64_t *, 637 Dwarf_Error *); 638 void _dwarf_strtab_cleanup(Dwarf_Debug); 639 int _dwarf_strtab_gen(Dwarf_P_Debug, Dwarf_Error *); 640 char *_dwarf_strtab_get_table(Dwarf_Debug); 641 int _dwarf_strtab_init(Dwarf_Debug, Dwarf_Error *); 642 void _dwarf_write_block(void *, uint64_t *, uint8_t *, uint64_t); 643 int _dwarf_write_block_alloc(uint8_t **, uint64_t *, uint64_t *, 644 uint8_t *, uint64_t, Dwarf_Error *); 645 void _dwarf_write_lsb(uint8_t *, uint64_t *, uint64_t, int); 646 int _dwarf_write_lsb_alloc(uint8_t **, uint64_t *, uint64_t *, 647 uint64_t, int, Dwarf_Error *); 648 void _dwarf_write_msb(uint8_t *, uint64_t *, uint64_t, int); 649 int _dwarf_write_msb_alloc(uint8_t **, uint64_t *, uint64_t *, 650 uint64_t, int, Dwarf_Error *); 651 void _dwarf_write_padding(void *, uint64_t *, uint8_t, uint64_t); 652 int _dwarf_write_padding_alloc(uint8_t **, uint64_t *, uint64_t *, 653 uint8_t, uint64_t, Dwarf_Error *); 654 void _dwarf_write_string(void *, uint64_t *, char *); 655 int _dwarf_write_string_alloc(uint8_t **, uint64_t *, uint64_t *, 656 char *, Dwarf_Error *); 657 int _dwarf_write_sleb128(uint8_t *, uint8_t *, int64_t); 658 int _dwarf_write_sleb128_alloc(uint8_t **, uint64_t *, uint64_t *, 659 int64_t, Dwarf_Error *); 660 int _dwarf_write_uleb128(uint8_t *, uint8_t *, uint64_t); 661 int _dwarf_write_uleb128_alloc(uint8_t **, uint64_t *, uint64_t *, 662 uint64_t, Dwarf_Error *); 663 664 #endif /* !__LIBDWARF_H_ */ 665