From b98299ee57b62261cb4aaed62f02c6f80d162af6 Mon Sep 17 00:00:00 2001 From: Eli Bendersky Date: Fri, 16 Dec 2011 13:05:54 +0200 Subject: [PATCH] Added new test file and fixing some problems related to it. not completely working yet --- elftools/dwarf/lineprogram.py | 7 ++++++- tests/run_readelf_tests.py | 3 ++- tests/testfiles/penalty_32_gcc.o.elf | Bin 0 -> 66460 bytes 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 tests/testfiles/penalty_32_gcc.o.elf diff --git a/elftools/dwarf/lineprogram.py b/elftools/dwarf/lineprogram.py index 361511f..45bca2d 100644 --- a/elftools/dwarf/lineprogram.py +++ b/elftools/dwarf/lineprogram.py @@ -6,6 +6,7 @@ # Eli Bendersky (eliben@gmail.com) # This code is in the public domain #------------------------------------------------------------------------------- +import os import copy from collections import namedtuple @@ -181,6 +182,10 @@ class LineProgram(object): self.structs.Dwarf_lineprog_file_entry, self.stream) self['file_entry'].append(operand) add_entry_old_state(ex_opcode, [operand], is_extended=True) + else: + # Unknown, but need to roll forward the stream because the + # length is specified + self.stream.seek(inst_len, os.SEEK_CUR) else: # 0 < opcode < opcode_base # Standard opcode if opcode == DW_LNS_copy: @@ -197,7 +202,7 @@ class LineProgram(object): self.stream) state.line += operand elif opcode == DW_LNS_set_file: - operand = struct_parse(self.structs.Dwarf_sleb128(''), + operand = struct_parse(self.structs.Dwarf_uleb128(''), self.stream) state.file = operand add_entry_old_state(opcode, [operand]) diff --git a/tests/run_readelf_tests.py b/tests/run_readelf_tests.py index 5a5fbd7..61cfbee 100755 --- a/tests/run_readelf_tests.py +++ b/tests/run_readelf_tests.py @@ -104,7 +104,8 @@ def compare_output(s1, s2): elif 'of the .debug_frame section' in line: filter_out = False if not filter_out: - yield line + if not line.startswith('unknown: length'): + yield line lines1 = prepare_lines(s1) lines2 = prepare_lines(s2) diff --git a/tests/testfiles/penalty_32_gcc.o.elf b/tests/testfiles/penalty_32_gcc.o.elf new file mode 100644 index 0000000000000000000000000000000000000000..4c5c5de6695317d702fc2d674f6fa9d7b1c8daaf GIT binary patch literal 66460 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