You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
750 lines
28 KiB
750 lines
28 KiB
#define PF_X (1 << 0) |
|
#define PF_W (1 << 1) |
|
#define PF_R (1 << 2) |
|
|
|
enum elf_abi { |
|
SYSTEM_V = 0x00, |
|
HP_UX = 0x01, |
|
NETBSD = 0x02, |
|
LINUX = 0x03, |
|
GNU_HURD = 0x04, |
|
SOLARIS = 0x06, |
|
AIX = 0x07, |
|
IRIX = 0x08, |
|
FREEBSD = 0x09, |
|
TRU64 = 0x0A, |
|
NOVELL_MODESTO = 0x0B, |
|
OPENBSD = 0x0D, |
|
OPENVMS = 0x0E, |
|
NONTSTOP_KERNEL = 0x0E, |
|
AROS = 0x0F, |
|
FENIX_OS = 0x10, |
|
CLOUDABI = 0x11, |
|
STRATUS_TECHNOLOGIES_OPENVOS = 0x12 |
|
}; |
|
|
|
enum elf_file_type { |
|
ET_NONE = 0x00, |
|
ET_REL = 0x01, |
|
ET_EXEC = 0x02, |
|
ET_DYN = 0x03, |
|
ET_CORE = 0x04, |
|
ET_LOOS = 0xFE00, |
|
ET_HIOS = 0xFEFF, |
|
ET_LOPROC = 0xFF00, |
|
ET_HIPROC = 0xFFFF |
|
}; |
|
|
|
enum elf_isa { |
|
NO_SPECIFIC_INSTRUCTION_SET = 0x00, |
|
ATNT_WE_32100 = 0x01, |
|
SPARC = 0x02, |
|
X86 = 0x03, |
|
MOTOROLA_68000 = 0x04, |
|
MOTOROLA_88000 = 0x05, |
|
INTEL_MCU = 0x06, |
|
INTEL_80860 = 0x07, |
|
MIPS = 0x08, |
|
IBM_SYSTEM_370 = 0x09, |
|
MIPS_RS3000_LITTLE_ENDIAN = 0x0A, |
|
HEWLETT_PACKARD_PA_RISC = 0x0E, |
|
INTEL_80960 = 0x13, |
|
POWERPC = 0x14, |
|
POWERPC_64 = 0x15, |
|
S390_S390X = 0x16, |
|
ARM = 0x28, |
|
SUPERH = 0x2A, |
|
IA_64 = 0x32, |
|
AMD64 = 0x3E, |
|
TMS320C6000_FAMILY = 0x8C, |
|
ARM_64 = 0xB7, |
|
RISC_V = 0xF3, |
|
BERKELEY_PACKET_FILTER = 0xF7, |
|
WDC_65C816 = 0x10 |
|
}; |
|
|
|
enum elf_section_type { |
|
SHT_NULL = 0, // No associated section (inactive entry). |
|
SHT_PROGBITS = 1, // Program-defined contents. |
|
SHT_SYMTAB = 2, // Symbol table. |
|
SHT_STRTAB = 3, // String table. |
|
SHT_RELA = 4, // Relocation entries; explicit addends. |
|
SHT_HASH = 5, // Symbol hash table. |
|
SHT_DYNAMIC = 6, // Information for dynamic linking. |
|
SHT_NOTE = 7, // Information about the file. |
|
SHT_NOBITS = 8, // Data occupies no space in the file. |
|
SHT_REL = 9, // Relocation entries; no explicit addends. |
|
SHT_SHLIB = 10, // Reserved. |
|
SHT_DYNSYM = 11, // Symbol table. |
|
SHT_INIT_ARRAY = 14, // Pointers to initialization functions. |
|
SHT_FINI_ARRAY = 15, // Pointers to termination functions. |
|
SHT_PREINIT_ARRAY = 16, // Pointers to pre-init functions. |
|
SHT_GROUP = 17, // Section group. |
|
SHT_SYMTAB_SHNDX = 18, // Indices for SHN_XINDEX entries. |
|
|
|
SHT_RELR = 19, // Relocation entries; only offsets. |
|
SHT_LOOS = 0x60000000, // Lowest operating system-specific type. |
|
|
|
SHT_HIOS = 0x6fffffff, // Highest operating system-specific type. |
|
SHT_LOPROC = 0x70000000, // Lowest processor arch-specific type. |
|
SHT_HEX_ORDERED = 0x70000000, |
|
SHT_X86_64_UNWIND = 0x70000001, // Unwind information |
|
|
|
SHT_HIPROC = 0x7fffffff, // Highest processor arch-specific type. |
|
SHT_LOUSER = 0x80000000, // Lowest type reserved for applications. |
|
SHT_HIUSER = 0xffffffff // Highest type reserved for applications. |
|
}; |
|
|
|
enum dwarf_die_tag { |
|
DW_TAG_array_type = 0x01, |
|
DW_TAG_class_type = 0x02, |
|
DW_TAG_entry_point = 0x03, |
|
DW_TAG_enumeration_type = 0x04, |
|
DW_TAG_formal_parameter = 0x05, |
|
DW_TAG_imported_declaration = 0x08, |
|
DW_TAG_label = 0x0a, |
|
DW_TAG_lexical_block = 0x0b, |
|
DW_TAG_member = 0x0d, |
|
DW_TAG_pointer_type = 0x0f, |
|
DW_TAG_reference_type = 0x10, |
|
DW_TAG_compile_unit = 0x11, |
|
DW_TAG_string_type = 0x12, |
|
DW_TAG_structure_type = 0x13, |
|
DW_TAG_subroutine_type = 0x15, |
|
DW_TAG_typedef = 0x16, |
|
DW_TAG_union_type = 0x17, |
|
DW_TAG_unspecified_parameters = 0x18, |
|
DW_TAG_variant = 0x19, |
|
DW_TAG_common_block = 0x1a, |
|
DW_TAG_common_inclusion = 0x1b, |
|
DW_TAG_inheritance = 0x1c, |
|
DW_TAG_inlined_subroutine = 0x1d, |
|
DW_TAG_module = 0x1e, |
|
DW_TAG_ptr_to_member_type = 0x1f, |
|
DW_TAG_set_type = 0x20, |
|
DW_TAG_subrange_type = 0x21, |
|
DW_TAG_with_stmt = 0x22, |
|
DW_TAG_access_declaration = 0x23, |
|
DW_TAG_base_type = 0x24, |
|
DW_TAG_catch_block = 0x25, |
|
DW_TAG_const_type = 0x26, |
|
DW_TAG_constant = 0x27, |
|
DW_TAG_enumerator = 0x28, |
|
DW_TAG_file_type = 0x29, |
|
DW_TAG_friend = 0x2a, |
|
DW_TAG_namelist = 0x2b, |
|
DW_TAG_namelist_item = 0x2c, |
|
DW_TAG_namelist_items = 0x2c, |
|
DW_TAG_packed_type = 0x2d, |
|
DW_TAG_subprogram = 0x2e, |
|
DW_TAG_thrown_type = 0x31, |
|
DW_TAG_try_block = 0x32, |
|
DW_TAG_variant_part = 0x33, |
|
DW_TAG_variable = 0x34, |
|
DW_TAG_volatile_type = 0x35, |
|
DW_TAG_lo_user = 0x4080, |
|
DW_TAG_MIPS_loop = 0x4081, |
|
DW_TAG_hi_user = 0xffff |
|
}; |
|
|
|
enum dwarf_die_attribute { |
|
DW_AT_sibling = 0x01, |
|
DW_AT_location = 0x02, |
|
DW_AT_name = 0x03, |
|
DW_AT_ordering = 0x09, |
|
DW_AT_subscr_data = 0x0a, |
|
DW_AT_byte_size = 0x0b, |
|
DW_AT_bit_offset = 0x0c, |
|
DW_AT_bit_size = 0x0d, |
|
DW_AT_element_list = 0x0f, |
|
DW_AT_stmt_list = 0x10, |
|
DW_AT_low_pc = 0x11, |
|
DW_AT_high_pc = 0x12, |
|
DW_AT_language = 0x13, |
|
DW_AT_member = 0x14, |
|
DW_AT_discr = 0x15, |
|
DW_AT_discr_value = 0x16, |
|
DW_AT_visibility = 0x17, |
|
DW_AT_import = 0x18, |
|
DW_AT_string_length = 0x19, |
|
DW_AT_common_reference = 0x1a, |
|
DW_AT_comp_dir = 0x1b, |
|
DW_AT_const_value = 0x1c, |
|
DW_AT_containing_type = 0x1d, |
|
DW_AT_default_value = 0x1e, |
|
DW_AT_inline = 0x20, |
|
DW_AT_is_optional = 0x21, |
|
DW_AT_lower_bound = 0x22, |
|
DW_AT_producer = 0x25, |
|
DW_AT_prototyped = 0x27, |
|
DW_AT_return_addr = 0x2a, |
|
DW_AT_start_scope = 0x2c, |
|
DW_AT_upper_bound = 0x2f, |
|
DW_AT_abstract_origin = 0x31, |
|
DW_AT_accessibility = 0x32, |
|
DW_AT_address_class = 0x33, |
|
DW_AT_artificial = 0x34, |
|
DW_AT_base_types = 0x35, |
|
DW_AT_calling_convention = 0x36, |
|
DW_AT_count = 0x37, |
|
DW_AT_data_member_location = 0x38, |
|
DW_AT_decl_column = 0x39, |
|
DW_AT_decl_file = 0x3a, |
|
DW_AT_decl_line = 0x3b, |
|
DW_AT_declaration = 0x3c, |
|
DW_AT_encoding = 0x3e, |
|
DW_AT_external = 0x3f, |
|
DW_AT_frame_base = 0x40, |
|
DW_AT_friend = 0x41, |
|
DW_AT_identifier_case = 0x42, |
|
DW_AT_macro_info = 0x43, |
|
DW_AT_namelist_item = 0x44, |
|
DW_AT_priority = 0x45, |
|
DW_AT_segment = 0x46, |
|
DW_AT_specification = 0x47, |
|
DW_AT_static_link = 0x48, |
|
DW_AT_type = 0x49, |
|
DW_AT_use_location = 0x4a, |
|
DW_AT_variable_parameter = 0x4b, |
|
DW_AT_virtuality = 0x4c, |
|
DW_AT_vtable_elem_location = 0x4d, |
|
DW_AT_signature = 0x69, |
|
DW_AT_main_subprogram = 0x6a, |
|
DW_AT_data_bit_offset = 0x6b, |
|
DW_AT_const_expr = 0x6c, |
|
DW_AT_enum_class = 0x6d, |
|
DW_AT_linkage_name = 0x6e, |
|
DW_AT_string_length_bit_size = 0x6f, |
|
DW_AT_string_length_byte_size = 0x70, |
|
DW_AT_rank = 0x71, |
|
DW_AT_str_offsets_base = 0x72, |
|
DW_AT_addr_base = 0x73, |
|
DW_AT_rnglists_base = 0x74, |
|
DW_AT_dwo_id = 0x75, |
|
DW_AT_dwo_name = 0x76, |
|
DW_AT_reference = 0x77, |
|
DW_AT_rvalue_reference = 0x78, |
|
DW_AT_macros = 0x79, |
|
DW_AT_call_all_calls = 0x7a, |
|
DW_AT_call_all_source_calls = 0x7b, |
|
DW_AT_call_all_tail_calls = 0x7c, |
|
DW_AT_call_return_pc = 0x7d, |
|
DW_AT_call_value = 0x7e, |
|
DW_AT_call_origin = 0x7f, |
|
DW_AT_call_parameter = 0x80, |
|
DW_AT_call_pc = 0x81, |
|
DW_AT_call_tail_call = 0x82, |
|
DW_AT_call_target = 0x83, |
|
DW_AT_call_target_clobbered = 0x84, |
|
DW_AT_call_data_location = 0x85, |
|
DW_AT_call_data_value = 0x86, |
|
DW_AT_noreturn = 0x87, |
|
DW_AT_alignment = 0x88, |
|
DW_AT_export_symbols = 0x89, |
|
DW_AT_deleted = 0x8a, |
|
DW_AT_defaulted = 0x8b, |
|
DW_AT_loclists_base = 0x8c |
|
}; |
|
|
|
enum dwarf_attribute_form { |
|
DW_FORM_addr = 0x01, |
|
DW_FORM_block2 = 0x03, |
|
DW_FORM_block4 = 0x04, |
|
DW_FORM_data2 = 0x05, |
|
DW_FORM_data4 = 0x06, |
|
DW_FORM_data8 = 0x07, |
|
DW_FORM_string = 0x08, |
|
DW_FORM_block = 0x09, |
|
DW_FORM_block1 = 0x0a, |
|
DW_FORM_data1 = 0x0b, |
|
DW_FORM_flag = 0x0c, |
|
DW_FORM_sdata = 0x0d, |
|
DW_FORM_strp = 0x0e, |
|
DW_FORM_udata = 0x0f, |
|
DW_FORM_ref_addr = 0x10, |
|
DW_FORM_ref1 = 0x11, |
|
DW_FORM_ref2 = 0x12, |
|
DW_FORM_ref4 = 0x13, |
|
DW_FORM_ref8 = 0x14, |
|
DW_FORM_ref_udata = 0x15, |
|
DW_FORM_indirect = 0x16, |
|
DW_FORM_sec_offset = 0x17, |
|
DW_FORM_exprloc = 0x18, |
|
DW_FORM_flag_present = 0x19, |
|
DW_FORM_strx = 0x1a, |
|
DW_FORM_addrx = 0x1b, |
|
DW_FORM_ref_sup4 = 0x1c, |
|
DW_FORM_strp_sup = 0x1d, |
|
DW_FORM_data16 = 0x1e, |
|
DW_FORM_line_strp = 0x1f, |
|
DW_FORM_ref_sig8 = 0x20, |
|
DW_FORM_implicit_const = 0x21, |
|
DW_FORM_loclistx = 0x22, |
|
DW_FORM_rnglistx = 0x23, |
|
DW_FORM_ref_sup8 = 0x24, |
|
DW_FORM_strx1 = 0x25, |
|
DW_FORM_strx2 = 0x26, |
|
DW_FORM_strx3 = 0x27, |
|
DW_FORM_strx4 = 0x28, |
|
DW_FORM_addrx1 = 0x29, |
|
DW_FORM_addrx2 = 0x2a, |
|
DW_FORM_addrx3 = 0x2b, |
|
DW_FORM_addrx4 = 0x2c |
|
}; |
|
|
|
enum dwarf_lnp_opcode { |
|
DW_LNS_copy = 0x01, |
|
DW_LNS_advance_pc = 0x02, |
|
DW_LNS_advance_line = 0x03, |
|
DW_LNS_set_file = 0x04, |
|
DW_LNS_set_column = 0x05, |
|
DW_LNS_negate_stmt = 0x06, |
|
DW_LNS_set_basic_block = 0x07, |
|
DW_LNS_const_add_pc = 0x08, |
|
DW_LNS_fixed_advance_pc = 0x09, |
|
DW_LNS_set_prologue_end = 0x0a, |
|
DW_LNS_set_epilogue_begin = 0x0b, |
|
DW_LNS_set_isa = 0x0c, |
|
}; |
|
|
|
enum dwarf_lnp_opcode_extended { |
|
DW_LNE_end_sequence = 0x01, |
|
DW_LNE_set_address = 0x02, |
|
DW_LNE_define_file = 0x03, |
|
DW_LNE_set_discriminator = 0x04, |
|
}; |
|
|
|
enum dwarf_expression_op { |
|
DW_OP_addr = 0x03, |
|
DW_OP_deref = 0x06, |
|
DW_OP_const1u = 0x08, |
|
DW_OP_const1s = 0x09, |
|
DW_OP_const2u = 0x0a, |
|
DW_OP_const2s = 0x0b, |
|
DW_OP_const4u = 0x0c, |
|
DW_OP_const4s = 0x0d, |
|
DW_OP_const8u = 0x0e, |
|
DW_OP_const8s = 0x0f, |
|
DW_OP_constu = 0x10, |
|
DW_OP_consts = 0x11, |
|
DW_OP_dup = 0x12, |
|
DW_OP_drop = 0x13, |
|
DW_OP_over = 0x14, |
|
DW_OP_pick = 0x15, |
|
DW_OP_swap = 0x16, |
|
DW_OP_rot = 0x17, |
|
DW_OP_xderef = 0x18, |
|
DW_OP_abs = 0x19, |
|
DW_OP_and = 0x1a, |
|
DW_OP_div = 0x1b, |
|
DW_OP_minus = 0x1c, |
|
DW_OP_mod = 0x1d, |
|
DW_OP_mul = 0x1e, |
|
DW_OP_neg = 0x1f, |
|
DW_OP_not = 0x20, |
|
DW_OP_or = 0x21, |
|
DW_OP_plus = 0x22, |
|
DW_OP_plus_uconst = 0x23, |
|
DW_OP_shl = 0x24, |
|
DW_OP_shr = 0x25, |
|
DW_OP_shra = 0x26, |
|
DW_OP_xor = 0x27, |
|
DW_OP_skip = 0x2f, |
|
DW_OP_bra = 0x28, |
|
DW_OP_eq = 0x29, |
|
DW_OP_ge = 0x2a, |
|
DW_OP_gt = 0x2b, |
|
DW_OP_le = 0x2c, |
|
DW_OP_lt = 0x2d, |
|
DW_OP_ne = 0x2e, |
|
|
|
DW_OP_lit0 = 0x30, |
|
DW_OP_lit1 = 0x31, |
|
DW_OP_lit2 = 0x32, |
|
DW_OP_lit3 = 0x33, |
|
DW_OP_lit4 = 0x34, |
|
DW_OP_lit5 = 0x35, |
|
DW_OP_lit6 = 0x36, |
|
DW_OP_lit7 = 0x37, |
|
DW_OP_lit8 = 0x38, |
|
DW_OP_lit9 = 0x39, |
|
DW_OP_lit10 = 0x3a, |
|
DW_OP_lit11 = 0x3b, |
|
DW_OP_lit12 = 0x3c, |
|
DW_OP_lit13 = 0x3d, |
|
DW_OP_lit14 = 0x3e, |
|
DW_OP_lit15 = 0x3f, |
|
DW_OP_lit16 = 0x40, |
|
DW_OP_lit17 = 0x41, |
|
DW_OP_lit18 = 0x42, |
|
DW_OP_lit19 = 0x43, |
|
DW_OP_lit20 = 0x44, |
|
DW_OP_lit21 = 0x45, |
|
DW_OP_lit22 = 0x46, |
|
DW_OP_lit23 = 0x47, |
|
DW_OP_lit24 = 0x48, |
|
DW_OP_lit25 = 0x49, |
|
DW_OP_lit26 = 0x4a, |
|
DW_OP_lit27 = 0x4b, |
|
DW_OP_lit28 = 0x4c, |
|
DW_OP_lit29 = 0x4d, |
|
DW_OP_lit30 = 0x4e, |
|
DW_OP_lit31 = 0x4f, |
|
|
|
DW_OP_reg0 = 0x50, |
|
DW_OP_reg1 = 0x51, |
|
DW_OP_reg2 = 0x52, |
|
DW_OP_reg3 = 0x53, |
|
DW_OP_reg4 = 0x54, |
|
DW_OP_reg5 = 0x55, |
|
DW_OP_reg6 = 0x56, |
|
DW_OP_reg7 = 0x57, |
|
DW_OP_reg8 = 0x58, |
|
DW_OP_reg9 = 0x59, |
|
DW_OP_reg10 = 0x5a, |
|
DW_OP_reg11 = 0x5b, |
|
DW_OP_reg12 = 0x5c, |
|
DW_OP_reg13 = 0x5d, |
|
DW_OP_reg14 = 0x5e, |
|
DW_OP_reg15 = 0x5f, |
|
DW_OP_reg16 = 0x60, |
|
DW_OP_reg17 = 0x61, |
|
DW_OP_reg18 = 0x62, |
|
DW_OP_reg19 = 0x63, |
|
DW_OP_reg20 = 0x64, |
|
DW_OP_reg21 = 0x65, |
|
DW_OP_reg22 = 0x66, |
|
DW_OP_reg23 = 0x67, |
|
DW_OP_reg24 = 0x68, |
|
DW_OP_reg25 = 0x69, |
|
DW_OP_reg26 = 0x6a, |
|
DW_OP_reg27 = 0x6b, |
|
DW_OP_reg28 = 0x6c, |
|
DW_OP_reg29 = 0x6d, |
|
DW_OP_reg30 = 0x6e, |
|
DW_OP_reg31 = 0x6f, |
|
|
|
DW_OP_breg0 = 0x70, |
|
DW_OP_breg1 = 0x71, |
|
DW_OP_breg2 = 0x72, |
|
DW_OP_breg3 = 0x73, |
|
DW_OP_breg4 = 0x74, |
|
DW_OP_breg5 = 0x75, |
|
DW_OP_breg6 = 0x76, |
|
DW_OP_breg7 = 0x77, |
|
DW_OP_breg8 = 0x78, |
|
DW_OP_breg9 = 0x79, |
|
DW_OP_breg10 = 0x7a, |
|
DW_OP_breg11 = 0x7b, |
|
DW_OP_breg12 = 0x7c, |
|
DW_OP_breg13 = 0x7d, |
|
DW_OP_breg14 = 0x7e, |
|
DW_OP_breg15 = 0x7f, |
|
DW_OP_breg16 = 0x80, |
|
DW_OP_breg17 = 0x81, |
|
DW_OP_breg18 = 0x82, |
|
DW_OP_breg19 = 0x83, |
|
DW_OP_breg20 = 0x84, |
|
DW_OP_breg21 = 0x85, |
|
DW_OP_breg22 = 0x86, |
|
DW_OP_breg23 = 0x87, |
|
DW_OP_breg24 = 0x88, |
|
DW_OP_breg25 = 0x89, |
|
DW_OP_breg26 = 0x8a, |
|
DW_OP_breg27 = 0x8b, |
|
DW_OP_breg28 = 0x8c, |
|
DW_OP_breg29 = 0x8d, |
|
DW_OP_breg30 = 0x8e, |
|
DW_OP_breg31 = 0x8f, |
|
|
|
DW_OP_regx = 0x90, |
|
DW_OP_fbreg = 0x91, |
|
DW_OP_bregx = 0x92, |
|
DW_OP_piece = 0x93, |
|
DW_OP_deref_size = 0x94, |
|
DW_OP_xderef_size = 0x95, |
|
DW_OP_nop = 0x96, |
|
DW_OP_push_object_address = 0x97, |
|
DW_OP_call2 = 0x98, |
|
DW_OP_call4 = 0x99, |
|
DW_OP_call_ref = 0x9a, |
|
DW_OP_form_tls_address = 0x9b, |
|
DW_OP_call_frame_cfa = 0x9c, |
|
DW_OP_bit_piece = 0x9d, |
|
DW_OP_implicit_value = 0x9e, |
|
DW_OP_stack_value = 0x9f, |
|
|
|
DW_OP_lo_user = 0xe0, |
|
DW_OP_hi_user = 0xff |
|
}; |
|
|
|
#pragma pack(1) |
|
struct elf_header_x64 { |
|
char magic[4]; |
|
u8 bitness; |
|
u8 endianness; |
|
u8 ei_version; |
|
u8 abi; |
|
u8 abi_version; |
|
u8 pad[7]; |
|
u16 file_type; |
|
u16 isa; |
|
u32 version; |
|
u64 entry_point_offset; |
|
u64 header_table_offset; |
|
u64 section_table_offset; |
|
u32 flags; |
|
u16 this_header_size; |
|
u16 header_table_entry_size; |
|
u16 header_table_entry_count; |
|
u16 section_table_entry_size; |
|
u16 section_table_entry_count; |
|
u16 section_names_table_index; |
|
}; |
|
|
|
#pragma pack(1) |
|
struct elf_header_table_entry_x64 { |
|
u32 type; |
|
u32 flags; |
|
u64 segment_offset; |
|
u64 virtual_address; |
|
u64 reserved_physical_address; |
|
u64 segment_file_size; |
|
u64 segment_memory_size; |
|
u64 alignment; |
|
}; |
|
|
|
#pragma pack(1) |
|
struct elf_section_table_entry_x64 { |
|
u32 name_offset; |
|
u32 type; |
|
u64 flags; |
|
u64 virtual_address; |
|
u64 offset_in_file; |
|
u64 size; |
|
u32 link; |
|
u32 info; |
|
u64 alignment; |
|
u64 entry_size; |
|
}; |
|
|
|
#pragma pack(1) |
|
struct dwarf_debug_info_header_x64 { |
|
u32 pad; |
|
u64 length; |
|
u16 version; |
|
u64 debug_abbrev_offset; |
|
u8 adress_size; |
|
}; |
|
|
|
#pragma pack(1) |
|
struct dwarf_debug_info_header_x32 { |
|
u32 length; |
|
u16 version; |
|
u32 debug_abbrev_offset; |
|
u8 address_size; |
|
}; |
|
|
|
struct dwarf_debug_line_file_info { |
|
char *name; |
|
u32 directory_index; |
|
u32 time_modified; |
|
u32 file_size; |
|
}; |
|
|
|
#pragma pack(1) |
|
struct dwarf_debug_line_header_v3_x32 { |
|
u32 length; |
|
u16 version; |
|
u32 header_length; |
|
u8 minimum_instruction_length; |
|
u8 default_is_stmt; |
|
s8 line_base; |
|
u8 line_range; |
|
u8 opcode_base; |
|
u8 *standard_opcode_lengths; |
|
u8 ndirs; |
|
u8 nfiles; |
|
char *include_directories; |
|
struct dwarf_debug_line_file_info *files; |
|
}; |
|
|
|
struct dwarf_line_number_state { |
|
u64 pc; |
|
u32 file; |
|
u32 line; |
|
u32 column; |
|
|
|
u8 is_stmt; |
|
u8 basic_block; |
|
u8 end_sequence; |
|
u8 prologue_end; |
|
u8 epilogue_begin; |
|
|
|
u32 isa; |
|
u32 discriminator; |
|
}; |
|
|
|
|
|
static char * |
|
attribute_to_str(enum dwarf_die_tag attr) |
|
{ |
|
switch (attr) { |
|
case DW_AT_sibling: { return "DW_AT_sibling"; } |
|
case DW_AT_location: { return "DW_AT_location"; } |
|
case DW_AT_name: { return "DW_AT_name"; } |
|
case DW_AT_ordering: { return "DW_AT_ordering"; } |
|
case DW_AT_subscr_data: { return "DW_AT_subscr_data"; } |
|
case DW_AT_byte_size: { return "DW_AT_byte_size"; } |
|
case DW_AT_bit_offset: { return "DW_AT_bit_offset"; } |
|
case DW_AT_bit_size: { return "DW_AT_bit_size"; } |
|
case DW_AT_element_list: { return "DW_AT_element_list"; } |
|
case DW_AT_stmt_list: { return "DW_AT_stmt_list"; } |
|
case DW_AT_low_pc: { return "DW_AT_low_pc"; } |
|
case DW_AT_high_pc: { return "DW_AT_high_pc"; } |
|
case DW_AT_language: { return "DW_AT_language"; } |
|
case DW_AT_member: { return "DW_AT_member"; } |
|
case DW_AT_discr: { return "DW_AT_discr"; } |
|
case DW_AT_discr_value: { return "DW_AT_discr_value"; } |
|
case DW_AT_visibility: { return "DW_AT_visibility"; } |
|
case DW_AT_import: { return "DW_AT_import"; } |
|
case DW_AT_string_length: { return "DW_AT_string_length"; } |
|
case DW_AT_common_reference: { return "DW_AT_common_reference"; } |
|
case DW_AT_comp_dir: { return "DW_AT_comp_dir"; } |
|
case DW_AT_const_value: { return "DW_AT_const_value"; } |
|
case DW_AT_containing_type: { return "DW_AT_containing_type"; } |
|
case DW_AT_default_value: { return "DW_AT_default_value"; } |
|
case DW_AT_inline: { return "DW_AT_inline"; } |
|
case DW_AT_is_optional: { return "DW_AT_is_optional"; } |
|
case DW_AT_lower_bound: { return "DW_AT_lower_bound"; } |
|
case DW_AT_producer: { return "DW_AT_producer"; } |
|
case DW_AT_prototyped: { return "DW_AT_prototyped"; } |
|
case DW_AT_return_addr: { return "DW_AT_return_addr"; } |
|
case DW_AT_start_scope: { return "DW_AT_start_scope"; } |
|
case DW_AT_upper_bound: { return "DW_AT_upper_bound"; } |
|
case DW_AT_abstract_origin: { return "DW_AT_abstract_origin"; } |
|
case DW_AT_accessibility: { return "DW_AT_accessibility"; } |
|
case DW_AT_address_class: { return "DW_AT_address_class"; } |
|
case DW_AT_artificial: { return "DW_AT_artificial"; } |
|
case DW_AT_base_types: { return "DW_AT_base_types"; } |
|
case DW_AT_calling_convention: { return "DW_AT_calling_convention"; } |
|
case DW_AT_count: { return "DW_AT_count"; } |
|
case DW_AT_data_member_location: { return "DW_AT_data_member_location"; } |
|
case DW_AT_decl_column: { return "DW_AT_decl_column"; } |
|
case DW_AT_decl_file: { return "DW_AT_decl_file"; } |
|
case DW_AT_decl_line: { return "DW_AT_decl_line"; } |
|
case DW_AT_declaration: { return "DW_AT_declaration"; } |
|
case DW_AT_encoding: { return "DW_AT_encoding"; } |
|
case DW_AT_external: { return "DW_AT_external"; } |
|
case DW_AT_frame_base: { return "DW_AT_frame_base"; } |
|
case DW_AT_friend: { return "DW_AT_friend"; } |
|
case DW_AT_identifier_case: { return "DW_AT_identifier_case"; } |
|
case DW_AT_macro_info: { return "DW_AT_macro_info"; } |
|
case DW_AT_namelist_item: { return "DW_AT_namelist_item"; } |
|
case DW_AT_priority: { return "DW_AT_priority"; } |
|
case DW_AT_segment: { return "DW_AT_segment"; } |
|
case DW_AT_specification: { return "DW_AT_specification"; } |
|
case DW_AT_static_link: { return "DW_AT_static_link"; } |
|
case DW_AT_type: { return "DW_AT_type"; } |
|
case DW_AT_use_location: { return "DW_AT_use_location"; } |
|
case DW_AT_variable_parameter: { return "DW_AT_variable_parameter"; } |
|
case DW_AT_virtuality: { return "DW_AT_virtuality"; } |
|
case DW_AT_vtable_elem_location: { return "DW_AT_vtable_elem_location"; } |
|
case DW_AT_signature: { return "DW_AT_signature"; } |
|
case DW_AT_main_subprogram: { return "DW_AT_main_subprogram"; } |
|
case DW_AT_data_bit_offset: { return "DW_AT_data_bit_offset"; } |
|
case DW_AT_const_expr: { return "DW_AT_const_expr"; } |
|
case DW_AT_enum_class: { return "DW_AT_enum_class"; } |
|
case DW_AT_linkage_name: { return "DW_AT_linkage_name"; } |
|
case DW_AT_string_length_bit_size: { return "DW_AT_string_length_bit_size"; } |
|
case DW_AT_string_length_byte_size: { return "DW_AT_string_length_byte_size"; } |
|
case DW_AT_rank: { return "DW_AT_rank"; } |
|
case DW_AT_str_offsets_base: { return "DW_AT_str_offsets_base"; } |
|
case DW_AT_addr_base: { return "DW_AT_addr_base"; } |
|
case DW_AT_rnglists_base: { return "DW_AT_rnglists_base"; } |
|
case DW_AT_dwo_id: { return "DW_AT_dwo_id"; } |
|
case DW_AT_dwo_name: { return "DW_AT_dwo_name"; } |
|
case DW_AT_reference: { return "DW_AT_reference"; } |
|
case DW_AT_rvalue_reference: { return "DW_AT_rvalue_reference"; } |
|
case DW_AT_macros: { return "DW_AT_macros"; } |
|
case DW_AT_call_all_calls: { return "DW_AT_call_all_calls"; } |
|
case DW_AT_call_all_source_calls: { return "DW_AT_call_all_source_calls"; } |
|
case DW_AT_call_all_tail_calls: { return "DW_AT_call_all_tail_calls"; } |
|
case DW_AT_call_return_pc: { return "DW_AT_call_return_pc"; } |
|
case DW_AT_call_value: { return "DW_AT_call_value"; } |
|
case DW_AT_call_origin: { return "DW_AT_call_origin"; } |
|
case DW_AT_call_parameter: { return "DW_AT_call_parameter"; } |
|
case DW_AT_call_pc: { return "DW_AT_call_pc"; } |
|
case DW_AT_call_tail_call: { return "DW_AT_call_tail_call"; } |
|
case DW_AT_call_target: { return "DW_AT_call_target"; } |
|
case DW_AT_call_target_clobbered: { return "DW_AT_call_target_clobbered"; } |
|
case DW_AT_call_data_location: { return "DW_AT_call_data_location"; } |
|
case DW_AT_call_data_value: { return "DW_AT_call_data_value"; } |
|
case DW_AT_noreturn: { return "DW_AT_noreturn"; } |
|
case DW_AT_alignment: { return "DW_AT_alignment"; } |
|
case DW_AT_export_symbols: { return "DW_AT_export_symbols"; } |
|
case DW_AT_deleted: { return "DW_AT_deleted"; } |
|
case DW_AT_defaulted: { return "DW_AT_defaulted"; } |
|
case DW_AT_loclists_base: { return "DW_AT_loclists_base"; } |
|
} |
|
|
|
return(NULL); |
|
} |
|
|
|
static char * |
|
tag_to_str(enum dwarf_die_tag tag) { |
|
switch (tag) { |
|
case DW_TAG_array_type: { return "DW_TAG_array_type"; } |
|
case DW_TAG_class_type: { return "DW_TAG_class_type"; } |
|
case DW_TAG_entry_point: { return "DW_TAG_entry_point"; } |
|
case DW_TAG_enumeration_type: { return "DW_TAG_enumeration_type"; } |
|
case DW_TAG_formal_parameter: { return "DW_TAG_formal_parameter"; } |
|
case DW_TAG_imported_declaration: { return "DW_TAG_imported_declaration"; } |
|
case DW_TAG_label: { return "DW_TAG_label"; } |
|
case DW_TAG_lexical_block: { return "DW_TAG_lexical_block"; } |
|
case DW_TAG_member: { return "DW_TAG_member"; } |
|
case DW_TAG_pointer_type: { return "DW_TAG_pointer_type"; } |
|
case DW_TAG_reference_type: { return "DW_TAG_reference_type"; } |
|
case DW_TAG_compile_unit: { return "DW_TAG_compile_unit"; } |
|
case DW_TAG_string_type: { return "DW_TAG_string_type"; } |
|
case DW_TAG_structure_type: { return "DW_TAG_structure_type"; } |
|
case DW_TAG_subroutine_type: { return "DW_TAG_subroutine_type"; } |
|
case DW_TAG_typedef: { return "DW_TAG_typedef"; } |
|
case DW_TAG_union_type: { return "DW_TAG_union_type"; } |
|
case DW_TAG_unspecified_parameters: { return "DW_TAG_unspecified_parameters"; } |
|
case DW_TAG_variant: { return "DW_TAG_variant"; } |
|
case DW_TAG_common_block: { return "DW_TAG_common_block"; } |
|
case DW_TAG_common_inclusion: { return "DW_TAG_common_inclusion"; } |
|
case DW_TAG_inheritance: { return "DW_TAG_inheritance"; } |
|
case DW_TAG_inlined_subroutine: { return "DW_TAG_inlined_subroutine"; } |
|
case DW_TAG_module: { return "DW_TAG_module"; } |
|
case DW_TAG_ptr_to_member_type: { return "DW_TAG_ptr_to_member_type"; } |
|
case DW_TAG_set_type: { return "DW_TAG_set_type"; } |
|
case DW_TAG_subrange_type: { return "DW_TAG_subrange_type"; } |
|
case DW_TAG_with_stmt: { return "DW_TAG_with_stmt"; } |
|
case DW_TAG_access_declaration: { return "DW_TAG_access_declaration"; } |
|
case DW_TAG_base_type: { return "DW_TAG_base_type"; } |
|
case DW_TAG_catch_block: { return "DW_TAG_catch_block"; } |
|
case DW_TAG_const_type: { return "DW_TAG_const_type"; } |
|
case DW_TAG_constant: { return "DW_TAG_constant"; } |
|
case DW_TAG_enumerator: { return "DW_TAG_enumerator"; } |
|
case DW_TAG_file_type: { return "DW_TAG_file_type"; } |
|
case DW_TAG_friend: { return "DW_TAG_friend"; } |
|
case DW_TAG_namelist: { return "DW_TAG_namelist"; } |
|
case DW_TAG_namelist_item: { return "DW_TAG_namelist_item"; } |
|
case DW_TAG_packed_type: { return "DW_TAG_packed_type"; } |
|
case DW_TAG_subprogram: { return "DW_TAG_subprogram"; } |
|
case DW_TAG_thrown_type: { return "DW_TAG_thrown_type"; } |
|
case DW_TAG_try_block: { return "DW_TAG_try_block"; } |
|
case DW_TAG_variant_part: { return "DW_TAG_variant_part"; } |
|
case DW_TAG_variable: { return "DW_TAG_variable"; } |
|
case DW_TAG_volatile_type: { return "DW_TAG_volatile_type"; } |
|
case DW_TAG_lo_user: { return "DW_TAG_lo_user"; } |
|
case DW_TAG_MIPS_loop: { return "DW_TAG_MIPS_loop"; } |
|
default: { return "unknown tag"; } |
|
} |
|
|
|
assert(0); |
|
|
|
return(NULL); |
|
}
|
|
|