SF.net SVN: gar:[23649] csw/mgar/pkg/lang-python/pyelftools/trunk

wahwah at users.sourceforge.net wahwah at users.sourceforge.net
Sun May 18 15:00:14 CEST 2014


Revision: 23649
          http://sourceforge.net/p/gar/code/23649
Author:   wahwah
Date:     2014-05-18 13:00:14 +0000 (Sun, 18 May 2014)
Log Message:
-----------
lang-python/pyelftools/trunk: Version bump, patches have been pushed upstream

Modified Paths:
--------------
    csw/mgar/pkg/lang-python/pyelftools/trunk/Makefile
    csw/mgar/pkg/lang-python/pyelftools/trunk/checksums

Removed Paths:
-------------
    csw/mgar/pkg/lang-python/pyelftools/trunk/files/0001-syminfo+symbol_versioning_support.patch
    csw/mgar/pkg/lang-python/pyelftools/trunk/files/0002-Correctly-handle-the-multiple-string-tables-case-for.patch

Modified: csw/mgar/pkg/lang-python/pyelftools/trunk/Makefile
===================================================================
--- csw/mgar/pkg/lang-python/pyelftools/trunk/Makefile	2014-05-18 12:55:09 UTC (rev 23648)
+++ csw/mgar/pkg/lang-python/pyelftools/trunk/Makefile	2014-05-18 13:00:14 UTC (rev 23649)
@@ -2,26 +2,19 @@
 # TODO (release-critical prefixed with !, non release-critical with *)
 #
 NAME = pyelftools
-VERSION = 0.21
+VERSION = 0.22
 GARTYPE = v2
 
 DESCRIPTION = Library for analyzing ELF files and DWARF debugging information
-define BLURB
-endef
 
 CATEGORIES = python
 DISTFILES  = $(DISTNAME).tar.gz
 
-PACKAGING_PLATFORMS = solaris9-i386 solaris9-sparc
-
 # Since elftools are used for checkpkg, they need to be built for all
 # platforms on which we're building.
 PACKAGING_PLATFORMS = solaris9-sparc solaris9-i386
 PACKAGING_PLATFORMS += solaris10-sparc solaris10-i386
 
-PATCHFILES += 0001-syminfo+symbol_versioning_support.patch
-PATCHFILES += 0002-Correctly-handle-the-multiple-string-tables-case-for.patch
-
 TEST_SCRIPTS =
 
 ARCHALL_CSWpy-pyelftools = 1

Modified: csw/mgar/pkg/lang-python/pyelftools/trunk/checksums
===================================================================
--- csw/mgar/pkg/lang-python/pyelftools/trunk/checksums	2014-05-18 12:55:09 UTC (rev 23648)
+++ csw/mgar/pkg/lang-python/pyelftools/trunk/checksums	2014-05-18 13:00:14 UTC (rev 23649)
@@ -1 +1 @@
-fe1039193675cb9d0ddf60d1431fbea3  pyelftools-0.21.tar.gz
+e01fe8bb455b472ebe26ab9ccff26fcf  pyelftools-0.22.tar.gz

Deleted: csw/mgar/pkg/lang-python/pyelftools/trunk/files/0001-syminfo+symbol_versioning_support.patch
===================================================================
--- csw/mgar/pkg/lang-python/pyelftools/trunk/files/0001-syminfo+symbol_versioning_support.patch	2014-05-18 12:55:09 UTC (rev 23648)
+++ csw/mgar/pkg/lang-python/pyelftools/trunk/files/0001-syminfo+symbol_versioning_support.patch	2014-05-18 13:00:14 UTC (rev 23649)
@@ -1,2070 +0,0 @@
-diff -r 249a5ca85159 CHANGES
---- a/CHANGES	Wed Apr 17 05:57:58 2013 -0700
-+++ b/CHANGES	Mon Jun 03 17:52:42 2013 +0200
-@@ -1,7 +1,14 @@
- Changelog
- =========
- 
--+ Version 0.22 (17.04.2013)
-++ Version 0.22 (??)
-+
-+  - Added some initial support for parsing Solaris OpenCSW ELF files
-+    (contributed by Yann Rouillard).
-+  - Added some initial support for DWARF4 (as generated by gcc 4.8)
-+    and DWARF generated by recent versions of Clang (3.3).
-+
-++ Version 0.21 (17.04.2013)
- 
-   - Added new example: dwarf_decode_address - decode function name and
-     file & line information from an address.
-diff -r 249a5ca85159 elftools/dwarf/callframe.py
---- a/elftools/dwarf/callframe.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/dwarf/callframe.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -26,13 +26,13 @@
-             Eventually, each entry gets its own structs based on the initial
-             length field it starts with. The address_size, however, is taken
-             from base_structs. This appears to be a limitation of the DWARFv3
--            standard, fixed in v4 (where an address_size field exists for each
--            CFI. A discussion I had on dwarf-discuss confirms this.
--            Currently for base_structs I simply use the elfclass of the
--            containing file, but more sophisticated methods are used by
--            libdwarf and others, such as guessing which CU contains which FDEs
--            (based on their address ranges) and taking the address_size from
--            those CUs.
-+            standard, fixed in v4.
-+            A discussion I had on dwarf-discuss confirms this.
-+            So for DWARFv4 we'll take the address size from the CIE header,
-+            but for earlier versions will use the elfclass of the containing
-+            file; more sophisticated methods are used by libdwarf and others,
-+            such as guessing which CU contains which FDEs (based on their
-+            address ranges) and taking the address_size from those CUs.
-     """
-     def __init__(self, stream, size, base_structs):
-         self.stream = stream
-@@ -99,6 +99,14 @@
-         header = struct_parse(
-             header_struct, self.stream, offset)
- 
-+        # If this is DWARF version 4 or later, we can have a more precise
-+        # address size, read from the CIE header.
-+        if entry_structs.dwarf_version >= 4:
-+            entry_structs = DWARFStructs(
-+                little_endian=entry_structs.little_endian,
-+                dwarf_format=entry_structs.dwarf_format,
-+                address_size=header.address_size)
-+
-         # For convenience, compute the end offset for this entry
-         end_offset = (
-             offset + header.length +
-diff -r 249a5ca85159 elftools/dwarf/descriptions.py
---- a/elftools/dwarf/descriptions.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/dwarf/descriptions.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -197,6 +197,12 @@
-     """
-     return '1' if attr.value else '0'
- 
-+def _describe_attr_present(attr, die, section_offset):
-+    """ Some forms may simply mean that an attribute is present,
-+        without providing any value.
-+    """
-+    return '1'
-+
- def _describe_attr_block(attr, die, section_offset):
-     s = '%s byte block: ' % len(attr.value)
-     s += ' '.join('%x' % item for item in attr.value) + ' '
-@@ -227,6 +233,9 @@
-     DW_FORM_block2=_describe_attr_block,
-     DW_FORM_block4=_describe_attr_block,
-     DW_FORM_block=_describe_attr_block,
-+    DW_FORM_flag_present=_describe_attr_present,
-+    DW_FORM_exprloc=_describe_attr_block,
-+    DW_FORM_ref_sig8=_describe_attr_ref,
- )
- 
- 
-diff -r 249a5ca85159 elftools/dwarf/dwarfinfo.py
---- a/elftools/dwarf/dwarfinfo.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/dwarf/dwarfinfo.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -21,7 +21,7 @@
- 
- 
- # Describes a debug section
--# 
-+#
- # stream: a stream object containing the data of this section
- # name: section name in the container file
- # global_offset: the global offset of the section in its container file
-@@ -30,7 +30,7 @@
- # 'name' and 'global_offset' are for descriptional purposes only and
- # aren't strictly required for the DWARF parsing to work.
- #
--DebugSectionDescriptor = namedtuple('DebugSectionDescriptor', 
-+DebugSectionDescriptor = namedtuple('DebugSectionDescriptor',
-     'stream name global_offset size')
- 
- 
-@@ -51,7 +51,7 @@
- 
- 
- class DWARFInfo(object):
--    """ Acts also as a "context" to other major objects, bridging between 
-+    """ Acts also as a "context" to other major objects, bridging between
-         various parts of the debug infromation.
-     """
-     def __init__(self,
-@@ -59,6 +59,7 @@
-             debug_info_sec,
-             debug_abbrev_sec,
-             debug_frame_sec,
-+            eh_frame_sec,
-             debug_str_sec,
-             debug_loc_sec,
-             debug_ranges_sec,
-@@ -68,19 +69,20 @@
- 
-             debug_*_sec:
-                 DebugSectionDescriptor for a section. Pass None for sections
--                that don't exist. These arguments are best given with 
-+                that don't exist. These arguments are best given with
-                 keyword syntax.
-         """
-         self.config = config
-         self.debug_info_sec = debug_info_sec
-         self.debug_abbrev_sec = debug_abbrev_sec
-         self.debug_frame_sec = debug_frame_sec
-+        self.eh_frame_sec = eh_frame_sec
-         self.debug_str_sec = debug_str_sec
-         self.debug_loc_sec = debug_loc_sec
-         self.debug_ranges_sec = debug_ranges_sec
-         self.debug_line_sec = debug_line_sec
- 
--        # This is the DWARFStructs the context uses, so it doesn't depend on 
-+        # This is the DWARFStructs the context uses, so it doesn't depend on
-         # DWARF format and address_size (these are determined per CU) - set them
-         # to default values.
-         self.structs = DWARFStructs(
-@@ -119,7 +121,7 @@
-         return self._abbrevtable_cache[offset]
- 
-     def get_string_from_table(self, offset):
--        """ Obtain a string from the string table section, given an offset 
-+        """ Obtain a string from the string table section, given an offset
-             relative to the section.
-         """
-         return parse_cstring_from_stream(self.debug_str_sec.stream, offset)
-@@ -139,12 +141,12 @@
-             return None
- 
-     def has_CFI(self):
--        """ Does this dwarf info has a CFI section?
-+        """ Does this dwarf info have a dwarf_frame CFI section?
-         """
-         return self.debug_frame_sec is not None
- 
-     def CFI_entries(self):
--        """ Get a list of CFI entries from the .debug_frame section.
-+        """ Get a list of dwarf_frame CFI entries from the .debug_frame section.
-         """
-         cfi = CallFrameInfo(
-             stream=self.debug_frame_sec.stream,
-@@ -152,6 +154,20 @@
-             base_structs=self.structs)
-         return cfi.get_entries()
- 
-+    def has_EH_CFI(self):
-+        """ Does this dwarf info have a eh_frame CFI section?
-+        """
-+        return self.eh_frame_sec is not None
-+
-+    def EH_CFI_entries(self):
-+        """ Get a list of eh_frame CFI entries from the .eh_frame section.
-+        """
-+        cfi = CallFrameInfo(
-+            stream=self.eh_frame_sec.stream,
-+            size=self.eh_frame_sec.size,
-+            base_structs=self.structs)
-+        return cfi.get_entries()
-+
-     def location_lists(self):
-         """ Get a LocationLists object representing the .debug_loc section of
-             the DWARF data, or None if this section doesn't exist.
-@@ -175,18 +191,18 @@
-             # Compute the offset of the next CU in the section. The unit_length
-             # field of the CU header contains its size not including the length
-             # field itself.
--            offset = (  offset + 
--                        cu['unit_length'] + 
-+            offset = (  offset +
-+                        cu['unit_length'] +
-                         cu.structs.initial_length_field_size())
-             yield cu
--        
-+
-     def _parse_CU_at_offset(self, offset):
-         """ Parse and return a CU at the given offset in the debug_info stream.
-         """
-         # Section 7.4 (32-bit and 64-bit DWARF Formats) of the DWARF spec v3
--        # states that the first 32-bit word of the CU header determines 
-+        # states that the first 32-bit word of the CU header determines
-         # whether the CU is represented with 32-bit or 64-bit DWARF format.
--        # 
-+        #
-         # So we peek at the first word in the CU header to determine its
-         # dwarf format. Based on it, we then create a new DWARFStructs
-         # instance suitable for this CU and use it to parse the rest.
-@@ -205,15 +221,15 @@
-             little_endian=self.config.little_endian,
-             dwarf_format=dwarf_format,
-             address_size=4)
--        
-+
-         cu_header = struct_parse(
-             cu_structs.Dwarf_CU_header, self.debug_info_sec.stream, offset)
-         if cu_header['address_size'] == 8:
-             cu_structs = DWARFStructs(
-                 little_endian=self.config.little_endian,
-                 dwarf_format=dwarf_format,
--                 address_size=8)
--        
-+                address_size=8)
-+
-         cu_die_offset = self.debug_info_sec.stream.tell()
-         dwarf_assert(
-             self._is_supported_version(cu_header['version']),
-@@ -224,11 +240,11 @@
-                 structs=cu_structs,
-                 cu_offset=offset,
-                 cu_die_offset=cu_die_offset)
--        
-+
-     def _is_supported_version(self, version):
-         """ DWARF version supported by this parser
-         """
--        return 2 <= version <= 3
-+        return 2 <= version <= 4
- 
-     def _parse_line_program_at_offset(self, debug_line_offset, structs):
-         """ Given an offset to the .debug_line section, parse the line program
-diff -r 249a5ca85159 elftools/dwarf/enums.py
---- a/elftools/dwarf/enums.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/dwarf/enums.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -185,7 +185,9 @@
-     DW_AT_main_subprogram       = 0x6a,
-     DW_AT_data_bit_offset       = 0x6b,
-     DW_AT_const_expr            = 0x6c,
--    
-+    DW_AT_enum_class            = 0x6d,
-+    DW_AT_linkage_name          = 0x6e,
-+
-     DW_AT_MIPS_fde                      = 0x2001,
-     DW_AT_MIPS_loop_begin               = 0x2002,
-     DW_AT_MIPS_tail_loop_begin          = 0x2003,
-@@ -197,8 +199,46 @@
-     DW_AT_MIPS_abstract_name            = 0x2009,
-     DW_AT_MIPS_clone_origin             = 0x200a,
-     DW_AT_MIPS_has_inlines              = 0x200b,
-+    DW_AT_MIPS_stride_byte              = 0x200c,
-+    DW_AT_MIPS_stride_elem              = 0x200d,
-+    DW_AT_MIPS_ptr_dopetype             = 0x200e,
-+    DW_AT_MIPS_allocatable_dopetype     = 0x200f,
-+    DW_AT_MIPS_assumed_shape_dopetype   = 0x2010,
-+    DW_AT_MIPS_assumed_size             = 0x2011,
- 
--    _default_                   = Pass,
-+    DW_AT_sf_names                      = 0x2101,
-+    DW_AT_src_info                      = 0x2102,
-+    DW_AT_mac_info                      = 0x2103,
-+    DW_AT_src_coords                    = 0x2104,
-+    DW_AT_body_begin                    = 0x2105,
-+    DW_AT_body_end                      = 0x2106,
-+    DW_AT_GNU_vector                    = 0x2107,
-+    DW_AT_GNU_template_name             = 0x2110,
-+
-+    DW_AT_GNU_call_site_value               = 0x2111,
-+    DW_AT_GNU_call_site_data_value          = 0x2112,
-+    DW_AT_GNU_call_site_target              = 0x2113,
-+    DW_AT_GNU_call_site_target_clobbered    = 0x2114,
-+    DW_AT_GNU_tail_call                     = 0x2115,
-+    DW_AT_GNU_all_tail_call_sites           = 0x2116,
-+    DW_AT_GNU_all_call_sites                = 0x2117,
-+    DW_AT_GNU_all_source_call_sites         = 0x2118,
-+
-+    DW_AT_APPLE_optimized               = 0x3fe1,
-+    DW_AT_APPLE_flags                   = 0x3fe2,
-+    DW_AT_APPLE_isa                     = 0x3fe3,
-+    DW_AT_APPLE_block                   = 0x3fe4,
-+    DW_AT_APPLE_major_runtime_vers      = 0x3fe5,
-+    DW_AT_APPLE_runtime_class           = 0x3fe6,
-+    DW_AT_APPLE_omit_frame_ptr          = 0x3fe7,
-+    DW_AT_APPLE_property_name           = 0x3fe8,
-+    DW_AT_APPLE_property_getter         = 0x3fe9,
-+    DW_AT_APPLE_property_setter         = 0x3fea,
-+    DW_AT_APPLE_property_attribute      = 0x3feb,
-+    DW_AT_APPLE_objc_complete_type      = 0x3fec,
-+    DW_AT_APPLE_property                = 0x3fed,
-+
-+    _default_ = Pass,
- )
- 
- 
-@@ -225,6 +265,10 @@
-     DW_FORM_ref8            = 0x14,
-     DW_FORM_ref_udata       = 0x15,
-     DW_FORM_indirect        = 0x16,
-+    DW_FORM_sec_offset      = 0x17,
-+    DW_FORM_exprloc         = 0x18,
-+    DW_FORM_flag_present    = 0x19,
-+    DW_FORM_ref_sig8        = 0x20,
- 
-     _default_               = Pass,
- )
-diff -r 249a5ca85159 elftools/dwarf/lineprogram.py
---- a/elftools/dwarf/lineprogram.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/dwarf/lineprogram.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -215,10 +215,10 @@
-                     add_entry_old_state(opcode, [operand])
-                 elif opcode == DW_LNS_negate_stmt:
-                     state.is_stmt = not state.is_stmt
--                    add_entry_old_state(opcode, [operand])
-+                    add_entry_old_state(opcode, [])
-                 elif opcode == DW_LNS_set_basic_block:
-                     state.basic_block = True
--                    add_entry_old_state(opcode, [operand])
-+                    add_entry_old_state(opcode, [])
-                 elif opcode == DW_LNS_const_add_pc:
-                     adjusted_opcode = 255 - self['opcode_base']
-                     address_addend = ((adjusted_opcode // self['line_range']) *
-diff -r 249a5ca85159 elftools/dwarf/structs.py
---- a/elftools/dwarf/structs.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/dwarf/structs.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -11,7 +11,7 @@
-     UBInt8, UBInt16, UBInt32, UBInt64, ULInt8, ULInt16, ULInt32, ULInt64,
-     SBInt8, SBInt16, SBInt32, SBInt64, SLInt8, SLInt16, SLInt32, SLInt64,
-     Adapter, Struct, ConstructError, If, RepeatUntil, Field, Rename, Enum,
--    Array, PrefixedArray, CString, Embed,
-+    Array, PrefixedArray, CString, Embed, StaticField
-     )
- from ..common.construct_utils import RepeatUntilExcluding
- 
-@@ -19,39 +19,39 @@
- 
- 
- class DWARFStructs(object):
--    """ Exposes Construct structs suitable for parsing information from DWARF 
-+    """ Exposes Construct structs suitable for parsing information from DWARF
-         sections. Each compile unit in DWARF info can have its own structs
--        object. Keep in mind that these structs have to be given a name (by 
-+        object. Keep in mind that these structs have to be given a name (by
-         calling them with a name) before being used for parsing (like other
-         Construct structs). Those that should be used without a name are marked
-         by (+).
--    
-+
-         Accessible attributes (mostly as described in chapter 7 of the DWARF
-         spec v3):
--    
-+
-             Dwarf_[u]int{8,16,32,64):
-                 Data chunks of the common sizes
--            
-+
-             Dwarf_offset:
-                 32-bit or 64-bit word, depending on dwarf_format
--            
-+
-             Dwarf_target_addr:
-                 32-bit or 64-bit word, depending on address size
--            
-+
-             Dwarf_initial_length:
-                 "Initial length field" encoding
-                 section 7.4
--            
-+
-             Dwarf_{u,s}leb128:
-                 ULEB128 and SLEB128 variable-length encoding
--            
-+
-             Dwarf_CU_header (+):
-                 Compilation unit header
--        
-+
-             Dwarf_abbrev_declaration (+):
-                 Abbreviation table declaration - doesn't include the initial
-                 code, only the contents.
--            
-+
-             Dwarf_dw_form (+):
-                 A dictionary mapping 'DW_FORM_*' keys into construct Structs
-                 that parse such forms. These Structs have already been given
-@@ -62,7 +62,7 @@
- 
-             Dwarf_lineprog_file_entry (+):
-                 A single file entry in a line program header or instruction
--        
-+
-             Dwarf_CIE_header (+):
-                 A call-frame CIE
- 
-@@ -71,22 +71,27 @@
- 
-         See also the documentation of public methods.
-     """
--    def __init__(self, little_endian, dwarf_format, address_size):
--        """ little_endian:
-+    def __init__(self,
-+                 little_endian, dwarf_format, address_size, dwarf_version=2):
-+        """ dwarf_version:
-+                Numeric DWARF version
-+
-+            little_endian:
-                 True if the file is little endian, False if big
--            
-+
-             dwarf_format:
-                 DWARF Format: 32 or 64-bit (see spec section 7.4)
--            
-+
-             address_size:
--                Target machine address size, in bytes (4 or 8). (See spec 
-+                Target machine address size, in bytes (4 or 8). (See spec
-                 section 7.5.1)
-         """
-         assert dwarf_format == 32 or dwarf_format == 64
-         assert address_size == 8 or address_size == 4
-         self.little_endian = little_endian
--        self.dwarf_format = dwarf_format  
-+        self.dwarf_format = dwarf_format
-         self.address_size = address_size
-+        self.dwarf_version = dwarf_version
-         self._create_structs()
- 
-     def initial_length_field_size(self):
-@@ -131,7 +136,7 @@
-     def _create_initial_length(self):
-         def _InitialLength(name):
-             # Adapts a Struct that parses forward a full initial length field.
--            # Only if the first word is the continuation value, the second 
-+            # Only if the first word is the continuation value, the second
-             # word is parsed from the stream.
-             #
-             return _InitialLengthAdapter(
-@@ -152,13 +157,13 @@
-             self.Dwarf_uint16('version'),
-             self.Dwarf_offset('debug_abbrev_offset'),
-             self.Dwarf_uint8('address_size'))
--    
-+
-     def _create_abbrev_declaration(self):
-         self.Dwarf_abbrev_declaration = Struct('Dwarf_abbrev_entry',
-             Enum(self.Dwarf_uleb128('tag'), **ENUM_DW_TAG),
-             Enum(self.Dwarf_uint8('children_flag'), **ENUM_DW_CHILDREN),
-             RepeatUntilExcluding(
--                lambda obj, ctx: 
-+                lambda obj, ctx:
-                     obj.name == 'DW_AT_null' and obj.form == 'DW_FORM_null',
-                 Struct('attr_spec',
-                     Enum(self.Dwarf_uleb128('name'), **ENUM_DW_AT),
-@@ -167,12 +172,12 @@
-     def _create_dw_form(self):
-         self.Dwarf_dw_form = dict(
-             DW_FORM_addr=self.Dwarf_target_addr(''),
--            
-+
-             DW_FORM_block1=self._make_block_struct(self.Dwarf_uint8),
-             DW_FORM_block2=self._make_block_struct(self.Dwarf_uint16),
-             DW_FORM_block4=self._make_block_struct(self.Dwarf_uint32),
-             DW_FORM_block=self._make_block_struct(self.Dwarf_uleb128),
--            
-+
-             # All DW_FORM_data<n> forms are assumed to be unsigned
-             DW_FORM_data1=self.Dwarf_uint8(''),
-             DW_FORM_data2=self.Dwarf_uint16(''),
-@@ -180,19 +185,25 @@
-             DW_FORM_data8=self.Dwarf_uint64(''),
-             DW_FORM_sdata=self.Dwarf_sleb128(''),
-             DW_FORM_udata=self.Dwarf_uleb128(''),
--            
-+
-             DW_FORM_string=CString(''),
-             DW_FORM_strp=self.Dwarf_offset(''),
-             DW_FORM_flag=self.Dwarf_uint8(''),
--            
-+
-             DW_FORM_ref1=self.Dwarf_uint8(''),
-             DW_FORM_ref2=self.Dwarf_uint16(''),
-             DW_FORM_ref4=self.Dwarf_uint32(''),
-             DW_FORM_ref8=self.Dwarf_uint64(''),
-             DW_FORM_ref_udata=self.Dwarf_uleb128(''),
-             DW_FORM_ref_addr=self.Dwarf_offset(''),
--            
-+
-             DW_FORM_indirect=self.Dwarf_uleb128(''),
-+
-+            # New forms in DWARFv4
-+            DW_FORM_flag_present = StaticField('', 0),
-+            DW_FORM_sec_offset = self.Dwarf_offset(''),
-+            DW_FORM_exprloc = self._make_block_struct(self.Dwarf_uleb128),
-+            DW_FORM_ref_sig8 = self.Dwarf_offset(''),
-         )
- 
-     def _create_lineprog_header(self):
-@@ -215,7 +226,7 @@
-             self.Dwarf_int8('line_base'),
-             self.Dwarf_uint8('line_range'),
-             self.Dwarf_uint8('opcode_base'),
--            Array(lambda ctx: ctx['opcode_base'] - 1, 
-+            Array(lambda ctx: ctx['opcode_base'] - 1,
-                   self.Dwarf_uint8('standard_opcode_lengths')),
-             RepeatUntilExcluding(
-                 lambda obj, ctx: obj == b'',
-@@ -226,14 +237,27 @@
-             )
- 
-     def _create_callframe_entry_headers(self):
--        self.Dwarf_CIE_header = Struct('Dwarf_CIE_header',
--            self.Dwarf_initial_length('length'),
--            self.Dwarf_offset('CIE_id'),
--            self.Dwarf_uint8('version'),
--            CString('augmentation'),
--            self.Dwarf_uleb128('code_alignment_factor'),
--            self.Dwarf_sleb128('data_alignment_factor'),
--            self.Dwarf_uleb128('return_address_register'))
-+        # The CIE header was modified in DWARFv4.
-+        if self.dwarf_version == 4:
-+            self.Dwarf_CIE_header = Struct('Dwarf_CIE_header',
-+                self.Dwarf_initial_length('length'),
-+                self.Dwarf_offset('CIE_id'),
-+                self.Dwarf_uint8('version'),
-+                CString('augmentation'),
-+                self.Dwarf_uint8('address_size'),
-+                self.Dwarf_uint8('segment_size'),
-+                self.Dwarf_uleb128('code_alignment_factor'),
-+                self.Dwarf_sleb128('data_alignment_factor'),
-+                self.Dwarf_uleb128('return_address_register'))
-+        else:
-+            self.Dwarf_CIE_header = Struct('Dwarf_CIE_header',
-+                self.Dwarf_initial_length('length'),
-+                self.Dwarf_offset('CIE_id'),
-+                self.Dwarf_uint8('version'),
-+                CString('augmentation'),
-+                self.Dwarf_uleb128('code_alignment_factor'),
-+                self.Dwarf_sleb128('data_alignment_factor'),
-+                self.Dwarf_uleb128('return_address_register'))
- 
-         self.Dwarf_FDE_header = Struct('Dwarf_FDE_header',
-             self.Dwarf_initial_length('length'),
-@@ -242,7 +266,7 @@
-             self.Dwarf_target_addr('address_range'))
- 
-     def _make_block_struct(self, length_field):
--        """ Create a struct for DW_FORM_block<size> 
-+        """ Create a struct for DW_FORM_block<size>
-         """
-         return PrefixedArray(
-                     subcon=self.Dwarf_uint8('elem'),
-diff -r 249a5ca85159 elftools/elf/constants.py
---- a/elftools/elf/constants.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/elf/constants.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -45,3 +45,25 @@
-     PF_MASKOS=0x00FF0000
-     PF_MASKPROC=0xFF000000
- 
-+
-+# symbol info flags for entries
-+# in the .SUNW_syminfo section
-+class SUNW_SYMINFO_FLAGS(object):
-+    """ Flags for the si_flags field of entries
-+        in the .SUNW_syminfo section
-+    """
-+    SYMINFO_FLG_DIRECT=0x1
-+    SYMINFO_FLG_FILTER=0x2
-+    SYMINFO_FLG_COPY=0x4
-+    SYMINFO_FLG_LAZYLOAD=0x8
-+    SYMINFO_FLG_DIRECTBIND=0x10
-+    SYMINFO_FLG_NOEXTDIRECT=0x20
-+    SYMINFO_FLG_AUXILIARY=0x40
-+    SYMINFO_FLG_INTERPOSE=0x80
-+    SYMINFO_FLG_CAP=0x100
-+    SYMINFO_FLG_DEFERRED=0x200
-+
-+class VER_FLAGS(object):
-+    VER_FLG_BASE=0x1
-+    VER_FLG_WEAK=0x2
-+    VER_FLG_INFO=0x4 
-diff -r 249a5ca85159 elftools/elf/descriptions.py
---- a/elftools/elf/descriptions.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/elf/descriptions.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -9,7 +9,7 @@
- from .enums import (
-     ENUM_D_TAG, ENUM_E_VERSION, ENUM_RELOC_TYPE_i386, ENUM_RELOC_TYPE_x64
-     )
--from .constants import P_FLAGS, SH_FLAGS
-+from .constants import P_FLAGS, SH_FLAGS, SUNW_SYMINFO_FLAGS, VER_FLAGS
- from ..common.py3compat import iteritems
- 
- 
-@@ -84,6 +84,28 @@
-     return _DESCR_D_TAG.get(x, _unknown)
- 
- 
-+def describe_syminfo_flags(x):
-+    return ''.join(_DESCR_SYMINFO_FLAGS[flag] for flag in (
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_CAP,
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECT,
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_FILTER,
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_AUXILIARY,
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECTBIND,
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_COPY,
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_LAZYLOAD,
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_NOEXTDIRECT,
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_INTERPOSE,
-+        SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DEFERRED) if x & flag)
-+
-+def describe_symbol_boundto(x):
-+    return _DESCR_SYMINFO_BOUNDTO.get(x, '%3s' % x)
-+
-+def describe_ver_flags(x):
-+    return ' | '.join(_DESCR_VER_FLAGS[flag] for flag in (
-+        VER_FLAGS.VER_FLG_WEAK,
-+        VER_FLAGS.VER_FLG_BASE,
-+        VER_FLAGS.VER_FLG_INFO) if x & flag)
-+
- #-------------------------------------------------------------------------------
- _unknown = '<unknown>'
- 
-@@ -236,6 +258,33 @@
-     SHN_COMMON='COM',
- )
- 
-+_DESCR_SYMINFO_FLAGS = {
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECT: 'D',
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECTBIND: 'B',
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_COPY: 'C',
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_LAZYLOAD: 'L',
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_NOEXTDIRECT: 'N',
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_AUXILIARY: 'A',
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_FILTER: 'F',
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_INTERPOSE: 'I',
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_CAP: 'S',
-+    SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DEFERRED: 'P',
-+}
-+
-+_DESCR_SYMINFO_BOUNDTO = dict(
-+    SYMINFO_BT_SELF='<self>',
-+    SYMINFO_BT_PARENT='<parent>',
-+    SYMINFO_BT_NONE='',
-+    SYMINFO_BT_EXTERN='<extern>',
-+)
-+
-+_DESCR_VER_FLAGS = {
-+    0: '',
-+    VER_FLAGS.VER_FLG_BASE: 'BASE',
-+    VER_FLAGS.VER_FLG_WEAK: 'WEAK',
-+    VER_FLAGS.VER_FLG_INFO: 'INFO',
-+}
-+
- _DESCR_RELOC_TYPE_i386 = dict(
-         (v, k) for k, v in iteritems(ENUM_RELOC_TYPE_i386))
- 
-diff -r 249a5ca85159 elftools/elf/dynamic.py
---- a/elftools/elf/dynamic.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/elf/dynamic.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -25,7 +25,8 @@
-         value of DT_SONAME (fetched from the dynamic symbol table).
-     """
-     _HANDLED_TAGS = frozenset(
--        ['DT_NEEDED', 'DT_RPATH', 'DT_RUNPATH', 'DT_SONAME'])
-+        ['DT_NEEDED', 'DT_RPATH', 'DT_RUNPATH', 'DT_SONAME',
-+         'DT_SUNW_FILTER'])
- 
-     def __init__(self, entry, elffile):
-         self.entry = entry
-diff -r 249a5ca85159 elftools/elf/elffile.py
---- a/elftools/elf/elffile.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/elf/elffile.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -12,9 +12,13 @@
- from ..construct import ConstructError
- from .structs import ELFStructs
- from .sections import (
--        Section, StringTableSection, SymbolTableSection, NullSection)
-+        Section, StringTableSection, SymbolTableSection,
-+        SUNWSyminfoTableSection, NullSection)
- from .dynamic import DynamicSection, DynamicSegment
- from .relocation import RelocationSection, RelocationHandler
-+from .gnuversions import (
-+        GNUVerNeedSection, GNUVerDefSection,
-+        GNUVerSymSection)
- from .segments import Segment, InterpSegment
- from .enums import ENUM_RELOC_TYPE_i386, ENUM_RELOC_TYPE_x64
- from ..dwarf.dwarfinfo import DWARFInfo, DebugSectionDescriptor, DwarfConfig
-@@ -125,15 +129,15 @@
-         #
-         debug_sections = {}
-         for secname in (b'.debug_info', b'.debug_abbrev', b'.debug_str',
--                        b'.debug_line', b'.debug_frame', b'.debug_loc',
--                        b'.debug_ranges'):
-+                        b'.debug_line', b'.debug_frame',
-+                        b'.debug_loc', b'.debug_ranges'):
-             section = self.get_section_by_name(secname)
-             if section is None:
-                 debug_sections[secname] = None
-             else:
-                 debug_sections[secname] = self._read_dwarf_section(
--                        section,
--                        relocate_dwarf_sections)
-+                    section,
-+                    relocate_dwarf_sections)
- 
-         return DWARFInfo(
-                 config=DwarfConfig(
-@@ -143,6 +147,8 @@
-                 debug_info_sec=debug_sections[b'.debug_info'],
-                 debug_abbrev_sec=debug_sections[b'.debug_abbrev'],
-                 debug_frame_sec=debug_sections[b'.debug_frame'],
-+                # TODO(eliben): reading of eh_frame is not hooked up yet
-+                eh_frame_sec=None,
-                 debug_str_sec=debug_sections[b'.debug_str'],
-                 debug_loc_sec=debug_sections[b'.debug_loc'],
-                 debug_ranges_sec=debug_sections[b'.debug_ranges'],
-@@ -243,6 +249,14 @@
-             return NullSection(section_header, name, self.stream)
-         elif sectype in ('SHT_SYMTAB', 'SHT_DYNSYM'):
-             return self._make_symbol_table_section(section_header, name)
-+        elif sectype == 'SHT_SUNW_syminfo':
-+            return self._make_sunwsyminfo_table_section(section_header, name)
-+        elif sectype == 'SHT_GNU_verneed':
-+            return self._make_gnu_verneed_section(section_header, name)
-+        elif sectype == 'SHT_GNU_verdef':
-+            return self._make_gnu_verdef_section(section_header, name)
-+        elif sectype == 'SHT_GNU_versym':
-+            return self._make_gnu_versym_section(section_header, name)
-         elif sectype in ('SHT_REL', 'SHT_RELA'):
-             return RelocationSection(
-                 section_header, name, self.stream, self)
-@@ -261,6 +275,46 @@
-             elffile=self,
-             stringtable=strtab_section)
- 
-+    def _make_sunwsyminfo_table_section(self, section_header, name):
-+        """ Create a SUNWSyminfoTableSection
-+        """
-+        linked_strtab_index = section_header['sh_link']
-+        strtab_section = self.get_section(linked_strtab_index)
-+        return SUNWSyminfoTableSection(
-+            section_header, name, self.stream,
-+            elffile=self,
-+            symboltable=strtab_section)
-+
-+    def _make_gnu_verneed_section(self, section_header, name):
-+        """ Create a GNUVerNeedSection
-+        """
-+        linked_strtab_index = section_header['sh_link']
-+        strtab_section = self.get_section(linked_strtab_index)
-+        return GNUVerNeedSection(
-+            section_header, name, self.stream,
-+            elffile=self,
-+            stringtable=strtab_section)
-+
-+    def _make_gnu_verdef_section(self, section_header, name):
-+        """ Create a GNUVerDefSection
-+        """
-+        linked_strtab_index = section_header['sh_link']
-+        strtab_section = self.get_section(linked_strtab_index)
-+        return GNUVerDefSection(
-+            section_header, name, self.stream,
-+            elffile=self,
-+            stringtable=strtab_section)
-+
-+    def _make_gnu_versym_section(self, section_header, name):
-+        """ Create a GNUVerSymSection
-+        """
-+        linked_strtab_index = section_header['sh_link']
-+        strtab_section = self.get_section(linked_strtab_index)
-+        return GNUVerSymSection(
-+            section_header, name, self.stream,
-+            elffile=self,
-+            symboltable=strtab_section)
-+
-     def _get_segment_header(self, n):
-         """ Find the header of segment #n, parse it and return the struct
-         """
-diff -r 249a5ca85159 elftools/elf/enums.py
---- a/elftools/elf/enums.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/elf/enums.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -184,14 +184,15 @@
-     SHT_NUM=19,
-     SHT_LOOS=0x60000000,
-     SHT_GNU_HASH=0x6ffffff6,
--    SHT_GNU_verdef=0x6ffffffd,
--    SHT_GNU_verneed=0x6ffffffe,
--    SHT_GNU_versym=0x6fffffff,
-+    SHT_GNU_verdef=0x6ffffffd,  # also SHT_SUNW_verdef
-+    SHT_GNU_verneed=0x6ffffffe, # also SHT_SUNW_verneed
-+    SHT_GNU_versym=0x6fffffff,  # also SHT_SUNW_versym
-     SHT_LOPROC=0x70000000,
-     SHT_HIPROC=0x7fffffff,
-     SHT_LOUSER=0x80000000,
-     SHT_HIUSER=0xffffffff,
-     SHT_AMD64_UNWIND=0x70000001,
-+    SHT_SUNW_syminfo=0x6ffffffc,
-     _default_=Pass,
- )
- 
-@@ -301,6 +302,24 @@
-     DT_PREINIT_ARRAYSZ=33,
-     DT_NUM=34,
-     DT_LOOS=0x6000000d,
-+    DT_SUNW_AUXILIARY=0x6000000d,
-+    DT_SUNW_RTLDINF=0x6000000e,
-+    DT_SUNW_FILTER=0x6000000f,
-+    DT_SUNW_CAP=0x60000010,
-+    DT_SUNW_SYMTAB=0x60000011,
-+    DT_SUNW_SYMSZ=0x60000012,
-+    DT_SUNW_ENCODING=0x60000013,
-+    DT_SUNW_SORTENT=0x60000013,
-+    DT_SUNW_SYMSORT=0x60000014,
-+    DT_SUNW_SYMSORTSZ=0x60000015,
-+    DT_SUNW_TLSSORT=0x60000016,
-+    DT_SUNW_TLSSORTSZ=0x60000017,
-+    DT_SUNW_CAPINFO=0x60000018,
-+    DT_SUNW_STRPAD=0x60000019,
-+    DT_SUNW_CAPCHAIN=0x6000001a,
-+    DT_SUNW_LDMACH=0x6000001b,
-+    DT_SUNW_CAPCHAINENT=0x6000001d,
-+    DT_SUNW_CAPCHAINSZ=0x6000001f,
-     DT_HIOS=0x6ffff000,
-     DT_LOPROC=0x70000000,
-     DT_HIPROC=0x7fffffff,
-@@ -428,3 +447,29 @@
-     _default_=Pass,
- )
- 
-+# Sunw Syminfo Bound To special values
-+ENUM_SUNW_SYMINFO_BOUNDTO = dict(
-+    SYMINFO_BT_SELF=0xffff,
-+    SYMINFO_BT_PARENT=0xfffe,
-+    SYMINFO_BT_NONE=0xfffd,
-+    SYMINFO_BT_EXTERN=0xfffc,
-+    _default_=Pass,
-+)
-+
-+# Versym section, version dependency index 
-+ENUM_VERSYM = dict(
-+    VER_NDX_LOCAL=0,
-+    VER_NDX_GLOBAL=1,
-+    VER_NDX_LORESERVE=0xff00,
-+    VER_NDX_ELIMINATE=0xff01,
-+    _default_=Pass,
-+)
-+# Sunw Syminfo Bound To special values
-+ENUM_SUNW_SYMINFO_BOUNDTO = dict(
-+    SYMINFO_BT_SELF=0xffff,
-+    SYMINFO_BT_PARENT=0xfffe,
-+    SYMINFO_BT_NONE=0xfffd,
-+    SYMINFO_BT_EXTERN=0xfffc,
-+    _default_=Pass,
-+)
-+
-diff -r 249a5ca85159 elftools/elf/gnuversions.py
---- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-+++ b/elftools/elf/gnuversions.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -0,0 +1,228 @@
-+#------------------------------------------------------------------------------
-+# elftools: elf/gnuversions.py
-+#
-+# ELF sections
-+#
-+# Yann Rouillard (yann at pleiades.fr.eu.org)
-+# This code is in the public domain
-+#------------------------------------------------------------------------------
-+from ..construct import CString
-+from ..common.utils import struct_parse, elf_assert
-+from .sections import Section, Symbol
-+
-+
-+class Version(object):
-+    """ Version object - representing a version definition or dependency
-+        entry from a "Version Needed" or a "Version Dependency" table section.
-+
-+        This kind of entry contains a pointer to an array of auxiliary entries
-+        that store the information about version names or dependencies.
-+        These entries are not stored in this object and should be accessed
-+        through the appropriate method of a section object which will return
-+        an iterator of VersionAuxiliary objects.
-+
-+        Similarly to Section objects, allows dictionary-like access to
-+        verdef/verneed entry
-+    """
-+    def __init__(self, entry, name=None):
-+        self.entry = entry
-+        self.name = name
-+
-+    def __getitem__(self, name):
-+        """ Implement dict-like access to entry
-+        """
-+        return self.entry[name]
-+
-+
-+class VersionAuxiliary(object):
-+    """ Version Auxiliary object - representing an auxiliary entry of a version
-+        definition or dependency entry
-+
-+        Similarly to Section objects, allows dictionary-like access to the
-+        verdaux/vernaux entry
-+    """
-+    def __init__(self, entry, name):
-+        self.entry = entry
-+        self.name = name
-+
-+    def __getitem__(self, name):
-+        """ Implement dict-like access to entries
-+        """
-+        return self.entry[name]
-+
-+
-+class GNUVersionSection(Section):
-+    """ Common ancestor class for ELF SUNW|GNU Version Needed/Dependency
-+        sections class which contains shareable code
-+    """
-+
-+    def __init__(self, header, name, stream, elffile, stringtable,
-+                 field_prefix, version_struct, version_auxiliaries_struct):
-+        super(GNUVersionSection, self).__init__(header, name, stream)
-+        self.elffile = elffile
-+        self.stringtable = stringtable
-+        self.field_prefix = field_prefix
-+        self.version_struct = version_struct
-+        self.version_auxiliaries_struct = version_auxiliaries_struct
-+
-+    def num_versions(self):
-+        """ Number of version entries in the section
-+        """
-+        return self['sh_info']
-+
-+    def _field_name(self, name, auxiliary=False):
-+        """ Return the real field's name of version or a version auxiliary
-+            entry
-+        """
-+        middle = 'a_' if auxiliary else '_'
-+        return self.field_prefix + middle + name
-+
-+    def _iter_version_auxiliaries(self, entry_offset, count):
-+        """ Yield all auxiliary entries of a version entry
-+        """
-+        name_field = self._field_name('name', auxiliary=True)
-+        next_field = self._field_name('next', auxiliary=True)
-+
-+        for _ in range(count):
-+            entry = struct_parse(
-+                        self.version_auxiliaries_struct,
-+                        self.stream,
-+                        stream_pos=entry_offset)
-+
-+            name = self.stringtable.get_string(entry[name_field])
-+            version_aux = VersionAuxiliary(entry, name)
-+            yield version_aux
-+
-+            entry_offset += entry[next_field]
-+
-+    def iter_versions(self):
-+        """ Yield all the version entries in the section
-+            Each time it returns the main version structure
-+            and an iterator to walk through its auxiliaries entries
-+        """
-+        aux_field = self._field_name('aux')
-+        count_field = self._field_name('cnt')
-+        next_field = self._field_name('next')
-+
-+        entry_offset = self['sh_offset']
-+        for _ in range(self.num_versions()):
-+            entry = struct_parse(
-+                self.version_struct,
-+                self.stream,
-+                stream_pos=entry_offset)
-+
-+            elf_assert(entry[count_field] > 0,
-+                'Expected number of version auxiliary entries (%s) to be > 0'
-+                'for the following version entry: %s' % (
-+                    count_field, str(entry)))
-+
-+            version = Version(entry)
-+            aux_entries_offset = entry_offset + entry[aux_field]
-+            version_auxiliaries_iter = self._iter_version_auxiliaries(
-+                    aux_entries_offset, entry[count_field])
-+
-+            yield version, version_auxiliaries_iter
-+
-+            entry_offset += entry[next_field]
-+
-+
-+class GNUVerNeedSection(GNUVersionSection):
-+    """ ELF SUNW or GNU Version Needed table section.
-+        Has an associated StringTableSection that's passed in the constructor.
-+    """
-+    def __init__(self, header, name, stream, elffile, stringtable):
-+        super(GNUVerNeedSection, self).__init__(
-+                header, name, stream, elffile, stringtable, 'vn',
-+                elffile.structs.Elf_Verneed, elffile.structs.Elf_Vernaux)
-+        self._has_indexes = None
-+
-+    def has_indexes(self):
-+        """ Return True if at least one version definition entry has an index
-+            that is stored in the vna_other field.
-+            This information is used for symbol versioning
-+        """
-+        if self._has_indexes is None:
-+            self._has_indexes = False
-+            for _, vernaux_iter in self.iter_versions():
-+                for vernaux in vernaux_iter:
-+                    if vernaux['vna_other']:
-+                        self._has_indexes = True
-+                        break
-+
-+        return self._has_indexes
-+
-+    def iter_versions(self):
-+        for verneed, vernaux in super(GNUVerNeedSection, self).iter_versions():
-+            verneed.name = self.stringtable.get_string(verneed['vn_file'])
-+            yield verneed, vernaux
-+
-+    def get_version(self, index):
-+        """ Get the version information located at index #n in the table
-+            Return boths the verneed structure and the vernaux structure
-+            that contains the name of the version
-+        """
-+        for verneed, vernaux_iter in self.iter_versions():
-+            for vernaux in vernaux_iter:
-+                if vernaux['vna_other'] == index:
-+                    return verneed, vernaux
-+
-+        return None
-+
-+
-+class GNUVerDefSection(GNUVersionSection):
-+    """ ELF SUNW or GNU Version Definition table section.
-+        Has an associated StringTableSection that's passed in the constructor.
-+    """
-+    def __init__(self, header, name, stream, elffile, stringtable):
-+        super(GNUVerDefSection, self).__init__(
-+                header, name, stream, elffile, stringtable, 'vd',
-+                elffile.structs.Elf_Verdef, elffile.structs.Elf_Verdaux)
-+
-+    def get_version(self, index):
-+        """ Get the version information located at index #n in the table
-+            Return boths the verdef structure and an iterator to retrieve
-+            both the version names and dependencies in the form of
-+            verdaux entries
-+        """
-+        for verdef, verdaux_iter in self.iter_versions():
-+            if verdef['vd_ndx'] == index:
-+                return verdef, verdaux_iter
-+
-+        return None
-+
-+
-+class GNUVerSymSection(Section):
-+    """ ELF SUNW or GNU Versym table section.
-+        Has an associated SymbolTableSection that's passed in the constructor.
-+    """
-+    def __init__(self, header, name, stream, elffile, symboltable):
-+        super(GNUVerSymSection, self).__init__(header, name, stream)
-+        self.elffile = elffile
-+        self.elfstructs = self.elffile.structs
-+        self.symboltable = symboltable
-+
-+    def num_symbols(self):
-+        """ Number of symbols in the table
-+        """
-+        return self['sh_size'] // self['sh_entsize']
-+
-+    def get_symbol(self, n):
-+        """ Get the symbol at index #n from the table (Symbol object)
-+            It begins at 1 and not 0 since the first entry is used to
-+            store the current version of the syminfo table
-+        """
-+        # Grab the symbol's entry from the stream
-+        entry_offset = self['sh_offset'] + n * self['sh_entsize']
-+        entry = struct_parse(
-+            self.elfstructs.Elf_Versym,
-+            self.stream,
-+            stream_pos=entry_offset)
-+        # Find the symbol name in the associated symbol table
-+        name = self.symboltable.get_symbol(n).name
-+        return Symbol(entry, name)
-+
-+    def iter_symbols(self):
-+        """ Yield all the symbols in the table
-+        """
-+        for i in range(self.num_symbols()):
-+            yield self.get_symbol(i)
-diff -r 249a5ca85159 elftools/elf/relocation.py
---- a/elftools/elf/relocation.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/elf/relocation.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -202,6 +202,9 @@
-     def _reloc_calc_sym_plus_addend(value, sym_value, offset, addend=0):
-         return sym_value + addend
- 
-+    def _reloc_calc_sym_plus_addend_pcrel(value, sym_value, offset, addend=0):
-+        return sym_value + addend - offset
-+
-     _RELOCATION_RECIPES_X86 = {
-         ENUM_RELOC_TYPE_i386['R_386_NONE']: _RELOCATION_RECIPE_TYPE(
-             bytesize=4, has_addend=False, calc_func=_reloc_calc_identity),
-@@ -218,6 +221,9 @@
-             bytesize=8, has_addend=True, calc_func=_reloc_calc_identity),
-         ENUM_RELOC_TYPE_x64['R_X86_64_64']: _RELOCATION_RECIPE_TYPE(
-             bytesize=8, has_addend=True, calc_func=_reloc_calc_sym_plus_addend),
-+        ENUM_RELOC_TYPE_x64['R_X86_64_PC32']: _RELOCATION_RECIPE_TYPE(
-+            bytesize=8, has_addend=True,
-+            calc_func=_reloc_calc_sym_plus_addend_pcrel),
-         ENUM_RELOC_TYPE_x64['R_X86_64_32']: _RELOCATION_RECIPE_TYPE(
-             bytesize=4, has_addend=True, calc_func=_reloc_calc_sym_plus_addend),
-         ENUM_RELOC_TYPE_x64['R_X86_64_32S']: _RELOCATION_RECIPE_TYPE(
-diff -r 249a5ca85159 elftools/elf/sections.py
---- a/elftools/elf/sections.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/elf/sections.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -13,7 +13,7 @@
- class Section(object):
-     """ Base class for ELF sections. Also used for all sections types that have
-         no special functionality.
--        
-+
-         Allows dictionary-like access to the section header. For example:
-          > sec = Section(...)
-          > sec['sh_type']  # section type
-@@ -22,7 +22,7 @@
-         self.header = header
-         self.name = name
-         self.stream = stream
--    
-+
-     def data(self):
-         """ The section data from the file.
-         """
-@@ -33,7 +33,7 @@
-         """ Is this a null section?
-         """
-         return False
--        
-+
-     def __getitem__(self, name):
-         """ Implement dict-like access to header entries
-         """
-@@ -51,14 +51,14 @@
- 
-     def is_null(self):
-         return True
--        
-+
- 
- class StringTableSection(Section):
-     """ ELF string table section.
-     """
-     def __init__(self, header, name, stream):
-         super(StringTableSection, self).__init__(header, name, stream)
--        
-+
-     def get_string(self, offset):
-         """ Get the string stored at the given offset in this string table.
-         """
-@@ -85,7 +85,7 @@
-         """ Number of symbols in the table
-         """
-         return self['sh_size'] // self['sh_entsize']
--        
-+
-     def get_symbol(self, n):
-         """ Get the symbol at index #n from the table (Symbol object)
-         """
-@@ -123,3 +123,38 @@
-         return self.entry[name]
- 
- 
-+class SUNWSyminfoTableSection(Section):
-+    """ ELF .SUNW Syminfo table section.
-+        Has an associated SymbolTableSection that's passed in the constructor.
-+    """
-+    def __init__(self, header, name, stream, elffile, symboltable):
-+        super(SUNWSyminfoTableSection, self).__init__(header, name, stream)
-+        self.elffile = elffile
-+        self.elfstructs = self.elffile.structs
-+        self.symboltable = symboltable
-+
-+    def num_symbols(self):
-+        """ Number of symbols in the table
-+        """
-+        return self['sh_size'] // self['sh_entsize'] - 1
-+
-+    def get_symbol(self, n):
-+        """ Get the symbol at index #n from the table (Symbol object).
-+            It begins at 1 and not 0 since the first entry is used to
-+            store the current version of the syminfo table.
-+        """
-+        # Grab the symbol's entry from the stream
-+        entry_offset = self['sh_offset'] + n * self['sh_entsize']
-+        entry = struct_parse(
-+            self.elfstructs.Elf_Sunw_Syminfo,
-+            self.stream,
-+            stream_pos=entry_offset)
-+        # Find the symbol name in the associated symbol table
-+        name = self.symboltable.get_symbol(n).name
-+        return Symbol(entry, name)
-+
-+    def iter_symbols(self):
-+        """ Yield all the symbols in the table
-+        """
-+        for i in range(1, self.num_symbols() + 1):
-+            yield self.get_symbol(i)
-diff -r 249a5ca85159 elftools/elf/structs.py
---- a/elftools/elf/structs.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/elftools/elf/structs.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -19,20 +19,20 @@
- 
- class ELFStructs(object):
-     """ Accessible attributes:
--    
-+
-             Elf_{byte|half|word|word64|addr|offset|sword|xword|xsword}:
--                Data chunks, as specified by the ELF standard, adjusted for 
-+                Data chunks, as specified by the ELF standard, adjusted for
-                 correct endianness and word-size.
- 
-             Elf_Ehdr:
-                 ELF file header
--            
-+
-             Elf_Phdr:
-                 Program header
--            
-+
-             Elf_Shdr:
-                 Section header
--            
-+
-             Elf_Sym:
-                 Symbol table entry
- 
-@@ -42,9 +42,9 @@
-     def __init__(self, little_endian=True, elfclass=32):
-         assert elfclass == 32 or elfclass == 64
-         self.little_endian = little_endian
--        self.elfclass = elfclass        
-+        self.elfclass = elfclass
-         self._create_structs()
--    
-+
-     def _create_structs(self):
-         if self.little_endian:
-             self.Elf_byte = ULInt8
-@@ -66,14 +66,18 @@
-             self.Elf_sword = SBInt32
-             self.Elf_xword = UBInt32 if self.elfclass == 32 else UBInt64
-             self.Elf_sxword = SBInt32 if self.elfclass == 32 else SBInt64
--        
-+
-         self._create_ehdr()
-         self._create_phdr()
-         self._create_shdr()
-         self._create_sym()
-         self._create_rel()
-         self._create_dyn()
--    
-+        self._create_sunw_syminfo()
-+        self._create_gnu_verneed()
-+        self._create_gnu_verdef()
-+        self._create_gnu_versym()
-+
-     def _create_ehdr(self):
-         self.Elf_Ehdr = Struct('Elf_Ehdr',
-             Struct('e_ident',
-@@ -99,7 +103,7 @@
-             self.Elf_half('e_shnum'),
-             self.Elf_half('e_shstrndx'),
-         )
--    
-+
-     def _create_phdr(self):
-         if self.elfclass == 32:
-             self.Elf_Phdr = Struct('Elf_Phdr',
-@@ -122,8 +126,8 @@
-                 self.Elf_xword('p_filesz'),
-                 self.Elf_xword('p_memsz'),
-                 self.Elf_xword('p_align'),
--            )   
--        
-+            )
-+
-     def _create_shdr(self):
-         self.Elf_Shdr = Struct('Elf_Shdr',
-             self.Elf_word('sh_name'),
-@@ -137,7 +141,7 @@
-             self.Elf_xword('sh_addralign'),
-             self.Elf_xword('sh_entsize'),
-         )
--    
-+
-     def _create_rel(self):
-         # r_info is also taken apart into r_info_sym and r_info_type.
-         # This is done in Value to avoid endianity issues while parsing.
-@@ -203,5 +207,50 @@
-                 self.Elf_xword('st_size'),
-             )
- 
-+    def _create_sunw_syminfo(self):
-+        self.Elf_Sunw_Syminfo = Struct('Elf_Sunw_Syminfo',
-+            Enum(self.Elf_half('si_boundto'), **ENUM_SUNW_SYMINFO_BOUNDTO),
-+            self.Elf_half('si_flags'),
-+        )
- 
-+    def _create_gnu_verneed(self):
-+        # Structure of "version needed" entries is documented in
-+        # Oracle "Linker and Libraries Guide", Chapter 7 Object File Format
-+        self.Elf_Verneed = Struct('Elf_Verneed',
-+            self.Elf_half('vn_version'),
-+            self.Elf_half('vn_cnt'),
-+            self.Elf_word('vn_file'),
-+            self.Elf_word('vn_aux'),
-+            self.Elf_word('vn_next'),
-+        )
-+        self.Elf_Vernaux = Struct('Elf_Vernaux',
-+            self.Elf_word('vna_hash'),
-+            self.Elf_half('vna_flags'),
-+            self.Elf_half('vna_other'),
-+            self.Elf_word('vna_name'),
-+            self.Elf_word('vna_next'),
-+        )
- 
-+    def _create_gnu_verdef(self):
-+        # Structure off "version definition" entries are documented in
-+        # Oracle "Linker and Libraries Guide", Chapter 7 Object File Format
-+        self.Elf_Verdef = Struct('Elf_Verdef',
-+            self.Elf_half('vd_version'),
-+            self.Elf_half('vd_flags'),
-+            self.Elf_half('vd_ndx'),
-+            self.Elf_half('vd_cnt'),
-+            self.Elf_word('vd_hash'),
-+            self.Elf_word('vd_aux'),
-+            self.Elf_word('vd_next'),
-+        )
-+        self.Elf_Verdaux = Struct('Elf_Verdaux',
-+            self.Elf_word('vda_name'),
-+            self.Elf_word('vda_next'),
-+        )
-+
-+    def _create_gnu_versym(self):
-+        # Structure off "version symbol" entries are documented in
-+        # Oracle "Linker and Libraries Guide", Chapter 7 Object File Format
-+        self.Elf_Versym = Struct('Elf_Versym',
-+            Enum(self.Elf_half('ndx'), **ENUM_VERSYM),
-+        )
-diff -r 249a5ca85159 scripts/readelf.py
---- a/scripts/readelf.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/scripts/readelf.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -25,6 +25,10 @@
- from elftools.elf.enums import ENUM_D_TAG
- from elftools.elf.segments import InterpSegment
- from elftools.elf.sections import SymbolTableSection
-+from elftools.elf.gnuversions import (
-+    GNUVerSymSection, GNUVerDefSection,
-+    GNUVerNeedSection,
-+    )
- from elftools.elf.relocation import RelocationSection
- from elftools.elf.descriptions import (
-     describe_ei_class, describe_ei_data, describe_ei_version,
-@@ -33,6 +37,7 @@
-     describe_sh_type, describe_sh_flags,
-     describe_symbol_type, describe_symbol_bind, describe_symbol_visibility,
-     describe_symbol_shndx, describe_reloc_type, describe_dyn_tag,
-+    describe_ver_flags,
-     )
- from elftools.dwarf.dwarfinfo import DWARFInfo
- from elftools.dwarf.descriptions import (
-@@ -61,6 +66,8 @@
-         # Lazily initialized if a debug dump is requested
-         self._dwarfinfo = None
- 
-+        self._versioninfo = None
-+
-     def display_file_header(self):
-         """ Display the ELF file header
-         """
-@@ -254,6 +261,8 @@
-     def display_symbol_tables(self):
-         """ Display the symbol tables contained in the file
-         """
-+        self._init_versioninfo()
-+
-         for section in self.elffile.iter_sections():
-             if not isinstance(section, SymbolTableSection):
-                 continue
-@@ -272,16 +281,37 @@
-                 self._emitline('   Num:    Value          Size Type    Bind   Vis      Ndx Name')
- 
-             for nsym, symbol in enumerate(section.iter_symbols()):
-+
-+                version_info = ''
-+                # readelf doesn't display version info for Solaris versioning
-+                if (section['sh_type'] == 'SHT_DYNSYM' and
-+                        self._versioninfo['type'] == 'GNU'):
-+                    version = self._symbol_version(nsym)
-+                    if (version['name'] != bytes2str(symbol.name) and
-+                        version['index'] not in ('VER_NDX_LOCAL',
-+                                                 'VER_NDX_GLOBAL')):
-+                        if version['filename']:
-+                            # external symbol
-+                            version_info = '@%(name)s (%(index)i)' % version
-+                        else:
-+                            # internal symbol
-+                            if version['hidden']:
-+                                version_info = '@%(name)s' % version
-+                            else:
-+                                version_info = '@@%(name)s' % version
-+
-                 # symbol names are truncated to 25 chars, similarly to readelf
--                self._emitline('%6d: %s %5d %-7s %-6s %-7s %4s %.25s' % (
-+                self._emitline('%6d: %s %5d %-7s %-6s %-7s %4s %.25s%s' % (
-                     nsym,
--                    self._format_hex(symbol['st_value'], fullhex=True, lead0x=False),
-+                    self._format_hex(
-+                        symbol['st_value'], fullhex=True, lead0x=False),
-                     symbol['st_size'],
-                     describe_symbol_type(symbol['st_info']['type']),
-                     describe_symbol_bind(symbol['st_info']['bind']),
-                     describe_symbol_visibility(symbol['st_other']['visibility']),
-                     describe_symbol_shndx(symbol['st_shndx']),
--                    bytes2str(symbol.name)))
-+                    bytes2str(symbol.name),
-+                    version_info))
- 
-     def display_dynamic_tags(self):
-         """ Display the dynamic tags contained in the file
-@@ -384,6 +414,111 @@
-         if not has_relocation_sections:
-             self._emitline('\nThere are no relocations in this file.')
- 
-+    def display_version_info(self):
-+        """ Display the version info contained in the file
-+        """
-+        self._init_versioninfo()
-+
-+        if not self._versioninfo['type']:
-+            self._emitline("\nNo version information found in this file.")
-+            return
-+
-+        for section in self.elffile.iter_sections():
-+            if isinstance(section, GNUVerSymSection):
-+                self._print_version_section_header(
-+                    section, 'Version symbols', lead0x=False)
-+
-+                num_symbols = section.num_symbols()
-+    
-+                # Symbol version info are printed four by four entries 
-+                for idx_by_4 in range(0, num_symbols, 4):
-+
-+                    self._emit('  %03x:' % idx_by_4)
-+
-+                    for idx in range(idx_by_4, min(idx_by_4 + 4, num_symbols)):
-+
-+                        symbol_version = self._symbol_version(idx)
-+                        if symbol_version['index'] == 'VER_NDX_LOCAL':
-+                            version_index = 0
-+                            version_name = '(*local*)'
-+                        elif symbol_version['index'] == 'VER_NDX_GLOBAL':
-+                            version_index = 1
-+                            version_name = '(*global*)'
-+                        else:
-+                            version_index = symbol_version['index']
-+                            version_name = '(%(name)s)' % symbol_version
-+
-+                        visibility = 'h' if symbol_version['hidden'] else ' '
-+
-+                        self._emit('%4x%s%-13s' % (
-+                            version_index, visibility, version_name))
-+
-+                    self._emitline()
-+
-+            elif isinstance(section, GNUVerDefSection):
-+                self._print_version_section_header(
-+                    section, 'Version definition', indent=2)
-+
-+                offset = 0
-+                for verdef, verdaux_iter in section.iter_versions():
-+                    verdaux = next(verdaux_iter)
-+
-+                    name = verdaux.name
-+                    if verdef['vd_flags']:
-+                        flags = describe_ver_flags(verdef['vd_flags'])
-+                        # Mimic exactly the readelf output
-+                        flags += ' '
-+                    else:
-+                        flags = 'none'
-+
-+                    self._emitline('  %s: Rev: %i  Flags: %s  Index: %i'
-+                                   '  Cnt: %i  Name: %s' % (
-+                            self._format_hex(offset, fieldsize=6,
-+                                             alternate=True),
-+                            verdef['vd_version'], flags, verdef['vd_ndx'],
-+                            verdef['vd_cnt'], bytes2str(name)))
-+
-+                    verdaux_offset = (
-+                            offset + verdef['vd_aux'] + verdaux['vda_next'])
-+                    for idx, verdaux in enumerate(verdaux_iter, start=1):
-+                        self._emitline('  %s: Parent %i: %s' %
-+                            (self._format_hex(verdaux_offset, fieldsize=4),
-+                                              idx, bytes2str(verdaux.name)))
-+                        verdaux_offset += verdaux['vda_next']
-+
-+                    offset += verdef['vd_next']
-+
-+            elif isinstance(section, GNUVerNeedSection):
-+                self._print_version_section_header(section, 'Version needs')
-+
-+                offset = 0
-+                for verneed, verneed_iter in section.iter_versions():
-+
-+                    self._emitline('  %s: Version: %i  File: %s  Cnt: %i' % (
-+                            self._format_hex(offset, fieldsize=6,
-+                                             alternate=True),
-+                            verneed['vn_version'], bytes2str(verneed.name),
-+                            verneed['vn_cnt']))
-+
-+                    vernaux_offset = offset + verneed['vn_aux']
-+                    for idx, vernaux in enumerate(verneed_iter, start=1):
-+                        if vernaux['vna_flags']:
-+                            flags = describe_ver_flags(vernaux['vna_flags'])
-+                            # Mimic exactly the readelf output
-+                            flags += ' '
-+                        else:
-+                            flags = 'none'
-+
-+                        self._emitline(
-+                            '  %s:   Name: %s  Flags: %s  Version: %i' % (
-+                                self._format_hex(vernaux_offset, fieldsize=4),
-+                                bytes2str(vernaux.name), flags,
-+                                vernaux['vna_other']))
-+
-+                        vernaux_offset += vernaux['vna_next']
-+
-+                    offset += verneed['vn_next']
-+
-     def display_hex_dump(self, section_spec):
-         """ Display a hex dump of a section. section_spec is either a section
-             number or a name.
-@@ -486,7 +621,8 @@
-         else:
-             self._emitline('debug dump not yet supported for "%s"' % dump_what)
- 
--    def _format_hex(self, addr, fieldsize=None, fullhex=False, lead0x=True):
-+    def _format_hex(self, addr, fieldsize=None, fullhex=False, lead0x=True,
-+                    alternate=False):
-         """ Format an address into a hexadecimal string.
- 
-             fieldsize:
-@@ -501,7 +637,20 @@
- 
-             lead0x:
-                 If True, leading 0x is added
-+
-+            alternate:
-+                If True, override lead0x to emulate the alternate
-+                hexadecimal form specified in format string with the #
-+                character: only non-zero values are prefixed with 0x.
-+                This form is used by readelf.
-         """
-+        if alternate:
-+            if addr == 0:
-+                lead0x = False
-+            else:
-+                lead0x = True
-+                fieldsize -= 2
-+
-         s = '0x' if lead0x else ''
-         if fullhex:
-             fieldsize = 8 if self.elffile.elfclass == 32 else 16
-@@ -511,6 +660,97 @@
-             field = '%' + '0%sx' % fieldsize
-         return s + field % addr
- 
-+    def _print_version_section_header(self, version_section, name, lead0x=True,
-+                                      indent=1):
-+        """ Print a section header of one version related section (versym,
-+            verneed or verdef) with some options to accomodate readelf
-+            little differences between each header (e.g. indentation
-+            and 0x prefixing).
-+        """
-+        if hasattr(version_section, 'num_versions'):
-+            num_entries = version_section.num_versions()
-+        else:
-+            num_entries = version_section.num_symbols()
-+
-+        self._emitline("\n%s section '%s' contains %s entries:" %
-+            (name, bytes2str(version_section.name), num_entries))
-+        self._emitline('%sAddr: %s  Offset: %s  Link: %i (%s)' % (
-+            ' ' * indent,
-+            self._format_hex(
-+                version_section['sh_addr'], fieldsize=16, lead0x=lead0x),
-+            self._format_hex(
-+                version_section['sh_offset'], fieldsize=6, lead0x=True),
-+            version_section['sh_link'],
-+            bytes2str(
-+                self.elffile.get_section(version_section['sh_link']).name)
-+            )
-+        )
-+
-+    def _init_versioninfo(self):
-+        """ Search and initialize informations about version related sections
-+            and the kind of versioning used (GNU or Solaris).
-+        """
-+        if self._versioninfo is not None:
-+            return
-+
-+        self._versioninfo = {'versym': None, 'verdef': None,
-+                             'verneed': None, 'type': None}
-+
-+        for section in self.elffile.iter_sections():
-+            if isinstance(section, GNUVerSymSection):
-+                self._versioninfo['versym'] = section
-+            elif isinstance(section, GNUVerDefSection):
-+                self._versioninfo['verdef'] = section
-+            elif isinstance(section, GNUVerNeedSection):
-+                self._versioninfo['verneed'] = section
-+            elif isinstance(section, DynamicSection):
-+                for tag in section.iter_tags():
-+                    if tag['d_tag'] == 'DT_VERSYM':
-+                        self._versioninfo['type'] = 'GNU'
-+                        break
-+
-+        if not self._versioninfo['type'] and (
-+                self._versioninfo['verneed'] or self._versioninfo['verdef']):
-+            self._versioninfo['type'] = 'Solaris'
-+
-+    def _symbol_version(self, nsym):
-+        """ Return a dict containing information on the
-+                   or None if no version information is available
-+        """
-+        self._init_versioninfo()
-+
-+        symbol_version = dict.fromkeys(('index', 'name', 'filename', 'hidden'))
-+
-+        if (not self._versioninfo['versym'] or
-+                nsym >= self._versioninfo['versym'].num_symbols()):
-+            return None
-+
-+        symbol = self._versioninfo['versym'].get_symbol(nsym)
-+        index = symbol.entry['ndx']
-+        if not index in ('VER_NDX_LOCAL', 'VER_NDX_GLOBAL'):
-+            index = int(index)
-+
-+            if self._versioninfo['type'] == 'GNU':
-+                # In GNU versioning mode, the highest bit is used to
-+                # store wether the symbol is hidden or not
-+                if index & 0x8000:
-+                    index &= ~0x8000
-+                    symbol_version['hidden'] = True
-+
-+            if (self._versioninfo['verdef'] and
-+                    index <= self._versioninfo['verdef'].num_versions()):
-+                _, verdaux_iter = \
-+                        self._versioninfo['verdef'].get_version(index)
-+                symbol_version['name'] = bytes2str(next(verdaux_iter).name)
-+            else:
-+                verneed, vernaux = \
-+                        self._versioninfo['verneed'].get_version(index)
-+                symbol_version['name'] = bytes2str(vernaux.name)
-+                symbol_version['filename'] = bytes2str(verneed.name)
-+
-+        symbol_version['index'] = index
-+        return symbol_version
-+
-     def _section_from_spec(self, spec):
-         """ Retrieve a section given a "spec" (either number or name).
-             Return None if no such section exists in the file.
-@@ -802,6 +1042,9 @@
-     optparser.add_option('-p', '--string-dump',
-             action='store', dest='show_string_dump', metavar='<number|name>',
-             help='Dump the contents of section <number|name> as strings')
-+    optparser.add_option('-V', '--version-info',
-+            action='store_true', dest='show_version_info',
-+            help='Display the version sections (if present)')
-     optparser.add_option('--debug-dump',
-             action='store', dest='debug_dump_what', metavar='<what>',
-             help=(
-@@ -838,6 +1081,8 @@
-                 readelf.display_symbol_tables()
-             if options.show_relocs:
-                 readelf.display_relocations()
-+            if options.show_version_info:
-+                readelf.display_version_info()
-             if options.show_hex_dump:
-                 readelf.display_hex_dump(options.show_hex_dump)
-             if options.show_string_dump:
-diff -r 249a5ca85159 setup.py
---- a/setup.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/setup.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -44,7 +44,7 @@
-         'elftools.construct', 'elftools.construct.lib',
-         ],
- 
--    scripts=['scripts/readelf.py'],
-+    scripts=['scripts/readelf.py']
- )
- 
-     
-diff -r 249a5ca85159 test/run_readelf_tests.py
---- a/test/run_readelf_tests.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/test/run_readelf_tests.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -50,7 +50,7 @@
-     success = True
-     testlog.info("Test file '%s'" % filename)
-     for option in [
--            '-e', '-d', '-s', '-r', '-x.text', '-p.shstrtab',
-+            '-e', '-d', '-s', '-r', '-x.text', '-p.shstrtab', '-V',
-             '--debug-dump=info', '--debug-dump=decodedline',
-             '--debug-dump=frames', '--debug-dump=frames-interp']:
-         if verbose: testlog.info("..option='%s'" % option)
-@@ -90,9 +90,9 @@
-         Note: this function contains some rather horrible hacks to ignore
-         differences which are not important for the verification of pyelftools.
-         This is due to some intricacies of binutils's readelf which pyelftools
--        doesn't currently implement, or silly inconsistencies in the output of
--        readelf, which I was reluctant to replicate.
--        Read the documentation for more details.
-+        doesn't currently implement, features that binutils doesn't support,
-+        or silly inconsistencies in the output of readelf, which I was reluctant
-+        to replicate. Read the documentation for more details.
-     """
-     def prepare_lines(s):
-         return [line for line in s.lower().splitlines() if line.strip() != '']
-@@ -146,6 +146,9 @@
-             elif 'os/abi' in lines1[i]:
-                 if 'unix - gnu' in lines1[i] and 'unix - linux' in lines2[i]:
-                     ok = True
-+            elif (  'unknown at value' in lines1[i] and
-+                    'dw_at_apple' in lines2[i]):
-+                ok = True
-             else:
-                 for s in ('t (tls)', 'l (large)'):
-                     if s in lines1[i] or s in lines2[i]:
-@@ -183,7 +186,7 @@
-     if len(args) > 0:
-         filenames = args
-     else:
--        filenames = list(discover_testfiles('test/testfiles'))
-+        filenames = list(discover_testfiles('test/testfiles_for_readelf'))
- 
-     success = True
-     for filename in filenames:
-diff -r 249a5ca85159 test/test_arm_support.py
---- a/test/test_arm_support.py	Wed Apr 17 05:57:58 2013 -0700
-+++ b/test/test_arm_support.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -15,7 +15,7 @@
- 
- class TestARMSupport(unittest.TestCase):
-     def test_hello(self):
--        with open(os.path.join('test', 'testfiles',
-+        with open(os.path.join('test', 'testfiles_for_unittests',
-                                'simple_gcc.elf.arm'), 'rb') as f:
-             elf = ELFFile(f)
-             self.assertEqual(elf.get_machine_arch(), 'ARM')
-diff -r 249a5ca85159 test/test_gnuversions.py
---- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-+++ b/test/test_gnuversions.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -0,0 +1,160 @@
-+#------------------------------------------------------------------------------
-+# elftools tests
-+#
-+# Yann Rouillard (yann at pleiades.fr.eu.org)
-+# 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
-+from elftools.elf.constants import VER_FLAGS
-+from elftools.elf.gnuversions import (
-+        GNUVerNeedSection, GNUVerDefSection,
-+        GNUVerSymSection)
-+
-+
-+class TestSymbolVersioning(unittest.TestCase):
-+
-+    versym_reference_data = [
-+        {'name': b'', 'ndx': 'VER_NDX_LOCAL'},
-+        {'name': b'', 'ndx': 'VER_NDX_LOCAL'},
-+        {'name': b'_ITM_deregisterTMCloneTable', 'ndx': 'VER_NDX_LOCAL'},
-+        {'name': b'puts', 'ndx': 5},
-+        {'name': b'strlcat', 'ndx': 'VER_NDX_LOCAL'},
-+        {'name': b'__stack_chk_fail', 'ndx': 6},
-+        {'name': b'__gmon_start__', 'ndx': 'VER_NDX_LOCAL'},
-+        {'name': b'gzoffset', 'ndx': 7},
-+        {'name': b'_Jv_RegisterClasses', 'ndx': 'VER_NDX_LOCAL'},
-+        {'name': b'_ITM_registerTMCloneTable', 'ndx': 'VER_NDX_LOCAL'},
-+        {'name': b'__cxa_finalize', 'ndx': 5},
-+        {'name': b'_edata', 'ndx': 'VER_NDX_GLOBAL'},
-+        {'name': b'VER_1.0', 'ndx': 2},
-+        {'name': b'function1_ver1_1', 'ndx': 'VER_NDX_GLOBAL'},
-+        {'name': b'_end', 'ndx': 'VER_NDX_GLOBAL'},
-+        {'name': b'function1', 'ndx': 4 | 0x8000},
-+        {'name': b'__bss_start', 'ndx': 'VER_NDX_GLOBAL'},
-+        {'name': b'function1', 'ndx': 2},
-+        {'name': b'VER_1.1', 'ndx': 3},
-+        {'name': b'_init', 'ndx': 'VER_NDX_GLOBAL'},
-+        {'name': b'function1_ver1_0', 'ndx': 'VER_NDX_GLOBAL'},
-+        {'name': b'_fini', 'ndx': 'VER_NDX_GLOBAL'},
-+        {'name': b'VER_1.2', 'ndx': 4},
-+        {'name': b'function2', 'ndx': 3},
-+    ]
-+
-+    def test_versym_section(self):
-+
-+        reference_data = TestSymbolVersioning.versym_reference_data
-+
-+        with open(os.path.join('test', 'testfiles_for_unittests',
-+                               'lib_versioned64.so.1.elf'), 'rb') as f:
-+            elf = ELFFile(f)
-+            versym_section = None
-+            for section in elf.iter_sections():
-+                if isinstance(section, GNUVerSymSection):
-+                    versym_section = section
-+                    break
-+
-+            self.assertIsNotNone(versym_section)
-+
-+            for versym, ref_versym in zip(section.iter_symbols(),
-+                                                   reference_data):
-+                self.assertEqual(versym.name, ref_versym['name'])
-+                self.assertEqual(versym['ndx'], ref_versym['ndx'])
-+
-+    verneed_reference_data = [
-+        {'name': b'libz.so.1', 'vn_version': 1, 'vn_cnt': 1,
-+         'vernaux': [
-+            {'name': b'ZLIB_1.2.3.5', 'vna_flags': 0, 'vna_other': 7}]},
-+        {'name': b'libc.so.6', 'vn_version': 1, 'vn_cnt': 2,
-+         'vernaux': [
-+            {'name': b'GLIBC_2.4', 'vna_flags': 0, 'vna_other': 6},
-+            {'name': b'GLIBC_2.2.5', 'vna_flags': 0, 'vna_other': 5}]},
-+        ]
-+
-+    def test_verneed_section(self):
-+
-+        reference_data = TestSymbolVersioning.verneed_reference_data
-+
-+        with open(os.path.join('test', 'testfiles_for_unittests',
-+                               'lib_versioned64.so.1.elf'), 'rb') as f:
-+            elf = ELFFile(f)
-+            verneed_section = None
-+            for section in elf.iter_sections():
-+                if isinstance(section, GNUVerNeedSection):
-+                    verneed_section = section
-+                    break
-+
-+            self.assertIsNotNone(verneed_section)
-+
-+            for (verneed, vernaux_iter), ref_verneed in zip(
-+                    section.iter_versions(), reference_data):
-+
-+                self.assertEqual(verneed.name, ref_verneed['name'])
-+                self.assertEqual(verneed['vn_cnt'], ref_verneed['vn_cnt'])
-+                self.assertEqual(verneed['vn_version'],
-+                                 ref_verneed['vn_version'])
-+
-+                for vernaux, ref_vernaux in zip(
-+                        vernaux_iter, ref_verneed['vernaux']):
-+
-+                    self.assertEqual(vernaux.name, ref_vernaux['name'])
-+                    self.assertEqual(vernaux['vna_flags'],
-+                                     ref_vernaux['vna_flags'])
-+                    self.assertEqual(vernaux['vna_other'],
-+                                     ref_vernaux['vna_other'])
-+
-+    verdef_reference_data = [
-+        {'vd_ndx': 1, 'vd_version': 1, 'vd_flags': VER_FLAGS.VER_FLG_BASE,
-+         'vd_cnt': 1,
-+         'verdaux': [
-+            {'name': b'lib_versioned.so.1'}]},
-+        {'vd_ndx': 2, 'vd_version': 1, 'vd_flags': 0, 'vd_cnt': 1,
-+         'verdaux': [
-+            {'name': b'VER_1.0'}]},
-+        {'vd_ndx': 3, 'vd_version': 1, 'vd_flags': 0, 'vd_cnt': 2,
-+         'verdaux': [
-+            {'name': b'VER_1.1'},
-+            {'name': b'VER_1.0'}]},
-+        {'vd_ndx': 4, 'vd_version': 1, 'vd_flags': 0, 'vd_cnt': 2,
-+         'verdaux': [
-+            {'name': b'VER_1.2'},
-+            {'name': b'VER_1.1'}]},
-+        ]
-+
-+    def test_verdef_section(self):
-+
-+        reference_data = TestSymbolVersioning.verdef_reference_data
-+
-+        with open(os.path.join('test', 'testfiles_for_unittests',
-+                               'lib_versioned64.so.1.elf'), 'rb') as f:
-+            elf = ELFFile(f)
-+            verneed_section = None
-+            for section in elf.iter_sections():
-+                if isinstance(section, GNUVerDefSection):
-+                    verdef_section = section
-+                    break
-+
-+            self.assertIsNotNone(verdef_section)
-+
-+            for (verdef, verdaux_iter), ref_verdef in zip(
-+                    section.iter_versions(), reference_data):
-+
-+                self.assertEqual(verdef['vd_ndx'], ref_verdef['vd_ndx'])
-+                self.assertEqual(verdef['vd_version'],
-+                                 ref_verdef['vd_version'])
-+                self.assertEqual(verdef['vd_flags'], ref_verdef['vd_flags'])
-+                self.assertEqual(verdef['vd_cnt'], ref_verdef['vd_cnt'])
-+
-+                for verdaux, ref_verdaux in zip(
-+                        verdaux_iter, ref_verdef['verdaux']):
-+                    self.assertEqual(verdaux.name, ref_verdaux['name'])
-+
-+if __name__ == '__main__':
-+    unittest.main()
-diff -r 249a5ca85159 test/test_solaris_support.py
---- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-+++ b/test/test_solaris_support.py	Mon Jun 03 17:52:42 2013 +0200
-@@ -0,0 +1,56 @@
-+#-------------------------------------------------------------------------------
-+# elftools tests
-+#
-+# Yann Rouillard (yann at pleiades.fr.eu.org)
-+# 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
-+from elftools.elf.constants import SUNW_SYMINFO_FLAGS
-+
-+
-+class TestSolarisSupport(unittest.TestCase):
-+
-+    def _test_SUNW_syminfo_section_generic(self, testfile):
-+        with open(os.path.join('test', 'testfiles_for_unittests',
-+                               testfile), 'rb') as f:
-+            elf = ELFFile(f)
-+            syminfo_section = elf.get_section_by_name(b'.SUNW_syminfo')
-+            self.assertIsNotNone(syminfo_section)
-+
-+            # The test files were compiled against libc.so.1 with
-+            # direct binding, hence the libc symbols used
-+            # (exit, atexit and _exit) have the direct binding flags
-+            # in the syminfo table.
-+            # We check that this is properly detected.
-+            exit_symbols = [s for s in syminfo_section.iter_symbols()
-+                            if b'exit' in s.name]
-+            self.assertNotEqual(len(exit_symbols), 0)
-+
-+            for symbol in exit_symbols:
-+                # libc.so.1 has the index 0 in the dynamic table
-+                self.assertEqual(symbol['si_boundto'], 0)
-+                self.assertEqual(symbol['si_flags'],
-+                                 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECT |
-+                                 SUNW_SYMINFO_FLAGS.SYMINFO_FLG_DIRECTBIND)
-+
-+    def test_SUNW_syminfo_section_x86(self):
-+        self._test_SUNW_syminfo_section_generic('exe_solaris32_cc.elf')
-+
-+    def test_SUNW_syminfo_section_x64(self):
-+        self._test_SUNW_syminfo_section_generic('exe_solaris64_cc.elf')
-+
-+    def test_SUNW_syminfo_section_sparc32(self):
-+        self._test_SUNW_syminfo_section_generic('exe_solaris32_cc.elf.sparc')
-+
-+    def test_SUNW_syminfo_section_sparc64(self):
-+        self._test_SUNW_syminfo_section_generic('exe_solaris64_cc.elf.sparc')
-+
-+if __name__ == '__main__':
-+    unittest.main()
-diff -r 249a5ca85159 test/testfiles/exe_simple32.elf
-Binary file test/testfiles/exe_simple32.elf has changed
-diff -r 249a5ca85159 test/testfiles/exe_simple64.elf
-Binary file test/testfiles/exe_simple64.elf has changed
-diff -r 249a5ca85159 test/testfiles/exe_stripped64.elf
-Binary file test/testfiles/exe_stripped64.elf has changed
-diff -r 249a5ca85159 test/testfiles/libelf0_8_13_32bit.so.elf
-Binary file test/testfiles/libelf0_8_13_32bit.so.elf has changed
-diff -r 249a5ca85159 test/testfiles/obj_simple32.o.elf
-Binary file test/testfiles/obj_simple32.o.elf has changed
-diff -r 249a5ca85159 test/testfiles/penalty_32_gcc.o.elf
-Binary file test/testfiles/penalty_32_gcc.o.elf has changed
-diff -r 249a5ca85159 test/testfiles/penalty_64_clang.o.elf
-Binary file test/testfiles/penalty_64_clang.o.elf has changed
-diff -r 249a5ca85159 test/testfiles/penalty_64_gcc.o.elf
-Binary file test/testfiles/penalty_64_gcc.o.elf has changed
-diff -r 249a5ca85159 test/testfiles/simple_gcc.elf.arm
-Binary file test/testfiles/simple_gcc.elf.arm has changed
-diff -r 249a5ca85159 test/testfiles/update32.o.elf
-Binary file test/testfiles/update32.o.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/clang33-simple.o
-Binary file test/testfiles_for_readelf/clang33-simple.o has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/exe_simple32.elf
-Binary file test/testfiles_for_readelf/exe_simple32.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/exe_simple64.elf
-Binary file test/testfiles_for_readelf/exe_simple64.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/exe_stripped64.elf
-Binary file test/testfiles_for_readelf/exe_stripped64.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/gcc48-simple.o
-Binary file test/testfiles_for_readelf/gcc48-simple.o has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/gcc48-simple.src.c
---- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-+++ b/test/testfiles_for_readelf/gcc48-simple.src.c	Mon Jun 03 17:52:42 2013 +0200
-@@ -0,0 +1,19 @@
-+/* Generated by compiling with gcc 4.8 as follows:
-+**
-+** gcc-4.8 -O0 -g -fno-dwarf2-cfi-asm -c dwarf4_simple.c -o gcc48-simple.
-+**
-+** Note: -fno-dwarf2-cfi-asm to tell gcc to generate .dwarf_frames as well
-+** as the .eh_frames it generates by default.
-+**
-+*/
-+
-+extern int bar(int);
-+extern int baz(int);
-+
-+int foo(int v) {
-+    int x = bar(v);
-+    int i;
-+    for (i = 0; i < v; ++i)
-+        x += bar(i) + bar(v) * baz(i);
-+    return x;
-+}
-diff -r 249a5ca85159 test/testfiles_for_readelf/libelf0_8_13_32bit.so.elf
-Binary file test/testfiles_for_readelf/libelf0_8_13_32bit.so.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/obj_simple32.o.elf
-Binary file test/testfiles_for_readelf/obj_simple32.o.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/penalty_32_gcc.o.elf
-Binary file test/testfiles_for_readelf/penalty_32_gcc.o.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/penalty_64_clang.o.elf
-Binary file test/testfiles_for_readelf/penalty_64_clang.o.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/penalty_64_gcc.o.elf
-Binary file test/testfiles_for_readelf/penalty_64_gcc.o.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_readelf/update32.o.elf
-Binary file test/testfiles_for_readelf/update32.o.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_unittests/exe_solaris32_cc.elf
-Binary file test/testfiles_for_unittests/exe_solaris32_cc.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_unittests/exe_solaris32_cc.elf.sparc
-Binary file test/testfiles_for_unittests/exe_solaris32_cc.elf.sparc has changed
-diff -r 249a5ca85159 test/testfiles_for_unittests/exe_solaris64_cc.elf
-Binary file test/testfiles_for_unittests/exe_solaris64_cc.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_unittests/exe_solaris64_cc.elf.sparc
-Binary file test/testfiles_for_unittests/exe_solaris64_cc.elf.sparc has changed
-diff -r 249a5ca85159 test/testfiles_for_unittests/lib_versioned64.so.1.elf
-Binary file test/testfiles_for_unittests/lib_versioned64.so.1.elf has changed
-diff -r 249a5ca85159 test/testfiles_for_unittests/simple_gcc.elf.arm
-Binary file test/testfiles_for_unittests/simple_gcc.elf.arm has changed

Deleted: csw/mgar/pkg/lang-python/pyelftools/trunk/files/0002-Correctly-handle-the-multiple-string-tables-case-for.patch
===================================================================
--- csw/mgar/pkg/lang-python/pyelftools/trunk/files/0002-Correctly-handle-the-multiple-string-tables-case-for.patch	2014-05-18 12:55:09 UTC (rev 23648)
+++ csw/mgar/pkg/lang-python/pyelftools/trunk/files/0002-Correctly-handle-the-multiple-string-tables-case-for.patch	2014-05-18 13:00:14 UTC (rev 23649)
@@ -1,89 +0,0 @@
-From 9bded48f12ea546cc8ef958032000af2097daf6b Mon Sep 17 00:00:00 2001
-From: Yann Rouillard <yann at pleiades.fr.eu.org>
-Date: Tue, 9 Jul 2013 20:22:27 +0200
-Subject: [PATCH] Correctly handle the "multiple string tables" case for string
- resolution in the dynamic section
-
-The index of the string table section used to resolve various strings in the
-dynamic section is given by the sh_link field in the dynamic section header.
-As several string tables with the same name can co-exist in an elf file
-we must explicitely look for this specific string table instead of
-looking for the first string table in the file.
----
- elftools/elf/dynamic.py | 26 +++++++++++++++++++-------
- 1 file changed, 19 insertions(+), 7 deletions(-)
-
-diff --git a/elftools/elf/dynamic.py b/elftools/elf/dynamic.py
-index 60fb450..e36598e 100644
---- a/elftools/elf/dynamic.py
-+++ b/elftools/elf/dynamic.py
-@@ -28,12 +28,11 @@ class DynamicTag(object):
-         ['DT_NEEDED', 'DT_RPATH', 'DT_RUNPATH', 'DT_SONAME',
-          'DT_SUNW_FILTER'])
- 
--    def __init__(self, entry, elffile):
-+    def __init__(self, entry, stringtable):
-         self.entry = entry
-         if entry.d_tag in self._HANDLED_TAGS:
--            dynstr = elffile.get_section_by_name(b'.dynstr')
-             setattr(self, entry.d_tag[3:].lower(),
--                    dynstr.get_string(self.entry.d_val))
-+                    stringtable.get_string(self.entry.d_val))
- 
-     def __getitem__(self, name):
-         """ Implement dict-like access to entries
-@@ -54,13 +53,14 @@ class DynamicTag(object):
- class Dynamic(object):
-     """ Shared functionality between dynamic sections and segments.
-     """
--    def __init__(self, stream, elffile, position):
-+    def __init__(self, stream, elffile, stringtable, position):
-         self._stream = stream
-         self._elffile = elffile
-         self._elfstructs = elffile.structs
-         self._num_tags = -1
-         self._offset = position
-         self._tagsize = self._elfstructs.Elf_Dyn.sizeof()
-+        self._stringtable = stringtable
- 
-     def iter_tags(self, type=None):
-         """ Yield all tags (limit to |type| if specified)
-@@ -80,7 +80,7 @@ class Dynamic(object):
-             self._elfstructs.Elf_Dyn,
-             self._stream,
-             stream_pos=offset)
--        return DynamicTag(entry, self._elffile)
-+        return DynamicTag(entry, self._stringtable)
- 
-     def num_tags(self):
-         """ Number of dynamic tags in the file
-@@ -100,12 +100,24 @@ class DynamicSection(Section, Dynamic):
-     """
-     def __init__(self, header, name, stream, elffile):
-         Section.__init__(self, header, name, stream)
--        Dynamic.__init__(self, stream, elffile, self['sh_offset'])
-+        stringtable = elffile.get_section(header['sh_link'])
-+        Dynamic.__init__(self, stream, elffile, stringtable, self['sh_offset'])
- 
- 
- class DynamicSegment(Segment, Dynamic):
-     """ ELF dynamic table segment.  Knows how to process the list of tags.
-     """
-     def __init__(self, header, stream, elffile):
-+        # The string table section to be used to resolve string names in
-+        # the dynamic tag array is the one pointed at by the sh_link field
-+        # of the dynamic section header.
-+        # So we must look for the dynamic section contained in the dynamic
-+        # segment, we do so by searching for the dynamic section whose content
-+        # is located at the same offset as the dynamic segment
-+        for section in elffile.iter_sections():
-+            if (isinstance(section, DynamicSection) and
-+                    section['sh_offset'] == header['p_offset']):
-+                stringtable = elffile.get_section(section['sh_link'])
-+                break
-         Segment.__init__(self, header, stream)
--        Dynamic.__init__(self, stream, elffile, self['p_offset'])
-+        Dynamic.__init__(self, stream, elffile, stringtable, self['p_offset'])
--- 
-1.8.1.2
-

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the devel mailing list