buildtools: fix pmdinfogen with pyelftools < 0.24
pyelftools had some breaking changes [1] and API enhancements [2] between 0.23 (used in Ubuntu 16.04) and 0.24. Ensure compatibility with both legacy and modern versions. [1]: https://github.com/eliben/pyelftools/pull/76 [2]: https://github.com/eliben/pyelftools/pull/56 Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
This commit is contained in:
parent
6b19edcb66
commit
65ef14c576
@ -10,6 +10,7 @@
|
|||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
import elftools
|
||||||
from elftools.elf.elffile import ELFFile
|
from elftools.elf.elffile import ELFFile
|
||||||
from elftools.elf.sections import SymbolTableSection
|
from elftools.elf.sections import SymbolTableSection
|
||||||
except ImportError:
|
except ImportError:
|
||||||
@ -38,8 +39,13 @@ def get_value(self, offset, size):
|
|||||||
|
|
||||||
class ELFImage:
|
class ELFImage:
|
||||||
def __init__(self, data):
|
def __init__(self, data):
|
||||||
|
version = tuple(int(c) for c in elftools.__version__.split("."))
|
||||||
|
self._legacy_elftools = version < (0, 24)
|
||||||
|
|
||||||
self._image = ELFFile(data)
|
self._image = ELFFile(data)
|
||||||
self._symtab = self._image.get_section_by_name(".symtab")
|
|
||||||
|
section = b".symtab" if self._legacy_elftools else ".symtab"
|
||||||
|
self._symtab = self._image.get_section_by_name(section)
|
||||||
if not isinstance(self._symtab, SymbolTableSection):
|
if not isinstance(self._symtab, SymbolTableSection):
|
||||||
raise Exception(".symtab section is not a symbol table")
|
raise Exception(".symtab section is not a symbol table")
|
||||||
|
|
||||||
@ -48,10 +54,20 @@ def is_big_endian(self):
|
|||||||
return not self._image.little_endian
|
return not self._image.little_endian
|
||||||
|
|
||||||
def find_by_name(self, name):
|
def find_by_name(self, name):
|
||||||
symbol = self._symtab.get_symbol_by_name(name)
|
symbol = self._get_symbol_by_name(name)
|
||||||
return ELFSymbol(self._image, symbol[0]) if symbol else None
|
return ELFSymbol(self._image, symbol[0]) if symbol else None
|
||||||
|
|
||||||
|
def _get_symbol_by_name(self, name):
|
||||||
|
if not self._legacy_elftools:
|
||||||
|
return self._symtab.get_symbol_by_name(name)
|
||||||
|
name = name.encode("utf-8")
|
||||||
|
for symbol in self._symtab.iter_symbols():
|
||||||
|
if symbol.name == name:
|
||||||
|
return [symbol]
|
||||||
|
return None
|
||||||
|
|
||||||
def find_by_prefix(self, prefix):
|
def find_by_prefix(self, prefix):
|
||||||
|
prefix = prefix.encode("utf-8") if self._legacy_elftools else prefix
|
||||||
for i in range(self._symtab.num_symbols()):
|
for i in range(self._symtab.num_symbols()):
|
||||||
symbol = self._symtab.get_symbol(i)
|
symbol = self._symtab.get_symbol(i)
|
||||||
if symbol.name.startswith(prefix):
|
if symbol.name.startswith(prefix):
|
||||||
|
Loading…
Reference in New Issue
Block a user