diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 3ccca779ff79cb83d3f2fc7de50bb258a55f94bb..d71aae59e1bb6ca0cc6c1e31d4f77d3e730b30a1 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -892,7 +892,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO (AARCH64_R (LDST16_ABS_LO12_NC), /* type */ 1, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 11, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -907,7 +907,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO (AARCH64_R (LDST32_ABS_LO12_NC), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 10, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -922,7 +922,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO (AARCH64_R (LDST64_ABS_LO12_NC), /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 9, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -937,7 +937,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO (AARCH64_R (LDST128_ABS_LO12_NC), /* type */ 4, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 8, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -984,7 +984,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO64 (AARCH64_R (LD64_GOT_LO12_NC), /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 9, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -999,7 +999,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO32 (AARCH64_R (LD32_GOT_LO12_NC), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 10, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -1179,7 +1179,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO64 (AARCH64_R (TLSIE_LD64_GOTTPREL_LO12_NC), /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 9, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -1193,7 +1193,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO32 (AARCH64_R (TLSIE_LD32_GOTTPREL_LO12_NC), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 10, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -1811,7 +1811,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO64 (AARCH64_R (TLSDESC_LD64_LO12), /* type */ 3, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 9, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -1826,7 +1826,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] = HOWTO32 (AARCH64_R (TLSDESC_LD32_LO12_NC), /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ + 10, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ diff --git a/bfd/elfxx-aarch64.c b/bfd/elfxx-aarch64.c index 08e7cd9684cf4621ac6c2843d8bc82a3d21b4a6a..7da1fdaf70870bc9b9d744ba5fbf1a15ea892dd0 100644 --- a/bfd/elfxx-aarch64.c +++ b/bfd/elfxx-aarch64.c @@ -263,36 +263,40 @@ _bfd_aarch64_elf_put_addend (bfd *abfd, contents = reencode_add_imm (contents, addend); break; - case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14: case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: - case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15: - case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15: case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: + case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC: + case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC: + /* Properly truncate the value according to the bitsize. */ + addend &= ((1 << howto->bitsize) - 1); + /* Fall through. */ + + case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14: + case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15: + case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15: case BFD_RELOC_AARCH64_LDST128_LO12: case BFD_RELOC_AARCH64_LDST16_LO12: case BFD_RELOC_AARCH64_LDST32_LO12: case BFD_RELOC_AARCH64_LDST64_LO12: case BFD_RELOC_AARCH64_LDST8_LO12: - case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12: - case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: - case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12: - case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12: - case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12: - case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12: - case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12: - case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12: - case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12: - case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12: - case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC: if (old_addend & ((1 << howto->rightshift) - 1)) return bfd_reloc_overflow; /* Used for ldr*|str* rt, [rn, #uimm12] to provide the low order diff --git a/ld/testsuite/ld-aarch64/emit-relocs-115.d b/ld/testsuite/ld-aarch64/emit-relocs-115.d index f436d32c61fca5abf7b1b59fa822fbc086dc9722..95a6e317448513a8afa0739adf3533de6fe2f90f 100644 --- a/ld/testsuite/ld-aarch64/emit-relocs-115.d +++ b/ld/testsuite/ld-aarch64/emit-relocs-115.d @@ -6,5 +6,5 @@ 00010000 <.text>: 10000: 798019d6 ldrsh x22, \[x14, #12\] 10000: R_AARCH64_P32_TLSLE_LDST16_TPREL_LO12_NC v2 - 10004: 79a72a28 ldrsh x8, \[x17, #5012\] + 10004: 79872a28 ldrsh x8, \[x17, #916\] 10004: R_AARCH64_P32_TLSLE_LDST16_TPREL_LO12_NC v3 diff --git a/ld/testsuite/ld-aarch64/emit-relocs-534.d b/ld/testsuite/ld-aarch64/emit-relocs-534.d index 121fdc4c0b2330475fff04ebd32dc66ba293382d..fe59b23182d1adff2786a6e7559a38c1c1230940 100644 --- a/ld/testsuite/ld-aarch64/emit-relocs-534.d +++ b/ld/testsuite/ld-aarch64/emit-relocs-534.d @@ -5,5 +5,5 @@ 0000000000010000 <.text>: 10000: 798009d6 ldrsh x22, \[x14, #4\] 10000: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC v2 - 10004: 79a71a28 ldrsh x8, \[x17, #5004\] + 10004: 79871a28 ldrsh x8, \[x17, #908\] 10004: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC v3 diff --git a/ld/testsuite/ld-aarch64/emit-relocs-555.d b/ld/testsuite/ld-aarch64/emit-relocs-555.d index e866b6034c4405edaf4459f2b0aa22697458075a..1e33998e3579b674e707c659facc3e5b3f988f77 100644 --- a/ld/testsuite/ld-aarch64/emit-relocs-555.d +++ b/ld/testsuite/ld-aarch64/emit-relocs-555.d @@ -5,5 +5,5 @@ 0000000000010000 <.text>: 10000: 798029d6 ldrsh x22, \[x14, #20\] 10000: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC v2 - 10004: 79a73a28 ldrsh x8, \[x17, #5020\] + 10004: 79873a28 ldrsh x8, \[x17, #924\] 10004: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC v3