Fix in addend for SHT_REL and version bump to 1.0.5

This commit is contained in:
Nicolas 2025-11-14 08:41:45 +01:00
parent 854a70cc95
commit 5886cf40f4
2 changed files with 12 additions and 8 deletions

View File

@ -1,6 +1,6 @@
[project] [project]
name = "pelfy" name = "pelfy"
version = "1.0.4" version = "1.0.5"
authors = [ authors = [
{ name="Nicolas Kruse", email="nicolas.kruse@nonan.net" }, { name="Nicolas Kruse", email="nicolas.kruse@nonan.net" },
] ]

View File

@ -491,31 +491,35 @@ class elf_file:
Returns: Returns:
Relocations from specified elf_section Relocations from specified elf_section
""" """
offs = sh['sh_offset'] sh_offset = sh['sh_offset']
for i, el_off in enumerate(range(offs, sh['sh_size'] + offs, sh['sh_entsize'])): for i, el_off in enumerate(range(sh_offset, sh['sh_size'] + sh_offset, sh['sh_entsize'])):
ret: dict[str, int] = dict() ret: dict[str, int] = dict()
if self.bit_width == 32: if self.bit_width == 32:
offset = self.read_int(el_off, 4) r_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)
symbol_index = r_info >> 8 symbol_index = r_info >> 8
relocation_type = r_info & 0xFF relocation_type = r_info & 0xFF
ret['r_addend'] = self.read_int(el_off + 8, 4, True) \ ret['r_addend'] = self.read_int(el_off + 8, 4, True) \
if sh.type == 'SHT_RELA' else self.read_int(offset, 4, True) if sh.type == 'SHT_RELA' else self._get_rel_32bit_addend(r_offset, sh)
elif self.bit_width == 64: elif self.bit_width == 64:
offset = self.read_int(el_off, 8) r_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 symbol_index = r_info >> 32
relocation_type = r_info & 0xFFFFFFFF relocation_type = r_info & 0xFFFFFFFF
ret['r_addend'] = self.read_int(el_off + 16, 8, True) \ ret['r_addend'] = self.read_int(el_off + 16, 8, True) \
if sh.type == 'SHT_RELA' else self.read_int(offset, 4, True) if sh.type == 'SHT_RELA' else self._get_rel_32bit_addend(r_offset, sh)
else: else:
raise NotImplementedError(f"{self.bit_width} bit is not supported") raise NotImplementedError(f"{self.bit_width} bit is not supported")
ret['r_offset'] = offset ret['r_offset'] = r_offset
ret['r_info'] = r_info ret['r_info'] = r_info
yield elf_relocation(self, ret, symbol_index, relocation_type, sh['sh_info'], i) yield elf_relocation(self, ret, symbol_index, relocation_type, sh['sh_info'], i)
def _get_rel_32bit_addend(self, r_offset: int, reloc_section: elf_section) -> int:
sh = self.sections[reloc_section['sh_info']]
return self.read_int(r_offset + sh['sh_offset'], 4, True)
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.