1. Centralise the logic for getting the filename for a DIE.
authorShaheed Haque <srhaque@theiet.org>
Fri, 27 Dec 2013 12:36:34 +0000 (12:36 +0000)
committerShaheed Haque <srhaque@theiet.org>
Fri, 27 Dec 2013 12:36:34 +0000 (12:36 +0000)
2. Use the form of logic suggested by Philippe Ombredanne (thanks!).

elftools/dwarf/die.py
examples/dwarf_die_tree.py
examples/examine_dwarf_info.py

index cb5d0505537ce1d32248ee1dfd07514efba9c9b4..282dc7c66df0465fd8a4e31718ed4430441ae14e 100644 (file)
@@ -7,8 +7,9 @@
 # This code is in the public domain
 #-------------------------------------------------------------------------------
 from collections import namedtuple
+import os
 
-from ..common.py3compat import OrderedDict
+from ..common.py3compat import OrderedDict, bytes2str
 from ..common.utils import struct_parse, preserve_stream_pos
 
 
@@ -99,6 +100,28 @@ class DIE(object):
         """
         return self._parent
 
+    def get_filename(self):
+        """Return the filename for the DIE.
+        The filename, which is the join of 'DW_AT_comp_dir' and 'DW_AT_name',
+        either of which may be missing in practice. Note that its value
+        is usually a string taken from the .debug_string section and the
+        returned value will be a string.
+        """
+        comp_dir = ''
+        try:
+            comp_dir_attr = self.attributes['DW_AT_comp_dir']
+            comp_dir = bytes2str(comp_dir_attr.value)
+        except KeyError:
+            pass
+
+        fname = ''
+        try:
+            fname_attr = self.attributes['DW_AT_name']
+            fname = bytes2str(fname_attr.value)
+        except KeyError:
+            pass
+        return os.path.join(comp_dir, fname)
+
     def iter_children(self):
         """ Yield all children of this DIE
         """
index 9dcb6b658ce49dca3e0f9d3da08dbc9f2e2645c0..ba0e0e7f06a4a445cd145d224855bca51d59e13f 100644 (file)
@@ -14,7 +14,6 @@ import sys
 # examples/ dir of the source distribution.
 sys.path[0:0] = ['.', '..']
 
-from elftools.common.py3compat import bytes2str
 from elftools.elf.elffile import ELFFile
 
 
@@ -44,15 +43,8 @@ def process_file(filename):
             top_DIE = CU.get_top_DIE()
             print('    Top DIE with tag=%s' % top_DIE.tag)
 
-            # Each DIE holds an OrderedDict of attributes, mapping names to
-            # values. Values are represented by AttributeValue objects in
-            # elftools/dwarf/die.py
-            # We're interested in the DW_AT_name attribute. Note that its value
-            # is usually a string taken from the .debug_string section. This
-            # is done transparently by the library, and such a value will be
-            # simply given as a string.
-            name_attr = top_DIE.attributes['DW_AT_name']
-            print('    name=%s' % bytes2str(name_attr.value))
+            # We're interested in the filename...
+            print('    name=%s' % top_DIE.get_filename())
 
             # Display DIEs recursively starting with top_DIE
             die_info_rec(top_DIE)
index 1aa28c60e204ce317547e34979d62fcc209bb89f..3a54848ff23b9dcd65d80071c1f94a3a0c2af625 100644 (file)
@@ -13,7 +13,6 @@ import sys
 # examples/ dir of the source distribution.
 sys.path[0:0] = ['.', '..']
 
-from elftools.common.py3compat import bytes2str
 from elftools.elf.elffile import ELFFile
 
 
@@ -43,15 +42,8 @@ def process_file(filename):
             top_DIE = CU.get_top_DIE()
             print('    Top DIE with tag=%s' % top_DIE.tag)
 
-            # Each DIE holds an OrderedDict of attributes, mapping names to
-            # values. Values are represented by AttributeValue objects in
-            # elftools/dwarf/die.py
-            # We're interested in the DW_AT_name attribute. Note that its value
-            # is usually a string taken from the .debug_str section. This
-            # is done transparently by the library, and such a value will be
-            # simply given as a string.
-            name_attr = top_DIE.attributes['DW_AT_name']
-            print('    name=%s' % bytes2str(name_attr.value))
+            # We're interested in the filename...
+            print('    name=%s' % top_DIE.get_filename())
 
 if __name__ == '__main__':
     for filename in sys.argv[1:]: