Crate gimli [] [src]

A lazy, zero-copy parser for the DWARF debugging information format.

  • Zero-copy: everything is just a reference to the original input buffer. No copies of the input data ever get made.

  • Lazy: only the compilation units' entries that you iterate over get parsed, and only as deep as you ask. Skip over a compilation unit and its entries don't get parsed.

  • Bring your own object file parser: gimli isn't coupled to any platform or object file format. Use your own ELF parser on Linux or a Mach-O parser on OSX.

This library primarily targets the fourth edition of the standard (the most recent, at time of writing).

Example Usage

Print out all of the functions in a compilation unit.

use gimli;

// Read the .debug_info and .debug_abbrev sections with whatever object
// loader you're using.
let debug_info = gimli::DebugInfo::<gimli::LittleEndian>::new(read_debug_info());
let debug_abbrev = gimli::DebugAbbrev::<gimli::LittleEndian>::new(read_debug_abbrev());

// Grab the first compilation unit.
let unit = debug_info.units().next()
    .expect("Should have at least one unit")
    .expect("and it should parse OK");

// Parse the abbreviations for this compilation unit.
let abbrevs = unit.abbreviations(debug_abbrev)
    .expect("Should parse the abbreviations OK");

// Get a cursor for iterating over this unit's entries.
let mut entries = unit.entries(&abbrevs);

// Keep iterating entries while the cursor is not exhausted.
while let Some((_, entry)) = entries.next_dfs().expect("Should parse next entry") {
    // If we find an entry for a function, print it.
    if entry.tag() == gimli::DW_TAG_subprogram {
        println!("Found a function: {:?}", entry);
    }
}

See the example programs for complete examples.

Using with FallibleIterator

The standard library's Iterator trait and related APIs do not play well with iterators where the next operation is fallible. One can make the Iterator's associated Item type be a Result<T, E>, however the provided methods cannot gracefully handle the case when an Err is returned.

This situation led to the fallible-iterator crate's existence. You can read more of the rationale for its existence in its docs. The crate provides the helpers you have come to expect (eg map, filter, etc) for iterators that can fail.

gimli's many lazy parsing iterators are a perfect match for the fallible-iterator crate's FallibleIterator trait because parsing is not done eagerly. Parse errors later in the input might only be discovered after having iterated through many items.

To use gimli iterators with FallibleIterator, import the crate and trait into your code:

// Add the `fallinle-iterator` crate. Don't forget to add it to your
// `Cargo.toml`, too!
extern crate fallible_iterator;
extern crate gimli;

// Use the `FallibleIterator` trait so its methods are in scope!
use fallible_iterator::FallibleIterator;
use gimli::{DebugAranges, LittleEndian, ParseResult};

fn find_sum_of_address_range_lengths(aranges: DebugAranges<LittleEndian>)
    -> ParseResult<u64>
{
    // `DebugAranges::items` returns a `FallibleIterator`!
    aranges.items()
        // `map` is provided by `FallibleIterator`!
        .map(|arange| arange.len())
        // `fold` is provided by `FallibleIterator`!
        .fold(0, |sum, len| sum + len)
}

Structs

Abbreviation

An abbreviation describes the shape of a DebuggingInformationEntry's type: its code, tag type, whether it has children, and its set of attributes.

Abbreviations

A set of type abbreviations.

ArangeEntry

A single parsed arange.

Attribute

An attribute in a DebuggingInformationEntry, consisting of a name and associated value.

AttributeSpecification

The description of an attribute in an abbreviated type. It is a pair of name and form.

AttrsIter

An iterator over a particular entry's attributes.

DebugAbbrev

The DebugAbbrev struct represents the abbreviations describing DebuggingInformationEntrys' attribute names and forms found in the .debug_abbrev section.

DebugAbbrevOffset

An offset into the .debug_abbrev section.

DebugInfo

The DebugInfo struct represents the DWARF debugging information found in the .debug_info section.

DebugInfoOffset

An offset into the .debug_info section.

DebugLine

The DebugLine struct contains the source location to instruction mapping found in the .debug_line section.

DebugLineOffset

An offset into the .debug_line section.

DebugLocOffset

An offset into the .debug_loc section.

DebugMacinfoOffset

An offset into the .debug_macinfo section.

DebugStr

The DebugStr struct represents the DWARF strings found in the .debug_str section.

DebugStrOffset

An offset into the .debug_str section.

DebugTypes

The DebugTypes struct represents the DWARF type information found in the .debug_types section.

DebugTypesOffset

An offset into the .debug_types section.

DebuggingInformationEntry

A Debugging Information Entry (DIE).

DwAt
DwChildren
DwForm
DwLne
DwLns
DwTag
EndianBuf

A &[u8] slice with compile-time endianity metadata.

EntriesCursor

A cursor into the Debugging Information Entries tree for a compilation unit.

FileEntry

An entry in the LineNumberProgramHeader's file_names set.

LineNumberProgramHeader

A header for a line number program in the .debug_line section, as defined in section 6.2.4 of the standard.

LineNumberRow

A row in the line number program's resulting matrix.

OpcodesIter

An iterator yielding parsed opcodes.

PubNamesEntry

A single parsed pubname.

PubTypesEntry

A single parsed pubtype.

StateMachine

Executes a LineNumberProgram to recreate the matrix mapping to and from instructions to source locations.

TypeUnitHeader

The header of a type unit's debugging information.

TypeUnitHeadersIter

An iterator over the type-units of this .debug_types section.

UnitHeader

The header of a compilation unit's debugging information.

UnitHeadersIter

An iterator over the compilation- and partial-units of a section.

UnitOffset

An offset into the current compilation or type unit.

Enums

AttributeValue

The value of an attribute in a DebuggingInformationEntry.

BigEndian

Big endian byte order.

ColumnType

The type of column that a row is referring to.

Error

An error that occurred when parsing.

Format

Whether the format of a compilation unit is 32- or 64-bit.

LittleEndian

Little endian byte order.

Opcode

A parsed line number program opcode.

Constants

DW_AT_abstract_origin
DW_AT_accessibility
DW_AT_address_class
DW_AT_allocated
DW_AT_artificial
DW_AT_associated
DW_AT_base_types
DW_AT_binary_scale
DW_AT_bit_offset
DW_AT_bit_size
DW_AT_bit_stride
DW_AT_byte_size
DW_AT_byte_stride
DW_AT_call_column
DW_AT_call_file
DW_AT_call_line
DW_AT_calling_convention
DW_AT_common_reference
DW_AT_comp_dir
DW_AT_const_expr
DW_AT_const_value
DW_AT_containing_type
DW_AT_count
DW_AT_data_bit_offset
DW_AT_data_location
DW_AT_data_member_location
DW_AT_decimal_scale
DW_AT_decimal_sign
DW_AT_decl_column
DW_AT_decl_file
DW_AT_decl_line
DW_AT_declaration
DW_AT_default_value
DW_AT_description
DW_AT_digit_count
DW_AT_discr
DW_AT_discr_list
DW_AT_discr_value
DW_AT_elemental
DW_AT_encoding
DW_AT_endianity
DW_AT_entry_pc
DW_AT_enum_class
DW_AT_explicit
DW_AT_extension
DW_AT_external
DW_AT_frame_base
DW_AT_friend
DW_AT_hi_user
DW_AT_high_pc
DW_AT_identifier_case
DW_AT_import
DW_AT_inline
DW_AT_is_optional
DW_AT_language
DW_AT_linkage_name
DW_AT_lo_user
DW_AT_location
DW_AT_low_pc
DW_AT_lower_bound
DW_AT_macro_info
DW_AT_main_subprogram
DW_AT_mutable
DW_AT_name
DW_AT_namelist_item
DW_AT_null
DW_AT_object_pointer
DW_AT_ordering
DW_AT_picture_string
DW_AT_priority
DW_AT_producer
DW_AT_prototyped
DW_AT_pure
DW_AT_ranges
DW_AT_recursive
DW_AT_return_addr
DW_AT_segment
DW_AT_sibling
DW_AT_signature
DW_AT_small
DW_AT_specification
DW_AT_start_scope
DW_AT_static_link
DW_AT_stmt_list
DW_AT_string_length
DW_AT_threads_scaled
DW_AT_trampoline
DW_AT_type
DW_AT_upper_bound
DW_AT_use_UTF8
DW_AT_use_location
DW_AT_variable_parameter
DW_AT_virtuality
DW_AT_visibility
DW_AT_vtable_elem_location
DW_CHILDREN_no
DW_CHILDREN_yes
DW_FORM_addr
DW_FORM_block
DW_FORM_block1
DW_FORM_block2
DW_FORM_block4
DW_FORM_data1
DW_FORM_data2
DW_FORM_data4
DW_FORM_data8
DW_FORM_exprloc
DW_FORM_flag
DW_FORM_flag_present
DW_FORM_indirect
DW_FORM_null
DW_FORM_ref1
DW_FORM_ref2
DW_FORM_ref4
DW_FORM_ref8
DW_FORM_ref_addr
DW_FORM_ref_sig8
DW_FORM_ref_udata
DW_FORM_sdata
DW_FORM_sec_offset
DW_FORM_string
DW_FORM_strp
DW_FORM_udata
DW_LNE_define_file
DW_LNE_end_sequence
DW_LNE_hi_user
DW_LNE_lo_user
DW_LNE_set_address
DW_LNE_set_discriminator
DW_LNS_advance_line
DW_LNS_advance_pc
DW_LNS_const_add_pc
DW_LNS_copy
DW_LNS_fixed_advance_pc
DW_LNS_negate_stmt
DW_LNS_set_basic_block
DW_LNS_set_column
DW_LNS_set_epilogue_begin
DW_LNS_set_file
DW_LNS_set_isa
DW_LNS_set_prologue_end
DW_TAG_access_declaration
DW_TAG_array_type
DW_TAG_base_type
DW_TAG_catch_block
DW_TAG_class_type
DW_TAG_common_block
DW_TAG_common_inclusion
DW_TAG_compile_unit
DW_TAG_condition
DW_TAG_const_type
DW_TAG_constant
DW_TAG_dwarf_procedure
DW_TAG_entry_point
DW_TAG_enumeration_type
DW_TAG_enumerator
DW_TAG_file_type
DW_TAG_formal_parameter
DW_TAG_friend
DW_TAG_hi_user
DW_TAG_imported_declaration
DW_TAG_imported_module
DW_TAG_imported_unit
DW_TAG_inheritance
DW_TAG_inlined_subroutine
DW_TAG_interface_type
DW_TAG_label
DW_TAG_lexical_block
DW_TAG_lo_user
DW_TAG_member
DW_TAG_module
DW_TAG_namelist
DW_TAG_namelist_item
DW_TAG_namespace
DW_TAG_null
DW_TAG_packed_type
DW_TAG_partial_unit
DW_TAG_pointer_type
DW_TAG_ptr_to_member_type
DW_TAG_reference_type
DW_TAG_restrict_type
DW_TAG_rvalue_reference_type
DW_TAG_set_type
DW_TAG_shared_type
DW_TAG_string_type
DW_TAG_structure_type
DW_TAG_subprogram
DW_TAG_subrange_type
DW_TAG_subroutine_type
DW_TAG_template_alias
DW_TAG_template_type_parameter
DW_TAG_template_value_parameter
DW_TAG_thrown_type
DW_TAG_try_block
DW_TAG_type_unit
DW_TAG_typedef
DW_TAG_union_type
DW_TAG_unspecified_parameters
DW_TAG_unspecified_type
DW_TAG_variable
DW_TAG_variant
DW_TAG_variant_part
DW_TAG_volatile_type
DW_TAG_with_stmt

Traits

Endianity

A trait describing the endianity of some buffer.

Type Definitions

ArangeEntryIter

An iterator over the aranges from a .debug_aranges section.

DebugAranges

The DebugAranges struct represents the DWARF address range information found in the .debug_aranges section.

DebugPubNames

The DebugPubNames struct represents the DWARF public names information found in the .debug_pubnames section.

DebugPubTypes

The DebugPubTypes struct represents the DWARF public types information found in the .debug_types section.

ParseResult

The result of a parse.

PubNamesEntryIter

An iterator over the pubnames from a .debug_pubnames section.

PubTypesEntryIter

An iterator over the pubtypes from a .debug_pubtypes section.