added support for addend for SHT_REL relocations (used for 32 bit x86)

This commit is contained in:
Nicolas 2025-11-13 20:24:11 +01:00
parent 2e865b0785
commit 854a70cc95
1 changed files with 16 additions and 8 deletions

View File

@ -496,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.