public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] repo/gentoo:master commit in: dev-python/pyelftools/files/
@ 2016-09-19 21:23 David Seifert
  0 siblings, 0 replies; only message in thread
From: David Seifert @ 2016-09-19 21:23 UTC (permalink / raw
  To: gentoo-commits

commit:     0c11c579bb5fde568076ac882e95f1418f0be5ff
Author:     Michael Mair-Keimberger (asterix) <m.mairkeimberger <AT> gmail <DOT> com>
AuthorDate: Mon Sep 19 17:33:33 2016 +0000
Commit:     David Seifert <soap <AT> gentoo <DOT> org>
CommitDate: Mon Sep 19 21:22:48 2016 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=0c11c579

dev-python/pyelftools: remove unused patch

Closes: https://github.com/gentoo/gentoo/pull/2362

Signed-off-by: David Seifert <soap <AT> gentoo.org>

 .../files/pyelftools-0.21-dyntable.patch           | 143 ---------------------
 1 file changed, 143 deletions(-)

diff --git a/dev-python/pyelftools/files/pyelftools-0.21-dyntable.patch b/dev-python/pyelftools/files/pyelftools-0.21-dyntable.patch
deleted file mode 100644
index e43e6cb..00000000
--- a/dev-python/pyelftools/files/pyelftools-0.21-dyntable.patch
+++ /dev/null
@@ -1,143 +0,0 @@
-changeset:   207:92736c403d53
-tag:         tip
-user:        Mike Frysinger <vapier@gentoo.org>
-date:        Mon Apr 22 19:02:21 2013 -0400
-summary:     support parsing of dynamic ELFs w/out section headers
-
-At runtime, ELFs do not use the section headers at all. Instead, only
-the program segments and dynamic tags get used. This means you can
-strip the section table completely from an ELF and have it still work.
-
-In practice, people rarely do this, but it's not unheard of. Make the
-Dynamic tags work even in these cases by loading the strings table the
-same way the runtime loader does:
-- parse the symtab address from DT_STRTAB
-- locate the file offset via the program segments
-
-In order to avoid circular deps (parsing a dyntag requires walking parsed
-dyntags), add a set of internal funcs for returning the raw values.
-
-diff --git a/elftools/elf/dynamic.py b/elftools/elf/dynamic.py
---- a/elftools/elf/dynamic.py
-+++ b/elftools/elf/dynamic.py
-@@ -10,11 +10,26 @@
- 
- from .sections import Section
- from .segments import Segment
--from ..common.utils import struct_parse
-+from ..common.utils import struct_parse, parse_cstring_from_stream
- 
- from .enums import ENUM_D_TAG
- 
- 
-+class _DynamicStringTable(object):
-+    """ Bare string table based on values found via ELF dynamic tags and
-+        loadable segments only.  Good enough for get_string() only.
-+    """
-+    def __init__(self, stream, table_offset):
-+        self._stream = stream
-+        self._table_offset = table_offset
-+
-+    def get_string(self, offset):
-+        """ Get the string stored at the given offset in this string table.
-+        """
-+        return parse_cstring_from_stream(self._stream,
-+                                         self._table_offset + offset)
-+
-+
- class DynamicTag(object):
-     """ Dynamic Tag object - representing a single dynamic tag entry from a
-         dynamic section.
-@@ -27,10 +42,9 @@
-     _HANDLED_TAGS = frozenset(
-         ['DT_NEEDED', 'DT_RPATH', 'DT_RUNPATH', 'DT_SONAME'])
- 
--    def __init__(self, entry, elffile):
-+    def __init__(self, entry, dynstr):
-         self.entry = entry
--        if entry.d_tag in self._HANDLED_TAGS:
--            dynstr = elffile.get_section_by_name(b'.dynstr')
-+        if entry.d_tag in self._HANDLED_TAGS and dynstr:
-             setattr(self, entry.d_tag[3:].lower(),
-                     dynstr.get_string(self.entry.d_val))
- 
-@@ -60,26 +74,66 @@
-         self._num_tags = -1
-         self._offset = position
-         self._tagsize = self._elfstructs.Elf_Dyn.sizeof()
-+        self.__string_table = None
-+
-+    @property
-+    def _string_table(self):
-+        if self.__string_table:
-+            return self.__string_table
-+
-+        # If the ELF has stripped its section table (which is unusual, but
-+        # perfectly valid), we need to use the dynamic tags to locate the
-+        # dynamic string table.
-+        strtab = None
-+        for tag in self._iter_tags(type='DT_STRTAB'):
-+            strtab = tag['d_val']
-+            break
-+        # If we found a dynamic string table, locate the offset in the file
-+        # by using the program headers.
-+        if strtab:
-+            for segment in self._elffile.iter_segments():
-+                if (strtab >= segment['p_vaddr'] and
-+                    strtab < segment['p_vaddr'] + segment['p_filesz']):
-+                    self.__string_table = _DynamicStringTable(
-+                        self._stream,
-+                        segment['p_offset'] + (strtab - segment['p_vaddr']))
-+                    return self.__string_table
-+
-+        # That didn't work for some reason.  Let's use the section header
-+        # even though this ELF is super weird.
-+        self.__string_table = self._elffile.get_section_by_name(b'.dynstr')
-+
-+        return self.__string_table
-+
-+    def _iter_tags(self, type=None):
-+        """ Yield all raw tags (limit to |type| if specified)
-+        """
-+        for n in itertools.count():
-+            tag = self._get_tag(n)
-+            if type is None or tag['d_tag'] == type:
-+                yield tag
-+            if tag['d_tag'] == 'DT_NULL':
-+                break
- 
-     def iter_tags(self, type=None):
-         """ Yield all tags (limit to |type| if specified)
-         """
--        for n in itertools.count():
--            tag = self.get_tag(n)
--            if type is None or tag.entry.d_tag == type:
--                yield tag
--            if tag.entry.d_tag == 'DT_NULL':
--                break
-+        for tag in self._iter_tags(type=type):
-+            yield DynamicTag(tag, self._string_table)
-+
-+    def _get_tag(self, n):
-+        """ Get the raw tag at index #n from the file
-+        """
-+        offset = self._offset + n * self._tagsize
-+        return struct_parse(
-+            self._elfstructs.Elf_Dyn,
-+            self._stream,
-+            stream_pos=offset)
- 
-     def get_tag(self, n):
-         """ Get the tag at index #n from the file (DynamicTag object)
-         """
--        offset = self._offset + n * self._tagsize
--        entry = struct_parse(
--            self._elfstructs.Elf_Dyn,
--            self._stream,
--            stream_pos=offset)
--        return DynamicTag(entry, self._elffile)
-+        return DynamicTag(self._get_tag(n), self._string_table)
- 
-     def num_tags(self):
-         """ Number of dynamic tags in the file
-


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2016-09-19 21:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-19 21:23 [gentoo-commits] repo/gentoo:master commit in: dev-python/pyelftools/files/ David Seifert

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox