PR30437 aarch64: make RELA relocs idempotent
authorMichael Matz <matz@suse.de>
Tue, 9 May 2023 15:48:01 +0000 (17:48 +0200)
committerMichael Matz <matz@suse.de>
Tue, 23 May 2023 14:43:14 +0000 (16:43 +0200)
normally RELA relocs in BFD should not consider the contents of the
relocated place.  The aarch64 psABI is even stricter, it specifies
(section 5.7.16) that all RELA relocs _must_ be idempotent.

Since the inception of the aarch64 BFD backend all the relocs have a
non-zero src_mask, and hence break this invariant.  It's normally not
a very visible problem as one can see it only when the relocated place
already contains a non-zero value, which usually only happens sometimes
when using 'ld -r' (or as in the testcase when jumping through hoops to
generate the relocations).  Or with alternative toolchains that do encode
stuff in the relocated places with the assumption that a relocation
to that place ignores whatever is there (as they can according to
the psABI).

Golang is such a toolchain and https://github.com/golang/go/issues/39927
is ultimately caused by this problem: the testcase testGCData failing
is caused by the garbage collection data-structure to describe a type
containing pointers to be wrong.  It's wrong because a field that's
supposed to contain a file-relative offset (to some gcbits) has a
relocation applied and that relocation has an addend which also is
already part of the go-produced object file (so the addend is
implicitely applied twice).

bfd/
PR ld/30437
* elfnn-aarch64.c (elfNN_aarch64_howto_table): Clear src_mask
if all relocation descriptors.

ld/
* testsuite/ld-aarch64/rela-idempotent.s: New testcase.
* testsuite/ld-aarch64/rela-idempotent.d: New.
* testsuite/ld-aarch64/aarch64-elf.exp: Run it.

bfd/elfnn-aarch64.c
ld/testsuite/ld-aarch64/aarch64-elf.exp
ld/testsuite/ld-aarch64/rela-idempotent.d [new file with mode: 0644]
ld/testsuite/ld-aarch64/rela-idempotent.s [new file with mode: 0644]

index c23cbd3601ab9216820a313abfac0c72374bd592..32799b6b009473ead4977d8dd52534b3539964fa 100644 (file)
@@ -478,7 +478,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (ABS64), /* name */
         false,                 /* partial_inplace */
-        ALL_ONES,              /* src_mask */
+        0,                     /* src_mask */
         ALL_ONES,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -493,7 +493,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (ABS32), /* name */
         false,                 /* partial_inplace */
-        0xffffffff,            /* src_mask */
+        0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -508,7 +508,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (ABS16), /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -523,7 +523,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (PREL64),        /* name */
         false,                 /* partial_inplace */
-        ALL_ONES,              /* src_mask */
+        0,                     /* src_mask */
         ALL_ONES,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -538,7 +538,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (PREL32),        /* name */
         false,                 /* partial_inplace */
-        0xffffffff,            /* src_mask */
+        0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -553,7 +553,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (PREL16),        /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -571,7 +571,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_UABS_G0),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -586,7 +586,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_UABS_G0_NC),       /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -601,7 +601,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_UABS_G1),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -616,7 +616,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_UABS_G1_NC),       /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -631,7 +631,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_UABS_G2),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -646,7 +646,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_UABS_G2_NC),       /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -661,7 +661,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_UABS_G3),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -680,7 +680,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_SABS_G0),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -695,7 +695,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_SABS_G1),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -710,7 +710,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_SABS_G2),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -728,7 +728,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_PREL_G0),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         true),         /* pcrel_offset */
 
@@ -743,7 +743,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_PREL_G0_NC),       /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         true),         /* pcrel_offset */
 
@@ -758,7 +758,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_PREL_G1),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         true),         /* pcrel_offset */
 
@@ -773,7 +773,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_PREL_G1_NC),       /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         true),         /* pcrel_offset */
 
@@ -788,7 +788,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_PREL_G2),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         true),         /* pcrel_offset */
 
@@ -803,7 +803,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_PREL_G2_NC),       /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         true),         /* pcrel_offset */
 
@@ -818,7 +818,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_PREL_G3),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         true),         /* pcrel_offset */
 
@@ -836,7 +836,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LD_PREL_LO19),  /* name */
         false,                 /* partial_inplace */
-        0x7ffff,               /* src_mask */
+        0,                     /* src_mask */
         0x7ffff,               /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -851,7 +851,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (ADR_PREL_LO21), /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -866,7 +866,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (ADR_PREL_PG_HI21),      /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -881,7 +881,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (ADR_PREL_PG_HI21_NC),   /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -896,7 +896,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (ADD_ABS_LO12_NC),       /* name */
         false,                 /* partial_inplace */
-        0x3ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x3ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -911,7 +911,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LDST8_ABS_LO12_NC),     /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                             /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -928,7 +928,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TSTBR14),       /* name */
         false,                 /* partial_inplace */
-        0x3fff,                /* src_mask */
+        0,                     /* src_mask */
         0x3fff,                /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -943,7 +943,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (CONDBR19),      /* name */
         false,                 /* partial_inplace */
-        0x7ffff,               /* src_mask */
+        0,                     /* src_mask */
         0x7ffff,               /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -958,7 +958,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (JUMP26),        /* name */
         false,                 /* partial_inplace */
-        0x3ffffff,             /* src_mask */
+        0,                     /* src_mask */
         0x3ffffff,             /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -973,7 +973,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (CALL26),        /* name */
         false,                 /* partial_inplace */
-        0x3ffffff,             /* src_mask */
+        0,                     /* src_mask */
         0x3ffffff,             /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -988,7 +988,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LDST16_ABS_LO12_NC),    /* name */
         false,                 /* partial_inplace */
-        0xffe,                 /* src_mask */
+        0,                     /* src_mask */
         0xffe,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1003,7 +1003,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LDST32_ABS_LO12_NC),    /* name */
         false,                 /* partial_inplace */
-        0xffc,                 /* src_mask */
+        0,                     /* src_mask */
         0xffc,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1018,7 +1018,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LDST64_ABS_LO12_NC),    /* name */
         false,                 /* partial_inplace */
-        0xff8,                 /* src_mask */
+        0,                     /* src_mask */
         0xff8,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1033,7 +1033,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LDST128_ABS_LO12_NC),   /* name */
         false,                 /* partial_inplace */
-        0xff0,                 /* src_mask */
+        0,                     /* src_mask */
         0xff0,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1049,7 +1049,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc,         /* special_function */
         AARCH64_R_STR (GOT_LD_PREL19), /* name */
         false,                         /* partial_inplace */
-        0xffffe0,                      /* src_mask */
+        0,                             /* src_mask */
         0xffffe0,                      /* dst_mask */
         true),                         /* pcrel_offset */
 
@@ -1065,7 +1065,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (ADR_GOT_PAGE),  /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -1080,7 +1080,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LD64_GOT_LO12_NC),      /* name */
         false,                 /* partial_inplace */
-        0xff8,                 /* src_mask */
+        0,                     /* src_mask */
         0xff8,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1095,7 +1095,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LD32_GOT_LO12_NC),      /* name */
         false,                 /* partial_inplace */
-        0xffc,                 /* src_mask */
+        0,                     /* src_mask */
         0xffc,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1110,7 +1110,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_GOTOFF_G0_NC),     /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1125,7 +1125,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (MOVW_GOTOFF_G1),        /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1140,7 +1140,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LD64_GOTOFF_LO15),      /* name */
         false,                 /* partial_inplace */
-        0x7ff8,                        /* src_mask */
+        0,                             /* src_mask */
         0x7ff8,                        /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1156,7 +1156,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LD32_GOTPAGE_LO14),     /* name */
         false,                 /* partial_inplace */
-        0x5ffc,                /* src_mask */
+        0,                     /* src_mask */
         0x5ffc,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1172,7 +1172,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (LD64_GOTPAGE_LO15),     /* name */
         false,                 /* partial_inplace */
-        0x7ff8,                /* src_mask */
+        0,                     /* src_mask */
         0x7ff8,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1188,7 +1188,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSGD_ADR_PAGE21),      /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -1202,7 +1202,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSGD_ADR_PREL21),      /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -1217,7 +1217,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSGD_ADD_LO12_NC),     /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1232,7 +1232,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSGD_MOVW_G0_NC),      /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1247,7 +1247,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSGD_MOVW_G1), /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1261,7 +1261,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSIE_ADR_GOTTPREL_PAGE21),     /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1275,7 +1275,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSIE_LD64_GOTTPREL_LO12_NC),   /* name */
         false,                 /* partial_inplace */
-        0xff8,                 /* src_mask */
+        0,                     /* src_mask */
         0xff8,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1289,7 +1289,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSIE_LD32_GOTTPREL_LO12_NC),   /* name */
         false,                 /* partial_inplace */
-        0xffc,                 /* src_mask */
+        0,                     /* src_mask */
         0xffc,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1303,7 +1303,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSIE_LD_GOTTPREL_PREL19),      /* name */
         false,                 /* partial_inplace */
-        0x1ffffc,              /* src_mask */
+        0,                     /* src_mask */
         0x1ffffc,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1317,7 +1317,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSIE_MOVW_GOTTPREL_G0_NC),     /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1331,7 +1331,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSIE_MOVW_GOTTPREL_G1),        /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1346,7 +1346,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_ADD_DTPREL_HI12), /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1361,7 +1361,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_ADD_DTPREL_LO12), /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1376,7 +1376,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_ADD_DTPREL_LO12_NC),      /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1391,7 +1391,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_ADD_LO12_NC),     /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1407,7 +1407,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_ADR_PAGE21),      /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -1421,7 +1421,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_ADR_PREL21),      /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -1436,7 +1436,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_LDST16_DTPREL_LO12),      /* name */
         false,                 /* partial_inplace */
-        0x1ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x1ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1451,7 +1451,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_LDST16_DTPREL_LO12_NC),   /* name */
         false,                 /* partial_inplace */
-        0x1ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x1ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1466,7 +1466,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_LDST32_DTPREL_LO12),      /* name */
         false,                 /* partial_inplace */
-        0x3ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x3ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1481,7 +1481,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_LDST32_DTPREL_LO12_NC),   /* name */
         false,                 /* partial_inplace */
-        0xffc00,               /* src_mask */
+        0,                     /* src_mask */
         0xffc00,               /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1496,7 +1496,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_LDST64_DTPREL_LO12),      /* name */
         false,                 /* partial_inplace */
-        0x3ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x3ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1511,7 +1511,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_LDST64_DTPREL_LO12_NC),   /* name */
         false,                 /* partial_inplace */
-        0x7fc00,               /* src_mask */
+        0,                     /* src_mask */
         0x7fc00,               /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1526,7 +1526,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_LDST8_DTPREL_LO12),       /* name */
         false,                 /* partial_inplace */
-        0x3ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x3ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1541,7 +1541,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_LDST8_DTPREL_LO12_NC),    /* name */
         false,                 /* partial_inplace */
-        0x3ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x3ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1556,7 +1556,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_MOVW_DTPREL_G0),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1571,7 +1571,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_MOVW_DTPREL_G0_NC),       /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1586,7 +1586,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_MOVW_DTPREL_G1),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1601,7 +1601,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_MOVW_DTPREL_G1_NC),       /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1616,7 +1616,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLD_MOVW_DTPREL_G2),  /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1630,7 +1630,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_MOVW_TPREL_G2),   /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1644,7 +1644,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_MOVW_TPREL_G1),   /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1658,7 +1658,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_MOVW_TPREL_G1_NC),        /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1672,7 +1672,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_MOVW_TPREL_G0),   /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1686,7 +1686,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_MOVW_TPREL_G0_NC),        /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1700,7 +1700,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_ADD_TPREL_HI12),  /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1714,7 +1714,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_ADD_TPREL_LO12),  /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1728,7 +1728,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_ADD_TPREL_LO12_NC),       /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1743,7 +1743,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_LDST16_TPREL_LO12),       /* name */
         false,                 /* partial_inplace */
-        0x1ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x1ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1758,7 +1758,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_LDST16_TPREL_LO12_NC),    /* name */
         false,                 /* partial_inplace */
-        0x1ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x1ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1773,7 +1773,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_LDST32_TPREL_LO12),       /* name */
         false,                 /* partial_inplace */
-        0xffc00,               /* src_mask */
+        0,                     /* src_mask */
         0xffc00,               /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1788,7 +1788,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_LDST32_TPREL_LO12_NC),    /* name */
         false,                 /* partial_inplace */
-        0xffc00,               /* src_mask */
+        0,                     /* src_mask */
         0xffc00,               /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1803,7 +1803,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_LDST64_TPREL_LO12),       /* name */
         false,                 /* partial_inplace */
-        0x7fc00,               /* src_mask */
+        0,                     /* src_mask */
         0x7fc00,               /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1818,7 +1818,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_LDST64_TPREL_LO12_NC),    /* name */
         false,                 /* partial_inplace */
-        0x7fc00,               /* src_mask */
+        0,                     /* src_mask */
         0x7fc00,               /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1833,7 +1833,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_LDST8_TPREL_LO12),        /* name */
         false,                 /* partial_inplace */
-        0x3ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x3ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1848,7 +1848,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSLE_LDST8_TPREL_LO12_NC),     /* name */
         false,                 /* partial_inplace */
-        0x3ffc00,              /* src_mask */
+        0,                     /* src_mask */
         0x3ffc00,              /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1862,7 +1862,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSDESC_LD_PREL19),     /* name */
         false,                 /* partial_inplace */
-        0x0ffffe0,             /* src_mask */
+        0,                     /* src_mask */
         0x0ffffe0,             /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -1876,7 +1876,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSDESC_ADR_PREL21),    /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -1892,7 +1892,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSDESC_ADR_PAGE21),    /* name */
         false,                 /* partial_inplace */
-        0x1fffff,              /* src_mask */
+        0,                     /* src_mask */
         0x1fffff,              /* dst_mask */
         true),                 /* pcrel_offset */
 
@@ -1907,7 +1907,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSDESC_LD64_LO12),     /* name */
         false,                 /* partial_inplace */
-        0xff8,                 /* src_mask */
+        0,                     /* src_mask */
         0xff8,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1922,7 +1922,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSDESC_LD32_LO12_NC),  /* name */
         false,                 /* partial_inplace */
-        0xffc,                 /* src_mask */
+        0,                     /* src_mask */
         0xffc,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1937,7 +1937,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSDESC_ADD_LO12),      /* name */
         false,                 /* partial_inplace */
-        0xfff,                 /* src_mask */
+        0,                     /* src_mask */
         0xfff,                 /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1951,7 +1951,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSDESC_OFF_G1),        /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -1965,7 +1965,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (TLSDESC_OFF_G0_NC),     /* name */
         false,                 /* partial_inplace */
-        0xffff,                /* src_mask */
+        0,                     /* src_mask */
         0xffff,                /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -2021,7 +2021,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (COPY),  /* name */
         true,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
+        0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -2035,7 +2035,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (GLOB_DAT),      /* name */
         true,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
+        0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -2049,7 +2049,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (JUMP_SLOT),     /* name */
         true,                  /* partial_inplace */
-        0xffffffff,            /* src_mask */
+        0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
         false),                /* pcrel_offset */
 
@@ -2063,7 +2063,7 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         bfd_elf_generic_reloc, /* special_function */
         AARCH64_R_STR (RELATIVE),      /* name */
         true,                  /* partial_inplace */
-        ALL_ONES,              /* src_mask */
+        0,                     /* src_mask */
         ALL_ONES,              /* dst_mask */
         false),                /* pcrel_offset */
 
index ec55bf49931ac4b0dc1894931b334669292defde..b025fcbd5670ab5f196fedd32ee3eb8055c2f6e7 100644 (file)
@@ -401,6 +401,8 @@ run_dump_test_lp64 "rela-abs-relative"
 run_dump_test_lp64 "rela-abs-relative-be"
 run_dump_test_lp64 "rela-abs-relative-opt"
 
+run_dump_test_lp64 "rela-idempotent"
+
 run_dump_test_lp64 "pie-bind-locally"
 
 run_dump_test "property-bti-pac1"
diff --git a/ld/testsuite/ld-aarch64/rela-idempotent.d b/ld/testsuite/ld-aarch64/rela-idempotent.d
new file mode 100644 (file)
index 0000000..f3b5ffb
--- /dev/null
@@ -0,0 +1,19 @@
+#name: rela-idempotent
+#source: rela-idempotent.s
+#target: [check_shared_lib_support]
+#ld: -shared -Ttext-segment=0x100000 -Tdata=0x200000 -Trelocs.ld
+#notarget: aarch64_be-*-*
+#objdump: -dR -j .data
+#...
+
+Disassembly of section .data:
+
+.* <l>:
+  200000:      00200032.*
+                       200000: R_AARCH64_RELATIVE      \*ABS\*\+0x200032
+  200004:      00000000.*
+
+.* <q>:
+  200008:      00200054.*
+                       200008: R_AARCH64_RELATIVE      \*ABS\*\+0x200054
+  20000c:      00000000.*
diff --git a/ld/testsuite/ld-aarch64/rela-idempotent.s b/ld/testsuite/ld-aarch64/rela-idempotent.s
new file mode 100644 (file)
index 0000000..7cb5dff
--- /dev/null
@@ -0,0 +1,14 @@
+# this checks that aarch64 RELA relocs are ignoring existing section
+# content of the relocated place
+       .text
+       .global _start
+_start:
+       ret
+
+       .data
+       .p2align 4
+l:     .long   0x11111111, 0x22222222
+q:     .quad   0x4444444433333333
+
+       .reloc l, BFD_RELOC_64, q+42
+       .reloc q, BFD_RELOC_64, l+84