From 5783ba1bf73c53ca56e64ed0c462c62224f0393c Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 22 May 2021 13:31:48 +0200 Subject: [PATCH] DynASM/ARM64: Fix ADRP encoding with absolute address. Thanks to Dmitry Stogov. --- dynasm/dasm_arm64.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dynasm/dasm_arm64.h b/dynasm/dasm_arm64.h index 8d1d9a96..d6da4528 100644 --- a/dynasm/dasm_arm64.h +++ b/dynasm/dasm_arm64.h @@ -473,7 +473,13 @@ int dasm_encode(Dst_DECL, void *buffer) } break; case DASM_REL_A: { - ptrdiff_t na = (((ptrdiff_t)(*b++) << 32) | (unsigned int)n) - (ptrdiff_t)cp + 4; + ptrdiff_t na = (((ptrdiff_t)(*b++) << 32) | (unsigned int)n); + if ((ins & 0x3000) == 0x3000) { /* ADRP */ + ins &= ~0x1000; + na = (na >> 12) - (((ptrdiff_t)cp - 4) >> 12); + } else { + na = na - (ptrdiff_t)cp + 4; + } n = (int)na; CK((ptrdiff_t)n == na, RANGE_REL); goto patchrel;