added some basic description capabilities for DWARF attributes in debug_info
diff --git a/README.rst b/README.rst
index 920cafc..cb92a07 100644
--- a/README.rst
+++ b/README.rst
@@ -3,4 +3,4 @@
 

 Nice project, heh?

 

-This is **cool**, or is it?

+

diff --git a/elftools/dwarf/descriptions.py b/elftools/dwarf/descriptions.py
new file mode 100644
index 0000000..93cc2eb
--- /dev/null
+++ b/elftools/dwarf/descriptions.py
@@ -0,0 +1,79 @@
+#-------------------------------------------------------------------------------

+# elftools: dwarf/descriptions.py

+#

+# Textual descriptions of the various values and enums of DWARF

+#

+# Eli Bendersky (eliben@gmail.com)

+# This code is in the public domain

+#-------------------------------------------------------------------------------

+from collections import defaultdict

+

+

+def describe_attr_value(attr, die, section_offset):

+    """ Given an AttributeValue extracted, return the textual representation of

+        its value, suitable for tools like readelf.

+        

+        To cover all cases, this function needs some extra arguments:

+

+        die: the DIE this attribute was extracted from

+        section_offset: offset in the stream of the section the DIE belongs to

+    """

+    descr_func = _ATTR_DESCRIPTION_MAP[attr.form]

+    return descr_func(attr, die, section_offset)

+

+

+#-------------------------------------------------------------------------------

+

+def _describe_attr_ref(attr, die, section_offset):
+    return '<0x%x>' % (attr.value + die.cu.cu_offset - section_offset)

+

+def _describe_attr_value_passthrough(attr, die, section_offset):
+    return attr.value

+

+def _describe_attr_hex(attr, die, section_offset):
+    return '0x%x' % (attr.value)

+

+def _describe_attr_hex_addr(attr, die, section_offset):

+    return '<0x%x>' % (attr.value)

+

+def _describe_attr_split_64bit(attr, die, section_offset):
+    low_word = attr.value & 0xFFFFFFFF

+    high_word = (attr.value >> 32) & 0xFFFFFFFF

+    return '0x%x 0x%x' % (low_word, high_word)

+

+def _describe_attr_strp(attr, die, section_offset):
+    return '(indirect string, offset: 0x%x): %s' % (attr.raw_value, attr.value)

+

+def _describe_attr_block(attr, die, section_offset):
+    s = '%s byte block: ' % len(attr.value)

+    s += ' '.join('%x' % item for item in attr.value)

+    return s

+    

+

+_ATTR_DESCRIPTION_MAP = defaultdict(

+    lambda: _describe_attr_value_passthrough, # default_factory

+    

+    DW_FORM_ref1=_describe_attr_ref,

+    DW_FORM_ref2=_describe_attr_ref,

+    DW_FORM_ref4=_describe_attr_ref,

+    DW_FORM_ref8=_describe_attr_split_64bit,

+    DW_FORM_ref_udata=_describe_attr_ref,        

+    DW_FORM_ref_addr=_describe_attr_hex_addr,

+    DW_FORM_data4=_describe_attr_hex,

+    DW_FORM_data8=_describe_attr_split_64bit,

+    DW_FORM_addr=_describe_attr_hex,

+    DW_FORM_sec_offset=_describe_attr_hex,

+    DW_FORM_flag_present=_describe_attr_value_passthrough,

+    DW_FORM_flag=_describe_attr_value_passthrough,

+    DW_FORM_data1=_describe_attr_value_passthrough,

+    DW_FORM_data2=_describe_attr_value_passthrough,

+    DW_FORM_sdata=_describe_attr_value_passthrough,

+    DW_FORM_udata=_describe_attr_value_passthrough,

+    DW_FORM_string=_describe_attr_value_passthrough,

+    DW_FORM_strp=_describe_attr_strp,

+    DW_FORM_block1=_describe_attr_block,

+    DW_FORM_block2=_describe_attr_block,

+    DW_FORM_block4=_describe_attr_block,

+    DW_FORM_block=_describe_attr_block,

+)

+

diff --git a/elftools/dwarf/die.py b/elftools/dwarf/die.py
index ad81892..f4f422e 100644
--- a/elftools/dwarf/die.py
+++ b/elftools/dwarf/die.py
@@ -49,8 +49,7 @@
             
             attributes:
                 An ordered dictionary mapping attribute names to values. It's 
-                ordered to enable both efficient name->value mapping and
-                preserve the order of attributes in the section
+                ordered to preserve the order of attributes in the section
             
             has_children:
                 Specifies whether this DIE has children
@@ -190,5 +189,5 @@
         else:
             value = raw_value
         return value
-        
-         
\ No newline at end of file
+    
+
diff --git a/scripts/readelf.py b/scripts/readelf.py
index b1fd9c4..02325f3 100755
--- a/scripts/readelf.py
+++ b/scripts/readelf.py
@@ -34,6 +34,7 @@
     describe_symbol_shndx, describe_reloc_type,
     )
 from elftools.dwarf.dwarfinfo import DWARFInfo, DebugSectionLocator
+from elftools.dwarf.descriptions import describe_attr_value
 
 
 class ReadElf(object):
@@ -512,11 +513,21 @@
                 if die.is_null():
                     die_depth -= 1
                     continue
-                self._emitline(' <%s><%x>: Abbrev Number: %s' % (
-                    die_depth, die.offset - section_offset, die.abbrev_code))
+                self._emitline(' <%s><%x>: Abbrev Number: %s (%s)' % (
+                    die_depth,
+                    die.offset - section_offset,
+                    die.abbrev_code,
+                    die.tag))
+                
+                for attrname, attr in die.attributes.iteritems():
+                    self._emitline('    <%2x>   %-18s: %s' % (
+                        attr.offset - section_offset,
+                        attrname,
+                        describe_attr_value(attr, die, section_offset)))
                 
                 if die.has_children:
                     die_depth += 1
+                    
 
     def _emit(self, s=''):
         """ Emit an object to output