diff --git a/arm64-link.c b/arm64-link.c index 5fec77d3..8acd2aff 100644 --- a/arm64-link.c +++ b/arm64-link.c @@ -37,7 +37,10 @@ int code_reloc (int reloc_type) case R_AARCH64_ADD_ABS_LO12_NC: case R_AARCH64_ADR_GOT_PAGE: case R_AARCH64_LD64_GOT_LO12_NC: + case R_AARCH64_LDST128_ABS_LO12_NC: case R_AARCH64_LDST64_ABS_LO12_NC: + case R_AARCH64_LDST32_ABS_LO12_NC: + case R_AARCH64_LDST16_ABS_LO12_NC: case R_AARCH64_LDST8_ABS_LO12_NC: case R_AARCH64_GLOB_DAT: case R_AARCH64_COPY: @@ -64,7 +67,10 @@ int gotplt_entry_type (int reloc_type) case R_AARCH64_MOVW_UABS_G3: case R_AARCH64_ADR_PREL_PG_HI21: case R_AARCH64_ADD_ABS_LO12_NC: + case R_AARCH64_LDST128_ABS_LO12_NC: case R_AARCH64_LDST64_ABS_LO12_NC: + case R_AARCH64_LDST32_ABS_LO12_NC: + case R_AARCH64_LDST16_ABS_LO12_NC: case R_AARCH64_LDST8_ABS_LO12_NC: case R_AARCH64_GLOB_DAT: case R_AARCH64_JUMP_SLOT: @@ -243,10 +249,22 @@ void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t write32le(ptr, ((read32le(ptr) & 0xffc003ff) | (val & 0xfff) << 10)); return; + case R_AARCH64_LDST16_ABS_LO12_NC: + write32le(ptr, ((read32le(ptr) & 0xffc003ff) | + (val & 0xffe) << 9)); + return; + case R_AARCH64_LDST32_ABS_LO12_NC: + write32le(ptr, ((read32le(ptr) & 0xffc003ff) | + (val & 0xffc) << 8)); + return; case R_AARCH64_LDST64_ABS_LO12_NC: write32le(ptr, ((read32le(ptr) & 0xffc003ff) | (val & 0xff8) << 7)); return; + case R_AARCH64_LDST128_ABS_LO12_NC: + write32le(ptr, ((read32le(ptr) & 0xffc003ff) | + (val & 0xff0) << 6)); + return; case R_AARCH64_JUMP26: case R_AARCH64_CALL26: #ifdef DEBUG_RELOC