[PATCH] Fix the error of GET_DATA_POINTER for aarch64 on linux

Tianjia Zhang tianjia.zhang at linux.alibaba.com
Tue May 10 14:49:47 CEST 2022

* cipher/asm-common-aarch64.h: Use same macro GET_DATA_POINTER() for
  linux and windows.

For multiple labels defined in the same consts object on Linux,
except the first label, an error result will be obtained when taking
the addresss of other labels through GET_DATA_POINTER(). The error
address is the same as the first label. An error fragment code after
compilation is as follows:

  0x0000fffff7f18be4 <+12>:	adrp	x6, 0xfffff7fb8000
  0x0000fffff7f18be8 <+16>:	ldr	x6, [x6, #3216]
  0x0000fffff7f18bec <+20>:	ld1b	{z24.b}, p0/z, [x6]
  0x0000fffff7f18bf0 <+24>:	adrp	x6, 0xfffff7fb8000
  0x0000fffff7f18bf4 <+28>:	ldr	x6, [x6, #3216]
  0x0000fffff7f18bf8 <+32>:	ldr	p1, [x6]

This patch fixes this problem by using the ADRP/ADD instruction.

Signed-off-by: Tianjia Zhang <tianjia.zhang at linux.alibaba.com>
 cipher/asm-common-aarch64.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cipher/asm-common-aarch64.h b/cipher/asm-common-aarch64.h
index d3f7801c7661..b29479a32157 100644
--- a/cipher/asm-common-aarch64.h
+++ b/cipher/asm-common-aarch64.h
@@ -33,7 +33,7 @@
 #define GET_DATA_POINTER(reg, name) \
 	adrp    reg, name at GOTPAGE ; \
 	add     reg, reg, name at GOTPAGEOFF ;
-#elif defined(_WIN32)
+#elif defined(__linux__) || defined(_WIN32)
 #define GET_DATA_POINTER(reg, name) \
 	adrp    reg, name ; \
 	add     reg, reg, #:lo12:name ;
2.24.3 (Apple Git-128)

More information about the Gcrypt-devel mailing list