Просмотр исходного кода

DynASM/ARM64: Fix ADRP encoding with absolute address.

Thanks to Dmitry Stogov.
Mike Pall 4 лет назад
Родитель
Сommit
5783ba1bf7
1 измененных файлов с 7 добавлено и 1 удалено
  1. 7 1
      dynasm/dasm_arm64.h

+ 7 - 1
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;