def test_spec_sample_59(self): # Sample in figure 59 of DWARFv3 s = BytesIO() s.write( b'\x02\xb9\x04' + b'\x0b' + b'\x38' + b'\x82' + b'\x73' + b'\x02\x02' + b'\x00\x01\x01') lp = self._make_program_in_stream(s) linetable = lp.get_entries() self.assertEqual(len(linetable), 7) self.assertIs(linetable[0].state, None) # doesn't modify state self.assertEqual(linetable[0].command, DW_LNS_advance_pc) self.assertEqual(linetable[0].args, [0x239]) self.assertLineState(linetable[1].state, address=0x239, line=3) self.assertEqual(linetable[1].command, 0xb) self.assertEqual(linetable[1].args, [2, 0]) self.assertLineState(linetable[2].state, address=0x23c, line=5) self.assertLineState(linetable[3].state, address=0x244, line=6) self.assertLineState(linetable[4].state, address=0x24b, line=7, end_sequence=False) self.assertEqual(linetable[5].command, DW_LNS_advance_pc) self.assertEqual(linetable[5].args, [2]) self.assertLineState(linetable[6].state, address=0x24d, line=7, end_sequence=True)
def test_spec_sample_60(self): # Sample in figure 60 of DWARFv3 s = BytesIO() s.write( b'\x09\x39\x02' + b'\x0b' + b'\x09\x03\x00' + b'\x0b' + b'\x09\x08\x00' + b'\x0a' + b'\x09\x07\x00' + b'\x0a' + b'\x09\x02\x00' + b'\x00\x01\x01') lp = self._make_program_in_stream(s) linetable = lp.get_entries() self.assertEqual(len(linetable), 10) self.assertIs(linetable[0].state, None) # doesn't modify state self.assertEqual(linetable[0].command, DW_LNS_fixed_advance_pc) self.assertEqual(linetable[0].args, [0x239]) self.assertLineState(linetable[1].state, address=0x239, line=3) self.assertLineState(linetable[3].state, address=0x23c, line=5) self.assertLineState(linetable[5].state, address=0x244, line=6) self.assertLineState(linetable[7].state, address=0x24b, line=7, end_sequence=False) self.assertLineState(linetable[9].state, address=0x24d, line=7, end_sequence=True)
def do_relocation(rel_elf): data = rel_elf.get_section_by_name('.text').data() rh = RelocationHandler(rel_elf) stream = BytesIO() stream.write(data) rel = rel_elf.get_section_by_name('.rel.text') rh.apply_section_relocations(stream, rel) return stream.getvalue()
def test_lne_set_discriminator(self): """ Tests the handling of DWARFv4's new DW_LNE_set_discriminator opcode. """ s = BytesIO() s.write( b'\x00\x02\x04\x05' + # DW_LNE_set_discriminator (discriminator=0x05) b'\x01' + # DW_LNS_copy b'\x00\x01\x01' # DW_LNE_end_sequence ) lp = self._make_program_in_stream(s) linetable = lp.get_entries() # We expect two entries, since DW_LNE_set_discriminator does not add # an entry of its own. self.assertEqual(len(linetable), 2) self.assertEqual(linetable[0].command, DW_LNS_copy) self.assertLineState(linetable[0].state, discriminator=0x05) self.assertLineState(linetable[1].state, discriminator=0x00, end_sequence=True)
def _read_dwarf_section(self, section, relocate_dwarf_sections): """ Read the contents of a DWARF section from the stream and return a DebugSectionDescriptor. Apply relocations if asked to. """ # The section data is read into a new stream, for processing section_stream = BytesIO() section_stream.write(section.get_data()) if relocate_dwarf_sections: reloc_handler = RelocationHandler(self) reloc_section = reloc_handler.find_relocations_for_section(section) if reloc_section is not None: reloc_handler.apply_section_relocations(section_stream, reloc_section) return DebugSectionDescriptor( stream=section_stream, name=section.name, global_offset=section.PointerToRawData, size=section.SizeOfRawData, address=section.get_rva_from_offset(0))
def test_spec_sample_d6(self): # D.6 sample in DWARFv3 s = BytesIO() data = (b'' + # first comes the CIE b'\x20\x00\x00\x00' + # length b'\xff\xff\xff\xff' + # CIE_id b'\x03\x00\x04\x7c' + # version, augmentation, caf, daf b'\x08' + # return address b'\x0c\x07\x00' + b'\x08\x00' + b'\x07\x01' + b'\x07\x02' + b'\x07\x03' + b'\x08\x04' + b'\x08\x05' + b'\x08\x06' + b'\x08\x07' + b'\x09\x08\x01' + b'\x00' + # then comes the FDE b'\x28\x00\x00\x00' + # length b'\x00\x00\x00\x00' + # CIE_pointer (to CIE at 0) b'\x44\x33\x22\x11' + # initial_location b'\x54\x00\x00\x00' + # address range b'\x41' + b'\x0e\x0c' + b'\x41' + b'\x88\x01' + b'\x41' + b'\x86\x02' + b'\x41' + b'\x0d\x06' + b'\x41' + b'\x84\x03' + b'\x4b' + b'\xc4' + b'\x41' + b'\xc6' + b'\x0d\x07' + b'\x41' + b'\xc8' + b'\x41' + b'\x0e\x00' + b'\x00\x00' ) s.write(data) structs = DWARFStructs(little_endian=True, dwarf_format=32, address_size=4) cfi = CallFrameInfo(s, len(data), structs) entries = cfi.get_entries() self.assertEqual(len(entries), 2) self.assertIsInstance(entries[0], CIE) self.assertEqual(entries[0]['length'], 32) self.assertEqual(entries[0]['data_alignment_factor'], -4) self.assertEqual(entries[0]['return_address_register'], 8) self.assertEqual(len(entries[0].instructions), 11) self.assertInstruction(entries[0].instructions[0], 'DW_CFA_def_cfa', [7, 0]) self.assertInstruction(entries[0].instructions[8], 'DW_CFA_same_value', [7]) self.assertInstruction(entries[0].instructions[9], 'DW_CFA_register', [8, 1]) self.assertTrue(isinstance(entries[1], FDE)) self.assertEqual(entries[1]['length'], 40) self.assertEqual(entries[1]['CIE_pointer'], 0) self.assertEqual(entries[1]['address_range'], 84) self.assertIs(entries[1].cie, entries[0]) self.assertEqual(len(entries[1].instructions), 21) self.assertInstruction(entries[1].instructions[0], 'DW_CFA_advance_loc', [1]) self.assertInstruction(entries[1].instructions[1], 'DW_CFA_def_cfa_offset', [12]) self.assertInstruction(entries[1].instructions[9], 'DW_CFA_offset', [4, 3]) self.assertInstruction(entries[1].instructions[18], 'DW_CFA_def_cfa_offset', [0]) self.assertInstruction(entries[1].instructions[20], 'DW_CFA_nop', []) # Now let's decode it... decoded_CIE = entries[0].get_decoded() self.assertEqual(decoded_CIE.reg_order, list(range(9))) self.assertEqual(len(decoded_CIE.table), 1) self.assertEqual(decoded_CIE.table[0]['cfa'].reg, 7) self.assertEqual(decoded_CIE.table[0]['pc'], 0) self.assertEqual(decoded_CIE.table[0]['cfa'].offset, 0) self.assertEqual(decoded_CIE.table[0][4].type, RegisterRule.SAME_VALUE) self.assertEqual(decoded_CIE.table[0][8].type, RegisterRule.REGISTER) self.assertEqual(decoded_CIE.table[0][8].arg, 1) decoded_FDE = entries[1].get_decoded() self.assertEqual(decoded_FDE.reg_order, list(range(9))) self.assertEqual(decoded_FDE.table[0]['cfa'].reg, 7) self.assertEqual(decoded_FDE.table[0]['cfa'].offset, 0) self.assertEqual(decoded_FDE.table[0]['pc'], 0x11223344) self.assertEqual(decoded_FDE.table[0][8].type, RegisterRule.REGISTER) self.assertEqual(decoded_FDE.table[0][8].arg, 1) self.assertEqual(decoded_FDE.table[1]['cfa'].reg, 7) self.assertEqual(decoded_FDE.table[1]['cfa'].offset, 12) self.assertEqual(decoded_FDE.table[2][8].type, RegisterRule.OFFSET) self.assertEqual(decoded_FDE.table[2][8].arg, -4) self.assertEqual(decoded_FDE.table[2][4].type, RegisterRule.SAME_VALUE) self.assertEqual(decoded_FDE.table[5]['pc'], 0x11223344 + 20) self.assertEqual(decoded_FDE.table[5][4].type, RegisterRule.OFFSET) self.assertEqual(decoded_FDE.table[5][4].arg, -12) self.assertEqual(decoded_FDE.table[6]['pc'], 0x11223344 + 64) self.assertEqual(decoded_FDE.table[9]['pc'], 0x11223344 + 76)
def test_spec_sample_d6(self): # D.6 sample in DWARFv3 s = BytesIO() data = ( b'' + # first comes the CIE b'\x20\x00\x00\x00' + # length b'\xff\xff\xff\xff' + # CIE_id b'\x03\x00\x04\x7c' + # version, augmentation, caf, daf b'\x08' + # return address b'\x0c\x07\x00' + b'\x08\x00' + b'\x07\x01' + b'\x07\x02' + b'\x07\x03' + b'\x08\x04' + b'\x08\x05' + b'\x08\x06' + b'\x08\x07' + b'\x09\x08\x01' + b'\x00' + # then comes the FDE b'\x28\x00\x00\x00' + # length b'\x00\x00\x00\x00' + # CIE_pointer (to CIE at 0) b'\x44\x33\x22\x11' + # initial_location b'\x54\x00\x00\x00' + # address range b'\x41' + b'\x0e\x0c' + b'\x41' + b'\x88\x01' + b'\x41' + b'\x86\x02' + b'\x41' + b'\x0d\x06' + b'\x41' + b'\x84\x03' + b'\x4b' + b'\xc4' + b'\x41' + b'\xc6' + b'\x0d\x07' + b'\x41' + b'\xc8' + b'\x41' + b'\x0e\x00' + b'\x00\x00') s.write(data) structs = DWARFStructs(little_endian=True, dwarf_format=32, address_size=4) cfi = CallFrameInfo(s, len(data), structs) entries = cfi.get_entries() self.assertEqual(len(entries), 2) self.assertIsInstance(entries[0], CIE) self.assertEqual(entries[0]['length'], 32) self.assertEqual(entries[0]['data_alignment_factor'], -4) self.assertEqual(entries[0]['return_address_register'], 8) self.assertEqual(len(entries[0].instructions), 11) self.assertInstruction(entries[0].instructions[0], 'DW_CFA_def_cfa', [7, 0]) self.assertInstruction(entries[0].instructions[8], 'DW_CFA_same_value', [7]) self.assertInstruction(entries[0].instructions[9], 'DW_CFA_register', [8, 1]) self.assertTrue(isinstance(entries[1], FDE)) self.assertEqual(entries[1]['length'], 40) self.assertEqual(entries[1]['CIE_pointer'], 0) self.assertEqual(entries[1]['address_range'], 84) self.assertIs(entries[1].cie, entries[0]) self.assertEqual(len(entries[1].instructions), 21) self.assertInstruction(entries[1].instructions[0], 'DW_CFA_advance_loc', [1]) self.assertInstruction(entries[1].instructions[1], 'DW_CFA_def_cfa_offset', [12]) self.assertInstruction(entries[1].instructions[9], 'DW_CFA_offset', [4, 3]) self.assertInstruction(entries[1].instructions[18], 'DW_CFA_def_cfa_offset', [0]) self.assertInstruction(entries[1].instructions[20], 'DW_CFA_nop', []) # Now let's decode it... decoded_CIE = entries[0].get_decoded() self.assertEqual(decoded_CIE.reg_order, list(range(9))) self.assertEqual(len(decoded_CIE.table), 1) self.assertEqual(decoded_CIE.table[0]['cfa'].reg, 7) self.assertEqual(decoded_CIE.table[0]['pc'], 0) self.assertEqual(decoded_CIE.table[0]['cfa'].offset, 0) self.assertEqual(decoded_CIE.table[0][4].type, RegisterRule.SAME_VALUE) self.assertEqual(decoded_CIE.table[0][8].type, RegisterRule.REGISTER) self.assertEqual(decoded_CIE.table[0][8].arg, 1) decoded_FDE = entries[1].get_decoded() self.assertEqual(decoded_FDE.reg_order, list(range(9))) self.assertEqual(decoded_FDE.table[0]['cfa'].reg, 7) self.assertEqual(decoded_FDE.table[0]['cfa'].offset, 0) self.assertEqual(decoded_FDE.table[0]['pc'], 0x11223344) self.assertEqual(decoded_FDE.table[0][8].type, RegisterRule.REGISTER) self.assertEqual(decoded_FDE.table[0][8].arg, 1) self.assertEqual(decoded_FDE.table[1]['cfa'].reg, 7) self.assertEqual(decoded_FDE.table[1]['cfa'].offset, 12) self.assertEqual(decoded_FDE.table[2][8].type, RegisterRule.OFFSET) self.assertEqual(decoded_FDE.table[2][8].arg, -4) self.assertEqual(decoded_FDE.table[2][4].type, RegisterRule.SAME_VALUE) self.assertEqual(decoded_FDE.table[5]['pc'], 0x11223344 + 20) self.assertEqual(decoded_FDE.table[5][4].type, RegisterRule.OFFSET) self.assertEqual(decoded_FDE.table[5][4].arg, -12) self.assertEqual(decoded_FDE.table[6]['pc'], 0x11223344 + 64) self.assertEqual(decoded_FDE.table[9]['pc'], 0x11223344 + 76)