Merge pull request #24 from smani/range_lists
Handle absence of .debug_ranges gracefully
diff --git a/elftools/dwarf/dwarfinfo.py b/elftools/dwarf/dwarfinfo.py
index e5c0e71..f9d1e32 100644
--- a/elftools/dwarf/dwarfinfo.py
+++ b/elftools/dwarf/dwarfinfo.py
@@ -178,7 +178,11 @@
""" Get a RangeLists object representing the .debug_ranges section of
the DWARF data, or None if this section doesn't exist.
"""
- return RangeLists(self.debug_ranges_sec.stream, self.structs)
+ # ".debug_ranges" section is optional
+ if self.debug_ranges_sec == None:
+ return None
+ else:
+ return RangeLists(self.debug_ranges_sec.stream, self.structs)
#------ PRIVATE ------#
diff --git a/examples/dwarf_range_lists.py b/examples/dwarf_range_lists.py
index fced6a6..f722d11 100644
--- a/examples/dwarf_range_lists.py
+++ b/examples/dwarf_range_lists.py
@@ -37,6 +37,9 @@
# The range lists are extracted by DWARFInfo from the .debug_ranges
# section, and returned here as a RangeLists object.
range_lists = dwarfinfo.range_lists()
+ if range_lists == None:
+ print(' file has no .debug_ranges section')
+ return
for CU in dwarfinfo.iter_CUs():
# DWARFInfo allows to iterate over the compile units contained in
diff --git a/test/test_dwarf_range_lists.py b/test/test_dwarf_range_lists.py
new file mode 100644
index 0000000..1ebd0c7
--- /dev/null
+++ b/test/test_dwarf_range_lists.py
@@ -0,0 +1,38 @@
+#-------------------------------------------------------------------------------
+# elftools tests
+#
+# Eli Bendersky (eliben@gmail.com), Santhosh Kumar Mani (santhoshmani@gmail.com)
+# This code is in the public domain
+#-------------------------------------------------------------------------------
+try:
+ import unittest2 as unittest
+except ImportError:
+ import unittest
+import os
+
+from utils import setup_syspath; setup_syspath()
+from elftools.elf.elffile import ELFFile
+
+class TestRangeLists(unittest.TestCase):
+ # Test the absence of .debug_ranges section
+ def test_range_list_absence(self):
+ with open(os.path.join('test', 'testfiles_for_unittests',
+ 'arm_with_form_indirect.elf'), 'rb') as f:
+ elffile = ELFFile(f)
+ self.assertTrue(elffile.has_dwarf_info())
+
+ dwarfinfo = elffile.get_dwarf_info()
+ self.assertEqual(dwarfinfo.range_lists(), None)
+
+ # Test the presence of .debug_ranges section
+ def test_range_list_presence(self):
+ with open(os.path.join('test', 'testfiles_for_unittests',
+ 'sample_exe64.elf'), 'rb') as f:
+ elffile = ELFFile(f)
+ self.assertTrue(elffile.has_dwarf_info())
+
+ dwarfinfo = elffile.get_dwarf_info()
+ self.assertTrue(dwarfinfo.range_lists() != None)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/test/testfiles_for_unittests/sample_exe64.elf b/test/testfiles_for_unittests/sample_exe64.elf
new file mode 100644
index 0000000..ccfa6ae
--- /dev/null
+++ b/test/testfiles_for_unittests/sample_exe64.elf
Binary files differ