https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=9653999c2f4429ab8e8867f3b33c8acc8fea787c
commit 9653999c2f4429ab8e8867f3b33c8acc8fea787c Author: Evgeny Karpov <evgeny.kar...@microsoft.com> AuthorDate: Fri Jul 4 20:20:37 2025 +0200 Commit: Corinna Vinschen <cori...@vinschen.de> CommitDate: Mon Jul 14 15:13:25 2025 +0200 Cygwin: malloc_wrapper: port to AArch64 Implements import_address function by decoding adr AArch64 instructions to get target address. Signed-off-by: Radek BartoĊ <radek.bar...@microsoft.com> Diff: --- winsup/cygwin/mm/malloc_wrapper.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/winsup/cygwin/mm/malloc_wrapper.cc b/winsup/cygwin/mm/malloc_wrapper.cc index de3cf7ddc19e..863d3089cfff 100644 --- a/winsup/cygwin/mm/malloc_wrapper.cc +++ b/winsup/cygwin/mm/malloc_wrapper.cc @@ -50,6 +50,19 @@ import_address (void *imp) { __try { +#if defined(__aarch64__) + // If opcode is an adr instruction. + uint32_t opcode = *(uint32_t *) imp; + if ((opcode & 0x9f000000) == 0x10000000) + { + uint32_t immhi = (opcode >> 5) & 0x7ffff; + uint32_t immlo = (opcode >> 29) & 0x3; + int64_t sign_extend = (0l - (immhi >> 18)) << 21; + int64_t imm = sign_extend | (immhi << 2) | immlo; + uintptr_t jmpto = *(uintptr_t *) ((uint8_t *) imp + imm); + return (void *) jmpto; + } +#else if (*((uint16_t *) imp) == 0x25ff) { const char *ptr = (const char *) imp; @@ -57,6 +70,7 @@ import_address (void *imp) (ptr + 6 + *(int32_t *)(ptr + 2)); return (void *) *jmpto; } +#endif } __except (NO_ERROR) {} __endtry