From 39bb639c1fd0865322172e0b210470b1d9ee4e30 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Fri, 27 Feb 2026 14:47:21 +0100 Subject: [PATCH] stencils_armv7thumb_O3_THM_MOVW.o test object added for thumb code using R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_ABS_NC instead of litteral pools. new addend extractions added, but untested --- src/pelfy/_main.py | 21 ++++++++++++++++++-- tests/obj/stencils_armv7thumb_O3_THM_MOVW.o | Bin 0 -> 42128 bytes 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 tests/obj/stencils_armv7thumb_O3_THM_MOVW.o diff --git a/src/pelfy/_main.py b/src/pelfy/_main.py index bea2f66..af2e15a 100644 --- a/src/pelfy/_main.py +++ b/src/pelfy/_main.py @@ -9,6 +9,7 @@ Typical usage example: from . import _fields_data as fdat from . import _output_formatter from typing import TypeVar, Literal, Iterable, Generic, Iterator, Generator, Optional, Union +import warnings _T = TypeVar('_T') @@ -594,11 +595,27 @@ class elf_file: return _decode_thumb_branch_imm(field, 22) if name in ('R_ARM_THM_JUMP24', 'R_ARM_THM_CALL'): return _decode_thumb_branch_imm(field, 24) + if name == 'R_ARM_THM_MOVW_ABS_NC': + # Extract addend for Thumb MOVW (lower 16 bits) + imm4 = (field >> 16) & 0xF + i = (field >> 26) & 0x1 + imm3 = (field >> 12) & 0x7 + imm8 = (field >> 0) & 0xFF + addend = (i << 11) | (imm4 << 12) | (imm3 << 8) | imm8 + return addend + if name == 'R_ARM_THM_MOVT_ABS_NC': + # Extract addend for Thumb MOVT (upper 16 bits) + imm4 = (field >> 16) & 0xF + 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: - print(f'Warning: Thumb relocation addend extraction is for {name} not implemented') + warnings.warn(f'Thumb relocation addend extraction is for {name} not implemented', stacklevel=2) return 0 if '_MIPS_' in name: - print('Warning: MIPS relocations addend extraction is not implemented') + warnings.warn('Warning: MIPS relocations addend extraction is not implemented', stacklevel=2) return 0 raise NotImplementedError(f"Relocation addend extraction for {name} is not implemented") diff --git a/tests/obj/stencils_armv7thumb_O3_THM_MOVW.o b/tests/obj/stencils_armv7thumb_O3_THM_MOVW.o new file mode 100644 index 0000000000000000000000000000000000000000..d2261128688d7e0be3de41076cb9c39fbd60e21f GIT binary patch literal 42128 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