libdwarf
libdwarf A library for parsing DWARF debug information
Implementation Notes
- Memory management is totally different from SGI/DA libdwarf. Most data structures are stored in internal linked lists. When an application requires data objects pointers to internally stored objects are returned instead of allocating new copies. As a result, in most situations, applications should not free the pointers returned by the library.
Tickets
| Ticket | Status | Owner | Milestone | Summary |
|---|---|---|---|---|
| #22 | new | kaiwang27 | RELEASE_1_0 | Create a test suite for libdwarf. |
| #23 | new | jkoshy | RELEASE_1_0 | Create a tutorial for libdwarf |
| #31 | new | kaiwang27 | Future Work | Redesign some of the existing APIs in libdwarf. |
| #37 | new | kaiwang27 | Future Work | New convenience functions for `libdwarf` |
| #291 | new | Future Work | Diffs to get svn rev 1216 to build on Win7 under msvc | |
| #326 | new | RELEASE_1_0 | Dependency cycles in libdwarf | |
| #397 | new | kaiwang27 | RELEASE_1_0 | CIE augmentation "HC" should be accepted |
| #405 | new | kaiwang27 | RELEASE_1_0 | Add test cases for libdwarf (r2595) |
| #408 | new | kaiwang27 | RELEASE_1_0 | Add support for DWARF4 ".debug_types" section |
| #426 | new | kaiwang27 | RELEASE_1_0 | _dwarf_write_sleb128 wrongly encode values |
| #427 | new | kaiwang27 | RELEASE_1_0 | Wrong interpretation of code_offset in dwarf_add_line_entry |
Implementation Status
| API | Implementation | Manual Page | Test Cases | Compatible w/ SGI | Comments |
| Error Handling | |||||
| dwarf_seterrhand() | Y | Y | N | Y | Extended semantics. |
| dwarf_seterrarg() | Y | Y | N | Y | Extended semantics. |
| dwarf_errno | Y | Y | N | Y | Our Dwarf_Error is not opaque |
| dwarf_errmsg | Y | Y | N | Y | Our Dwarf_Error is not opaque |
| Initialization | |||||
| dwarf_init() | Y | Y | Y | Y | |
| dwarf_elf_init() | Y | Y | N | Y | |
| dwarf_get_elf() | Y | Y | N | Y | |
| dwarf_finish() | Y | Y | N | Y | |
| Misc | |||||
| dwarf_get_address_size() | Y | Y | Y | Y | |
| dwarf_dealloc() | Y | Y | N | Y | Ours is a dummy call |
| dwarf_set_reloc_application() | Y | N | N | Y | |
| DIE delivery | |||||
| dwarf_next_cu_header | Y | Y | Y | Y | |
| dwarf_next_cu_header_b | Y | N | Y | Y | |
| dwarf_siblingof() | Y | Y | Y | Y | |
| dwarf_child() | Y | Y | Y | Y | |
| dwarf_offdie() | Y | Y | N | Y | |
| DIE query | |||||
| dwarf_tag() | Y | Y | Y | Y | |
| dwarf_dieoffset() | Y | Y | Y | Y | |
| dwarf_die_CU_offset() | Y | Y | Y | Y | |
| dwarf_die_CU_offset_range() | Y | Y | Y | Y | |
| dwarf_diename() | Y | Y | Y | Y | |
| dwarf_die_abbrev_code() | Y | Y | Y | Y | |
| dwarf_attrlist | Y | Y | Y | Y | |
| dwarf_hasattr | Y | Y | Y | Y | |
| dwarf_attr | Y | Y | Y | Y | |
| dwarf_lowpc | Y | Y | Y | Y | |
| dwarf_highpc | Y | Y | Y | Y | |
| dwarf_bytesize | Y | Y | Y | Y | |
| dwarf_bitsize | Y | Y | Y | Y | |
| dwarf_bitoffset | Y | Y | Y | Y | |
| dwarf_srclang | Y | Y | Y | Y | |
| dwarf_arrayorder | Y | Y | Y | Y | |
| dwarf_get_cu_die_offset_given_cu_header_offset() | Y | Y | Y | Y | Name too long... |
| Attribute Form Queries | |||||
| dwarf_hasform | Y | Y | Y | Y | |
| dwarf_whatform | Y | Y | Y | Y | |
| dwarf_whatform_direct | Y | Y | Y | Y | |
| dwarf_whatattr | Y | Y | Y | Y | |
| dwarf_formref | Y | Y | Y | Y | |
| dwarf_global_formref | Y | Y | Y | Y | |
| dwarf_formaddr | Y | N | Y | Y | |
| dwarf_formexprloc | Y | N | N | Y | |
| dwarf_formflag | Y | Y | Y | Y | |
| dwarf_formudata | Y | Y | Y | Y | |
| dwarf_formsdata | Y | Y | Y | Y | |
| dwarf_formsig8 | Y | N | N | Y | |
| dwarf_formblock | Y | N | Y | Y | |
| dwarf_formstring | Y | N | Y | Y | |
| dwarf_get_form_class | Y | N | N | Y | |
| dwarf_attrval_flag | Y | N | N | Our Extension | |
| dwarf_attrval_string | Y | N | N | Our Extension | |
| dwarf_attrval_signed | Y | N | N | Our Extension | |
| dwarf_attrval_unsigned | Y | N | N | Our Extension | |
| Location List Queries | |||||
| dwarf_loclist_n() | Y | N | Y | Y | |
| dwarf_loclist() | Y | N | Y | Y | |
| dwarf_loclist_from_expr() | Y | N | N | Y | |
| dwarf_loclist_from_expr_a() | Y | N | N | Y | |
| dwarf_loclist_from_expr_dealloc() | Y | N | N | Our Extension | |
| dwarf_get_loclist_entry() | Y | N | N | Y | |
| Line Number Operations | |||||
| dwarf_srclines() | Y | N | Y | Y | |
| dwarf_srcfiles() | Y | Y | Y | Y | |
| dwarf_linebeginstatement() | Y | N | Y | Y | |
| dwarf_lineendsequence() | Y | N | Y | Y | |
| dwarf_lineno() | Y | N | Y | Y | |
| dwarf_line_srcfileno() | Y | N | Y | Y | |
| dwarf_lineaddr() | Y | N | Y | Y | |
| dwarf_lineoff() | Y | N | Y | Y | |
| dwarf_linesrc() | Y | N | Y | Y | |
| dwarf_lineblock() | Y | N | Y | Y | |
| Global Name Space Operations | |||||
| dwarf_get_globals() | Y | N | Y | Y | |
| dwarf_globname() | Y | N | Y | Y | |
| dwarf_global_die_offset() | Y | N | Y | Y | |
| dwarf_global_cu_offset() | Y | N | Y | Y | |
| dwarf_global_name_offsets() | Y | N | Y | Y | |
| Type Names Operations | |||||
| dwarf_get_pubtypes() | Y | N | N | Y | |
| dwarf_pubtypename() | Y | N | N | Y | |
| dwarf_pubtype_die_offset() | Y | N | N | Y | |
| dwarf_pubtype_cu_offset() | Y | N | N | Y | |
| dwarf_pubtype_name_offsets() | Y | N | N | Y | |
| User Defined Type Names Operations | |||||
| dwarf_get_types() | Y | N | N | Y | |
| dwarf_typename() | Y | N | N | Y | |
| dwarf_type_die_offset() | Y | N | N | Y | |
| dwarf_type_cu_offset() | Y | N | N | Y | |
| dwarf_type_name_offsets() | Y | N | N | Y | |
| Static Variable Names Operations | |||||
| dwarf_get_vars() | Y | N | N | Y | |
| dwarf_varname() | Y | N | N | Y | |
| dwarf_var_die_offset() | Y | N | N | Y | |
| dwarf_var_cu_offset() | Y | N | N | Y | |
| dwarf_var_name_offsets() | Y | N | N | Y | |
| Static Function Names Operataions | |||||
| dwarf_get_funcs() | Y | N | N | Y | |
| dwarf_funcname() | Y | N | N | Y | |
| dwarf_func_die_offset() | Y | N | N | Y | |
| dwarf_func_cu_offset() | Y | N | N | Y | |
| dwarf_func_name_offsets() | Y | N | N | Y | |
| Weak Names Space Operations | |||||
| dwarf_get_weaks() | Y | N | N | Y | |
| dwarf_weakname() | Y | N | N | Y | |
| dwarf_weak_die_offset() | Y | N | N | Y | |
| dwarf_weak_cu_offset() | Y | N | N | Y | |
| dwarf_weak_name_offsets() | Y | N | N | Y | |
| Macro Information Operations | |||||
| dwarf_find_macro_value_start() | Y | N | Y | Y | |
| dwarf_get_macro_details() | Y | N | Y | Y | |
| Call Frame Operations | |||||
| dwarf_get_fde_list() | Y | N | Y | Y | |
| dwarf_get_fde_list_eh() | Y | N | Y | Y | |
| dwarf_get_fde_n() | Y | N | Y | Y | |
| dwarf_get_fde_at_pc() | Y | N | Y | Y | |
| dwarf_get_cie_of_fde() | Y | N | Y | Y | |
| dwarf_get_fde_for_die() | Y | N | N | Y | |
| dwarf_get_fde_range() | Y | N | Y | Y | |
| dwarf_get_cie_info() | Y | N | Y | Y | |
| dwarf_get_fde_instr_bytes() | Y | N | Y | Y | |
| dwarf_get_fde_info_for_reg() | Y | N | Y | Y | |
| dwarf_get_fde_info_for_all_regs() | Y | N | Y | Y | |
| dwarf_get_fde_info_for_reg3() | Y | N | Y | Y | |
| dwarf_get_fde_info_for_cfa_reg3() | Y | N | Y | Y | |
| dwarf_get_fde_info_for_all_regs3() | Y | N | Y | Y | |
| dwarf_set_frame_rule_table_size() | Y | N | N | Y | |
| dwarf_set_frame_rule_initial_value() | Y | N | N | Y | |
| dwarf_set_frame_cfa_value() | Y | N | Y | Y | |
| dwarf_set_frame_same_value() | Y | N | N | Y | |
| dwarf_set_frame_undefined_value() | Y | N | N | Y | |
| dwarf_expand_frame_instructions() | Y | N | N | Y | |
| dwarf_free_expanded_frame_instructions() | Y | N | N | Our Extension | |
| Abbreviations access | |||||
| dwarf_get_abbrev() | Y | N | Y | Y | |
| dwarf_get_abbrev_tag() | Y | N | Y | Y | |
| dwarf_get_abbrev_code() | Y | N | Y | Y | |
| dwarf_get_abbrev_children_flag() | Y | N | Y | Y | |
| dwarf_get_abbrev_entry() | Y | N | Y | Y | |
| String Section Operations | |||||
| dwarf_get_str() | Y | N | N | Y | |
| Address Range Operations | |||||
| dwarf_get_aranges() | Y | N | Y | Y | |
| dwarf_get_arange() | Y | N | Y | Y | |
| dwarf_get_cu_die_offset() | Y | N | Y | Y | |
| dwarf_get_arange_cu_header_offset() | Y | N | Y | Y | |
| dwarf_get_arange_info() | Y | N | Y | Y | |
| Ranges Operations | |||||
| dwarf_get_ranges() | Y | N | Y | Y | |
| dwarf_get_ranges_a() | Y | N | Y | Y | Ours is identical to dwarf_get_ranges() |
| dwarf_ranges_dealloc() | Y | N | N | Y | no-op |
| Convert Names To Strings | |||||
| dwarf_get_ACCESS_name() | Y | N | N | Y | |
| dwarf_get_AT_name() | Y | N | N | Y | |
| dwarf_get_ATE_name() | Y | N | N | Y | |
| dwarf_get_ADDR_name() | N | ||||
| dwarf_get_ATCF_name() | N | ||||
| dwarf_get_CC_name() | Y | N | N | Y | |
| dwarf_get_CFA_name() | Y | N | N | Y | |
| dwarf_get_CHILDREN_name() | Y | N | N | Y | |
| dwarf_get_children_name() | N | ||||
| dwarf_get_DS_name() | N | ||||
| dwarf_get_DSC_name() | Y | N | N | Y | |
| dwarf_get_EH_name() | N | ||||
| dwarf_get_END_name() | N | ||||
| dwarf_get_FORM_name() | Y | N | N | Y | |
| dwarf_get_FRAME_name() | N | ||||
| dwarf_get_ID_name() | Y | N | N | Y | |
| dwarf_get_INL_name() | Y | N | N | Y | |
| dwarf_get_LANG_name() | Y | N | N | Y | |
| dwarf_get_LNE_name() | Y | N | N | Y | |
| dwarf_get_LNS_name() | Y | N | N | Y | |
| dwarf_get_MACINFO_name() | Y | N | N | Y | |
| dwarf_get_OP_name() | Y | N | N | Y | |
| dwarf_get_ORD_name() | Y | N | N | Y | |
| dwarf_get_TAG_name() | Y | N | N | Y | |
| dwarf_get_VIRTUALITY_name() | Y | N | N | Y | |
| dwarf_get_VIS_name() | Y | N | N | Y | |
| Producer General | |||||
| dwarf_producer_init() | Y | N | N | Y | |
| dwarf_producer_init_b() | Y | N | N | Y | |
| dwarf_transform_to_disk_form() | Y | N | N | Y | |
| dwarf_get_section_bytes() | Y | N | N | Y | |
| dwarf_get_relocation_info_count() | Y | N | N | Y | |
| dwarf_get_relocation_info() | Y | N | N | Y | |
| dwarf_reset_section_bytes() | Y | N | N | Y | |
| dwarf_producer_init() | N | ||||
| Debugging Information Entry Creation | |||||
| dwarf_add_die_to_debug() | Y | N | N | Y | |
| dwarf_new_die() | Y | N | N | Y | |
| dwarf_die_link() | Y | N | N | Y | needs further verification |
| Attributes Creation | |||||
| dwarf_add_AT_location_expr() | Y | N | N | Y | |
| dwarf_add_AT_name() | Y | N | N | Y | We always use DW_FORM_strp |
| dwarf_add_AT_comp_dir() | Y | N | N | Y | We always use DW_FORM_strp |
| dwarf_add_AT_producer() | Y | N | N | Y | We always use DW_FORM_strp |
| dwarf_add_AT_const_value_signedint() | Y | N | N | Y | |
| dwarf_add_AT_const_value_unsignedint() | Y | N | N | Y | |
| dwarf_add_AT_const_value_string() | Y | N | N | Y | We always use DW_FORM_strp |
| dwarf_add_AT_targ_address() | Y | N | N | Y | |
| dwarf_add_AT_targ_address_b() | Y | N | N | Y | |
| dwarf_add_AT_dataref() | Y | N | N | Y | |
| dwarf_add_AT_ref_address() | Y | N | N | Y | |
| dwarf_add_AT_unsigned_const() | Y | N | N | Y | |
| dwarf_add_AT_signed_const() | Y | N | N | Y | |
| dwarf_add_AT_reference() | Y | N | N | Y | |
| dwarf_add_AT_flag() | Y | N | N | Y | |
| dwarf_add_AT_string() | Y | N | N | Y | We always use DW_FORM_strp |
| Expression Creation | |||||
| dwarf_new_expr() | Y | N | N | Y | |
| dwarf_add_expr_gen() | Y | N | N | Y | |
| dwarf_add_expr_addr() | Y | N | N | Y | |
| dwarf_add_expr_addr_b() | Y | N | N | Y | |
| dwarf_expr_current_offset() | Y | N | N | Y | |
| dwarf_expr_into_block() | Y | N | N | Y | |
| Line Number Creation | |||||
| dwarf_add_line_entry() | Y | N | N | Y | |
| dwarf_lne_set_address() | Y | N | N | Y | |
| dwarf_lne_end_sequence() | Y | N | N | Y | |
| dwarf_add_directory_decl() | Y | N | N | Y | |
| dwarf_add_file_decl() | Y | N | N | Y | |
| Arange Creation | |||||
| dwarf_add_arange() | Y | N | N | Y | |
| dwarf_add_arange_b() | Y | N | N | Y | |
| Pubnames Creation | |||||
| dwarf_add_pubname() | Y | N | N | Y | |
| Weaknames Creation | |||||
| dwarf_add_weakname() | Y | N | N | Y | |
| Static Function Name Creation | |||||
| dwarf_add_funcname() | Y | N | N | Y | |
| User-defined Type Name Creation | |||||
| dwarf_add_typename() | Y | N | N | Y | |
| Static Variable Name Creation | |||||
| dwarf_add_varname() | Y | N | N | Y | |
| Macro Info Creation | |||||
| dwarf_def_macro() | Y | N | N | Y | |
| dwarf_undef_macro() | Y | N | N | Y | |
| dwarf_start_macro_file() | Y | N | N | Y | |
| dwarf_end_macro_file() | Y | N | N | Y | |
| dwarf_vendor_ext() | Y | N | N | Y | |
| Frame Info Creation | |||||
| dwarf_new_fde() | Y | N | N | Y | |
| dwarf_add_frame_cie() | Y | N | N | Y | |
| dwarf_add_frame_fde() | Y | N | N | Y | |
| dwarf_add_frame_fde_b() | Y | N | N | Y | |
| dwarf_add_frame_info() | N | SGI libdwarf MIPS extension? | |||
| dwarf_add_frame_info_b() | N | SGI libdwarf MIPS extension? | |||
| dwarf_fde_cfa_offset() | Y | N | N | Y | |
| dwarf_add_fde_inst() | Y | N | N | Y |
References
- Dwarf Standards
- SGI/DA libdwarf
- elfutils has also implemented a libdwarf.