Index: ELF/Target.cpp =================================================================== --- ELF/Target.cpp +++ ELF/Target.cpp @@ -959,43 +959,48 @@ // bits in Loc are zero. or32le(Loc, (SA & 0xFFF) << 10); break; + case R_AARCH64_ADR_GOT_PAGE: { + uint64_t X = getAArch64Page(SA) - getAArch64Page(P); + checkInt<33>(X, Type); + updateAArch64Adr(Loc, (X >> 12) & 0x1FFFFF); // X[32:12] + break; + } case R_AARCH64_ADR_PREL_LO21: { uint64_t X = SA - P; checkInt<21>(X, Type); updateAArch64Adr(Loc, X & 0x1FFFFF); break; } - case R_AARCH64_ADR_GOT_PAGE: case R_AARCH64_ADR_PREL_PG_HI21: { uint64_t X = getAArch64Page(SA) - getAArch64Page(P); checkInt<33>(X, Type); updateAArch64Adr(Loc, (X >> 12) & 0x1FFFFF); // X[32:12] break; } - case R_AARCH64_JUMP26: - case R_AARCH64_CALL26: { + case R_AARCH64_CALL26: + case R_AARCH64_JUMP26: { uint64_t X = SA - P; checkInt<28>(X, Type); or32le(Loc, (X & 0x0FFFFFFC) >> 2); break; } - case R_AARCH64_LDST32_ABS_LO12_NC: - // No overflow check needed. - or32le(Loc, (SA & 0xFFC) << 8); - break; case R_AARCH64_LD64_GOT_LO12_NC: checkAlignment<8>(SA, Type); // No overflow check needed. or32le(Loc, (SA & 0xFF8) << 7); break; - case R_AARCH64_LDST64_ABS_LO12_NC: - // No overflow check needed. - or32le(Loc, (SA & 0xFF8) << 7); - break; case R_AARCH64_LDST8_ABS_LO12_NC: // No overflow check needed. or32le(Loc, (SA & 0xFFF) << 10); break; + case R_AARCH64_LDST32_ABS_LO12_NC: + // No overflow check needed. + or32le(Loc, (SA & 0xFFC) << 8); + break; + case R_AARCH64_LDST64_ABS_LO12_NC: + // No overflow check needed. + or32le(Loc, (SA & 0xFF8) << 7); + break; case R_AARCH64_PREL16: checkIntUInt<16>(SA - P, Type); write16le(Loc, SA - P);