| 39 | |
| 40 | |
| 41 | class ELFImage: |
| 42 | def __init__(self, data): |
| 43 | version = tuple(int(c) for c in elftools.__version__.split(".")) |
| 44 | self._legacy_elftools = version < (0, 24) |
| 45 | |
| 46 | self._image = ELFFile(data) |
| 47 | |
| 48 | section = b".symtab" if self._legacy_elftools else ".symtab" |
| 49 | self._symtab = self._image.get_section_by_name(section) |
| 50 | if not isinstance(self._symtab, SymbolTableSection): |
| 51 | raise Exception(".symtab section is not a symbol table") |
| 52 | |
| 53 | @property |
| 54 | def is_big_endian(self): |
| 55 | return not self._image.little_endian |
| 56 | |
| 57 | def find_by_name(self, name): |
| 58 | symbol = self._get_symbol_by_name(name) |
| 59 | return ELFSymbol(self._image, symbol[0]) if symbol else None |
| 60 | |
| 61 | def _get_symbol_by_name(self, name): |
| 62 | if not self._legacy_elftools: |
| 63 | return self._symtab.get_symbol_by_name(name) |
| 64 | name = name.encode("utf-8") |
| 65 | for symbol in self._symtab.iter_symbols(): |
| 66 | if symbol.name == name: |
| 67 | return [symbol] |
| 68 | return None |
| 69 | |
| 70 | def find_by_pattern(self, pattern): |
| 71 | pattern = pattern.encode("utf-8") if self._legacy_elftools else pattern |
| 72 | for i in range(self._symtab.num_symbols()): |
| 73 | symbol = self._symtab.get_symbol(i) |
| 74 | if re.match(pattern, symbol.name): |
| 75 | yield ELFSymbol(self._image, symbol) |
| 76 | |
| 77 | |
| 78 | class COFFSymbol: |