mirror of https://github.com/Nonannet/pelfy.git
Compare commits
2 Commits
de88f387e9
...
854a70cc95
| Author | SHA1 | Date |
|---|---|---|
|
|
854a70cc95 | |
|
|
2e865b0785 |
|
|
@ -265,6 +265,14 @@ class elf_list(Generic[_T]):
|
||||||
def __iter__(self) -> Iterator[_T]:
|
def __iter__(self) -> Iterator[_T]:
|
||||||
return iter(self._data)
|
return iter(self._data)
|
||||||
|
|
||||||
|
def __contains__(self, item: Union[str, int, _T]) -> bool:
|
||||||
|
if isinstance(item, str):
|
||||||
|
return any(getattr(el, 'name', '') == item for el in self._data)
|
||||||
|
elif isinstance(item, int):
|
||||||
|
return 0 <= item < len(self._data)
|
||||||
|
else:
|
||||||
|
return item in self._data
|
||||||
|
|
||||||
def _compact_table(self) -> tuple[list[str], list[list[Union[str, int]]], list[str]]:
|
def _compact_table(self) -> tuple[list[str], list[list[Union[str, int]]], list[str]]:
|
||||||
return [], [[]], []
|
return [], [[]], []
|
||||||
|
|
||||||
|
|
@ -488,17 +496,25 @@ class elf_file:
|
||||||
ret: dict[str, int] = dict()
|
ret: dict[str, int] = dict()
|
||||||
|
|
||||||
if self.bit_width == 32:
|
if self.bit_width == 32:
|
||||||
ret['r_offset'] = self.read_int(el_off, 4)
|
offset = self.read_int(el_off, 4)
|
||||||
r_info = self.read_int(el_off + 4, 4)
|
r_info = self.read_int(el_off + 4, 4)
|
||||||
ret['r_info'] = r_info
|
symbol_index = r_info >> 8
|
||||||
ret['r_addend'] = self.read_int(el_off + 8, 4, True) if sh.type == 'SHT_RELA' else 0
|
relocation_type = r_info & 0xFF
|
||||||
yield elf_relocation(self, ret, r_info >> 8, r_info & 0xFF, sh['sh_info'], i)
|
ret['r_addend'] = self.read_int(el_off + 8, 4, True) \
|
||||||
|
if sh.type == 'SHT_RELA' else self.read_int(offset, 4, True)
|
||||||
elif self.bit_width == 64:
|
elif self.bit_width == 64:
|
||||||
ret['r_offset'] = self.read_int(el_off, 8)
|
offset = self.read_int(el_off, 8)
|
||||||
r_info = self.read_int(el_off + 8, 8)
|
r_info = self.read_int(el_off + 8, 8)
|
||||||
|
symbol_index = r_info >> 32
|
||||||
|
relocation_type = r_info & 0xFFFFFFFF
|
||||||
|
ret['r_addend'] = self.read_int(el_off + 16, 8, True) \
|
||||||
|
if sh.type == 'SHT_RELA' else self.read_int(offset, 4, True)
|
||||||
|
else:
|
||||||
|
raise NotImplementedError(f"{self.bit_width} bit is not supported")
|
||||||
|
|
||||||
|
ret['r_offset'] = offset
|
||||||
ret['r_info'] = r_info
|
ret['r_info'] = r_info
|
||||||
ret['r_addend'] = self.read_int(el_off + 16, 8, True) if sh.type == 'SHT_RELA' else 0
|
yield elf_relocation(self, ret, symbol_index, relocation_type, sh['sh_info'], i)
|
||||||
yield elf_relocation(self, ret, r_info >> 32, r_info & 0xFFFFFFFF, sh['sh_info'], i)
|
|
||||||
|
|
||||||
def read_bytes(self, offset: int, num_bytes: int) -> bytes:
|
def read_bytes(self, offset: int, num_bytes: int) -> bytes:
|
||||||
"""Read bytes from ELF file.
|
"""Read bytes from ELF file.
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,13 @@ def test_simple_c() -> None:
|
||||||
for reloc in elf.get_relocations():
|
for reloc in elf.get_relocations():
|
||||||
assert known_name(reloc.type), f"Relocation type {reloc.type} for {elf.architecture} in {path} is unknown."
|
assert known_name(reloc.type), f"Relocation type {reloc.type} for {elf.architecture} in {path} is unknown."
|
||||||
|
|
||||||
|
assert 'imageWidth' in elf.objects or 'read_float_ret' in elf.objects, path
|
||||||
|
assert 'leet456456456n4ghn4hf56n4f' not in elf.objects
|
||||||
|
assert 0 in elf.objects
|
||||||
|
assert 1000 not in elf.objects
|
||||||
|
assert elf.objects[0] in elf.symbols
|
||||||
|
assert elf.objects[0] not in elf.functions
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
test_simple_c()
|
test_simple_c()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue