mirror of https://github.com/Nonannet/pelfy.git
Fixed addend extraction for R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_ABS
This commit is contained in:
parent
20b00109e9
commit
9a4cbe92af
|
|
@ -575,7 +575,7 @@ class elf_file:
|
||||||
if reloc_types and 'A' in reloc_types[relocation_type][2]:
|
if reloc_types and 'A' in reloc_types[relocation_type][2]:
|
||||||
name = reloc_types[relocation_type][0]
|
name = reloc_types[relocation_type][0]
|
||||||
sh = self.sections[reloc_section['sh_info']]
|
sh = self.sections[reloc_section['sh_info']]
|
||||||
field = self.read_int(r_offset + sh['sh_offset'], 4, True)
|
field = self.read_int(r_offset + sh['sh_offset'], 4, False)
|
||||||
if name in ('R_386_PC32', 'R_386_32', 'R_X86_64_PC32', 'R_X86_64_PLT32', 'R_ARM_REL32', 'R_ARM_ABS32'):
|
if name in ('R_386_PC32', 'R_386_32', 'R_X86_64_PC32', 'R_X86_64_PLT32', 'R_ARM_REL32', 'R_ARM_ABS32'):
|
||||||
return field
|
return field
|
||||||
if name == 'R_ARM_MOVW_ABS_NC':
|
if name == 'R_ARM_MOVW_ABS_NC':
|
||||||
|
|
@ -595,22 +595,15 @@ class elf_file:
|
||||||
return _decode_thumb_branch_imm(field, 22)
|
return _decode_thumb_branch_imm(field, 22)
|
||||||
if name in ('R_ARM_THM_JUMP24', 'R_ARM_THM_CALL'):
|
if name in ('R_ARM_THM_JUMP24', 'R_ARM_THM_CALL'):
|
||||||
return _decode_thumb_branch_imm(field, 24)
|
return _decode_thumb_branch_imm(field, 24)
|
||||||
if name == 'R_ARM_THM_MOVW_ABS_NC':
|
if name == 'R_ARM_THM_MOVW_ABS_NC' or name == 'R_ARM_THM_MOVT_ABS':
|
||||||
# Extract addend for Thumb MOVW (lower 16 bits)
|
i = (field >> 10) & 1
|
||||||
imm4 = (field >> 16) & 0xF
|
imm4 = field & 0xF
|
||||||
i = (field >> 26) & 0x1
|
imm3 = (field >> 28) & 0x7
|
||||||
imm3 = (field >> 12) & 0x7
|
imm8 = (field >> 16) & 0xFF
|
||||||
imm8 = (field >> 0) & 0xFF
|
imm16 = imm8 | (imm3 << 8) | (i << 11) | (imm4 << 12)
|
||||||
addend = (i << 11) | (imm4 << 12) | (imm3 << 8) | imm8
|
|
||||||
return addend
|
|
||||||
if name == 'R_ARM_THM_MOVT_ABS':
|
if name == 'R_ARM_THM_MOVT_ABS':
|
||||||
# Extract addend for Thumb MOVT (upper 16 bits)
|
return imm16 << 16
|
||||||
imm4 = (field >> 16) & 0xF
|
return imm16
|
||||||
i = (field >> 26) & 0x1
|
|
||||||
imm3 = (field >> 12) & 0x7
|
|
||||||
imm8 = (field >> 0) & 0xFF
|
|
||||||
addend = ((i << 11) | (imm4 << 12) | (imm3 << 8) | imm8) << 16
|
|
||||||
return addend
|
|
||||||
if '_THM_' in name:
|
if '_THM_' in name:
|
||||||
warnings.warn(f'Thumb relocation addend extraction is for {name} not implemented', stacklevel=2)
|
warnings.warn(f'Thumb relocation addend extraction is for {name} not implemented', stacklevel=2)
|
||||||
return 0
|
return 0
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue