* [PATCH] PR30437 aarch64: make RELA relocs idempotent
@ 2023-05-10 14:04 Michael Matz
2023-05-17 14:35 ` Nick Clifton
2023-05-24 15:26 ` Richard Earnshaw (lists)
0 siblings, 2 replies; 11+ messages in thread
From: Michael Matz @ 2023-05-10 14:04 UTC (permalink / raw)
To: binutils
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.
---
Tested for aarch64-elf and aarch64-linux (and the other ~150 targets,
though those can't be affected). Also tested natively on
aarch64-suse-linux-gnu. Okay for master?
Ciao,
Michael.
bfd/elfnn-aarch64.c | 208 +++++++++++-----------
ld/testsuite/ld-aarch64/aarch64-elf.exp | 2 +
ld/testsuite/ld-aarch64/rela-idempotent.d | 19 ++
ld/testsuite/ld-aarch64/rela-idempotent.s | 14 ++
4 files changed, 139 insertions(+), 104 deletions(-)
create mode 100644 ld/testsuite/ld-aarch64/rela-idempotent.d
create mode 100644 ld/testsuite/ld-aarch64/rela-idempotent.s
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index c23cbd3601a..32799b6b009 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -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 */
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index ec55bf49931..b025fcbd567 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -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
index 00000000000..f3b5ffb988b
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/rela-idempotent.d
@@ -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
index 00000000000..7cb5dffb3bd
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/rela-idempotent.s
@@ -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
--
2.39.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-10 14:04 [PATCH] PR30437 aarch64: make RELA relocs idempotent Michael Matz
@ 2023-05-17 14:35 ` Nick Clifton
2023-05-24 15:26 ` Richard Earnshaw (lists)
1 sibling, 0 replies; 11+ messages in thread
From: Nick Clifton @ 2023-05-17 14:35 UTC (permalink / raw)
To: Michael Matz, binutils
Hi Michael,
> 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.
> ---
>
> Tested for aarch64-elf and aarch64-linux (and the other ~150 targets,
> though those can't be affected). Also tested natively on
> aarch64-suse-linux-gnu. Okay for master?
Approved - please apply.
Cheers
Nick
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-10 14:04 [PATCH] PR30437 aarch64: make RELA relocs idempotent Michael Matz
2023-05-17 14:35 ` Nick Clifton
@ 2023-05-24 15:26 ` Richard Earnshaw (lists)
2023-05-24 16:03 ` Michael Matz
2023-05-24 22:54 ` Alan Modra
1 sibling, 2 replies; 11+ messages in thread
From: Richard Earnshaw (lists) @ 2023-05-24 15:26 UTC (permalink / raw)
To: Michael Matz, binutils
On 10/05/2023 15:04, Michael Matz via Binutils wrote:
> 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.
> ---
>
> Tested for aarch64-elf and aarch64-linux (and the other ~150 targets,
> though those can't be affected). Also tested natively on
> aarch64-suse-linux-gnu. Okay for master?
>
Isn't this what partial_inplace is supposed to describe? Since that's
false, I'd expect any value stored in the section contents to be ignored.
R.
>
> Ciao,
> Michael.
>
> bfd/elfnn-aarch64.c | 208 +++++++++++-----------
> ld/testsuite/ld-aarch64/aarch64-elf.exp | 2 +
> ld/testsuite/ld-aarch64/rela-idempotent.d | 19 ++
> ld/testsuite/ld-aarch64/rela-idempotent.s | 14 ++
> 4 files changed, 139 insertions(+), 104 deletions(-)
> create mode 100644 ld/testsuite/ld-aarch64/rela-idempotent.d
> create mode 100644 ld/testsuite/ld-aarch64/rela-idempotent.s
>
> diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
> index c23cbd3601a..32799b6b009 100644
> --- a/bfd/elfnn-aarch64.c
> +++ b/bfd/elfnn-aarch64.c
> @@ -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 */
>
> diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
> index ec55bf49931..b025fcbd567 100644
> --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
> +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
> @@ -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
> index 00000000000..f3b5ffb988b
> --- /dev/null
> +++ b/ld/testsuite/ld-aarch64/rela-idempotent.d
> @@ -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
> index 00000000000..7cb5dffb3bd
> --- /dev/null
> +++ b/ld/testsuite/ld-aarch64/rela-idempotent.s
> @@ -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
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-24 15:26 ` Richard Earnshaw (lists)
@ 2023-05-24 16:03 ` Michael Matz
2023-05-25 9:35 ` Richard Earnshaw (lists)
2023-05-24 22:54 ` Alan Modra
1 sibling, 1 reply; 11+ messages in thread
From: Michael Matz @ 2023-05-24 16:03 UTC (permalink / raw)
To: Richard Earnshaw (lists); +Cc: binutils
Hello,
On Wed, 24 May 2023, Richard Earnshaw (lists) wrote:
> > Tested for aarch64-elf and aarch64-linux (and the other ~150 targets,
> > though those can't be affected). Also tested natively on
> > aarch64-suse-linux-gnu. Okay for master?
> >
>
> Isn't this what partial_inplace is supposed to describe? Since that's
> false, I'd expect any value stored in the section contents to be
> ignored.
One might think so, yes. But in practice that doesn't seem to be the case
(anymore?). I can't quite wrap my head around the logic in reloc.c and
interaction between partial_inplace and src_mask. The documentation says
that partial_inplace _and_ src_mask should be zero for RELA targets (or
rather, that other values are suspicious), and obviously having the
former, but not the latter does make a difference. (FWIW, x86_64 recently
was fixed as well to have zero src_mask, and most other RELA targets also
have it zero)
It's possible that partial_inplace only affects partial links (ld -r), at
least the docu for that field specifically talks about only that, whereas
here (the go bug) we have the problem of a final link where the section
contents are non-zero. I don't know if partial_inplace should or should
not also affect final links, and if it's a bug that src_mask matters even
with !partial_replace. But one of the two needs to yield: either the
logic regarding partial_inplace in reloc.c (so that src_mask isn't
relevant anymore), or src_mask needs to be zero. The advantage of the
latter change is that it's aarch64-specific, whereas a change to
partial_inplace handling affects everything and needs more bravery than I
have.
Either way, even _if_ partial_inplace would be made so that src_mask
doesn't matter anymore, then the change to zero src_mask would then still
be at least harmless.
(skimming some more uses of src_mask relative to uses of partial_inplace
in the aarch64 target also shows some more possibly dubious consideration
of original section contents in _bfd_aarch64_elf_put_addend. It always
looks at the original content and uses src_mask as selector of being for
insns or data, but then goes on to mask the read contents only against
dst_mask, and not against src_mask. I don't quite know what to make of
that)
Ciao,
Michael.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-24 15:26 ` Richard Earnshaw (lists)
2023-05-24 16:03 ` Michael Matz
@ 2023-05-24 22:54 ` Alan Modra
1 sibling, 0 replies; 11+ messages in thread
From: Alan Modra @ 2023-05-24 22:54 UTC (permalink / raw)
To: Richard Earnshaw (lists); +Cc: Michael Matz, binutils
On Wed, May 24, 2023 at 04:26:03PM +0100, Richard Earnshaw (lists) via Binutils wrote:
> > * elfnn-aarch64.c (elfNN_aarch64_howto_table): Clear src_mask
> > if all relocation descriptors.
> Isn't this what partial_inplace is supposed to describe?
Strictly speaking that flag describes what should be done for ld -r.
It has no effect on final link. It does also affect what is produced
by gas (which is by far the messiest and most confusing part of libbfd
relocation processing).
> Since that's
> false, I'd expect any value stored in the section contents to be ignored.
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-24 16:03 ` Michael Matz
@ 2023-05-25 9:35 ` Richard Earnshaw (lists)
2023-05-25 12:29 ` Michael Matz
0 siblings, 1 reply; 11+ messages in thread
From: Richard Earnshaw (lists) @ 2023-05-25 9:35 UTC (permalink / raw)
To: Michael Matz; +Cc: binutils
On 24/05/2023 17:03, Michael Matz via Binutils wrote:
> Hello,
>
> On Wed, 24 May 2023, Richard Earnshaw (lists) wrote:
>
>>> Tested for aarch64-elf and aarch64-linux (and the other ~150 targets,
>>> though those can't be affected). Also tested natively on
>>> aarch64-suse-linux-gnu. Okay for master?
>>>
>>
>> Isn't this what partial_inplace is supposed to describe? Since that's
>> false, I'd expect any value stored in the section contents to be
>> ignored.
>
> One might think so, yes. But in practice that doesn't seem to be the case
> (anymore?). I can't quite wrap my head around the logic in reloc.c and
> interaction between partial_inplace and src_mask. The documentation says
> that partial_inplace _and_ src_mask should be zero for RELA targets (or
> rather, that other values are suspicious), and obviously having the
> former, but not the latter does make a difference. (FWIW, x86_64 recently
> was fixed as well to have zero src_mask, and most other RELA targets also
> have it zero)
>
> It's possible that partial_inplace only affects partial links (ld -r), at
> least the docu for that field specifically talks about only that, whereas
> here (the go bug) we have the problem of a final link where the section
> contents are non-zero. I don't know if partial_inplace should or should
> not also affect final links, and if it's a bug that src_mask matters even
> with !partial_replace. But one of the two needs to yield: either the
> logic regarding partial_inplace in reloc.c (so that src_mask isn't
> relevant anymore), or src_mask needs to be zero. The advantage of the
> latter change is that it's aarch64-specific, whereas a change to
> partial_inplace handling affects everything and needs more bravery than I
> have.
>
> Either way, even _if_ partial_inplace would be made so that src_mask
> doesn't matter anymore, then the change to zero src_mask would then still
> be at least harmless.
>
> (skimming some more uses of src_mask relative to uses of partial_inplace
> in the aarch64 target also shows some more possibly dubious consideration
> of original section contents in _bfd_aarch64_elf_put_addend. It always
> looks at the original content and uses src_mask as selector of being for
> insns or data, but then goes on to mask the read contents only against
> dst_mask, and not against src_mask. I don't quite know what to make of
> that)
>
>
> Ciao,
> Michael.
Thanks for the detailed explanation. That makes sense, overall. However...
I didn't think we had separate relocation rules for REL/RELA format
relocs. I know that we recommend RELA for aarch64, but how would an
object file with REL format relocs be handled if src_mask is always zero?
R.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-25 9:35 ` Richard Earnshaw (lists)
@ 2023-05-25 12:29 ` Michael Matz
2023-05-25 13:22 ` Richard Earnshaw (lists)
0 siblings, 1 reply; 11+ messages in thread
From: Michael Matz @ 2023-05-25 12:29 UTC (permalink / raw)
To: Richard Earnshaw (lists); +Cc: binutils
Hello,
On Thu, 25 May 2023, Richard Earnshaw (lists) wrote:
> Thanks for the detailed explanation. That makes sense, overall. However...
>
> I didn't think we had separate relocation rules for REL/RELA format
> relocs. I know that we recommend RELA for aarch64, but how would an
> object file with REL format relocs be handled if src_mask is always
> zero?
Right now the aarch64 bfd backend only support RELA
(elf_backend_may_use_rel_p is off). elf64-mips is an example that
supports both, and it has separate howto tables for rel and rela
descriptors (e.g. mips_elf64_howto_table_rel and
mips_elf64_howto_table_rela), with the appropriate
src_mask/partial_inplace settings depending on rel/rela:
HOWTO (R_MIPS_32, /* type */
...
true, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
vs.
HOWTO (R_MIPS_32, /* type */
...
false, /* partial_inplace */
0, /* src_mask */
0xffffffff, /* dst_mask */
the rtype_to_howto backend routine appropriately switches between those
depending on side-info passed in parameters. (Whereas the name_lookup and
type_lookup routines always use the rela tables and contain a FIXME
comment to that effect :) ). Various non-mips embedded targets try to
also support this, but often only for read-in, not for generating both
types of relocs, and so get away with only one howto table. (I believe (!)
mips is the only one that actively tries to get REL+RELA support correct).
Ciao,
Michael.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-25 12:29 ` Michael Matz
@ 2023-05-25 13:22 ` Richard Earnshaw (lists)
2023-05-25 14:12 ` Michael Matz
0 siblings, 1 reply; 11+ messages in thread
From: Richard Earnshaw (lists) @ 2023-05-25 13:22 UTC (permalink / raw)
To: Michael Matz; +Cc: binutils
On 25/05/2023 13:29, Michael Matz via Binutils wrote:
> Hello,
>
> On Thu, 25 May 2023, Richard Earnshaw (lists) wrote:
>
>> Thanks for the detailed explanation. That makes sense, overall. However...
>>
>> I didn't think we had separate relocation rules for REL/RELA format
>> relocs. I know that we recommend RELA for aarch64, but how would an
>> object file with REL format relocs be handled if src_mask is always
>> zero?
>
> Right now the aarch64 bfd backend only support RELA
> (elf_backend_may_use_rel_p is off). elf64-mips is an example that
> supports both, and it has separate howto tables for rel and rela
> descriptors (e.g. mips_elf64_howto_table_rel and
> mips_elf64_howto_table_rela), with the appropriate
> src_mask/partial_inplace settings depending on rel/rela:
>
> HOWTO (R_MIPS_32, /* type */
> ...
> true, /* partial_inplace */
> 0xffffffff, /* src_mask */
> 0xffffffff, /* dst_mask */
>
> vs.
>
> HOWTO (R_MIPS_32, /* type */
> ...
> false, /* partial_inplace */
> 0, /* src_mask */
> 0xffffffff, /* dst_mask */
>
> the rtype_to_howto backend routine appropriately switches between those
> depending on side-info passed in parameters. (Whereas the name_lookup and
> type_lookup routines always use the rela tables and contain a FIXME
> comment to that effect :) ). Various non-mips embedded targets try to
> also support this, but often only for read-in, not for generating both
> types of relocs, and so get away with only one howto table. (I believe (!)
> mips is the only one that actively tries to get REL+RELA support correct).
>
>
> Ciao,
> Michael.
I'd be surprised if even that is totally correct. ELF permits
relocations of a single 'place' to be chained provided that they are of
the same type (all REL or all RELA); not that I've ever seen that done
in practice. When this is done the addend for the second and subsequent
relocations use the result of the previous relocation - they must be
processed in order. Only the last relocation in a sequence writes a
value back to the location being relocated.
So really, we shouldn't need two tables, we just need to know where to
get the addend value from at the start of a chain.
R.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-25 13:22 ` Richard Earnshaw (lists)
@ 2023-05-25 14:12 ` Michael Matz
2023-05-25 15:56 ` Richard Earnshaw (lists)
0 siblings, 1 reply; 11+ messages in thread
From: Michael Matz @ 2023-05-25 14:12 UTC (permalink / raw)
To: Richard Earnshaw (lists); +Cc: binutils
Hello,
On Thu, 25 May 2023, Richard Earnshaw (lists) wrote:
> I'd be surprised if even that is totally correct. ELF permits
> relocations of a single 'place' to be chained provided that they are of
> the same type (all REL or all RELA); not that I've ever seen that done
> in practice. When this is done the addend for the second and subsequent
> relocations use the result of the previous relocation - they must be
> processed in order. Only the last relocation in a sequence writes a
> value back to the location being relocated.
>
> So really, we shouldn't need two tables, we just need to know where to
> get the addend value from at the start of a chain.
Sort of, except ... it's not just for a chain of relocs (to the same
place) steming from a single input file, but also about the similar
situation when the same place is relocated multiple times due to 'ld -r'
or pre-existing (non-zero) section content in an input file to a final
link. In this situation it's not easily determined what's the start of a
reloc chain.
I still agree with you that abstractly multiple howto tables shouldn't be
needed, because RELA relocs _always_ should ignore section content on
read-in, and hence the reloc routines could simply special-case the
RELA/REL distinction by just not looking at src_mask or partial_inplace
for RELA relocs. It's just that BFD isn't structured in this way.
The internal representation of relocs always has an addend, no matter if
it comes from read-in section contents or a RELA reloc, and the
information of where it came from is lost (and section content isn't
zeroed on read-in for REL relocs, when transferring the addend to the bfd
reloc structure). So, to get this all somewhat working correctly right
now multiple howto entries are necessary (or special-casing target
reloc-swap-in and swap-out routines).
I'm totally sure, once one tries to _really_ start mixing REL and RELA
relocs in a link, at the latest when ld -r and/or other toolchains are
involved, that a heap of bugs will be uncovered :-)
(And of course, it's always possible that REL relocations cannot always be
used to achieve idempotence even in presence of 'ld -r', in which case
RELA must be used. The aarch64 psABI thankfully even spells this out.)
Ciao,
Michael.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-25 14:12 ` Michael Matz
@ 2023-05-25 15:56 ` Richard Earnshaw (lists)
2023-05-25 16:01 ` Michael Matz
0 siblings, 1 reply; 11+ messages in thread
From: Richard Earnshaw (lists) @ 2023-05-25 15:56 UTC (permalink / raw)
To: Michael Matz; +Cc: binutils
On 25/05/2023 15:12, Michael Matz via Binutils wrote:
> Hello,
>
> On Thu, 25 May 2023, Richard Earnshaw (lists) wrote:
>
>> I'd be surprised if even that is totally correct. ELF permits
>> relocations of a single 'place' to be chained provided that they are of
>> the same type (all REL or all RELA); not that I've ever seen that done
>> in practice. When this is done the addend for the second and subsequent
>> relocations use the result of the previous relocation - they must be
>> processed in order. Only the last relocation in a sequence writes a
>> value back to the location being relocated.
>>
>> So really, we shouldn't need two tables, we just need to know where to
>> get the addend value from at the start of a chain.
>
> Sort of, except ... it's not just for a chain of relocs (to the same
> place) steming from a single input file, but also about the similar
> situation when the same place is relocated multiple times due to 'ld -r'
> or pre-existing (non-zero) section content in an input file to a final
> link. In this situation it's not easily determined what's the start of a
> reloc chain.
>
> I still agree with you that abstractly multiple howto tables shouldn't be
> needed, because RELA relocs _always_ should ignore section content on
> read-in, and hence the reloc routines could simply special-case the
> RELA/REL distinction by just not looking at src_mask or partial_inplace
> for RELA relocs. It's just that BFD isn't structured in this way.
> The internal representation of relocs always has an addend, no matter if
> it comes from read-in section contents or a RELA reloc, and the
> information of where it came from is lost (and section content isn't
> zeroed on read-in for REL relocs, when transferring the addend to the bfd
> reloc structure). So, to get this all somewhat working correctly right
> now multiple howto entries are necessary (or special-casing target
> reloc-swap-in and swap-out routines).
>
> I'm totally sure, once one tries to _really_ start mixing REL and RELA
> relocs in a link, at the latest when ld -r and/or other toolchains are
> involved, that a heap of bugs will be uncovered :-)
It shouldn't be a big problem because ELF says it's undefined if the
different types of reloc target the same location. IF they're
addressing different (presumed non-overlapping) locations then the
ordering shouldn't matter.
>
> (And of course, it's always possible that REL relocations cannot always be
> used to achieve idempotence even in presence of 'ld -r', in which case
> RELA must be used. The aarch64 psABI thankfully even spells this out.)
>
There's no fundamental reason why a toolchain doing 'ld -r' can't always
emit RELA format relocs, even if the input format was REL. In fact, I'd
argue that really it has to in most cases as 'ld -r' destroys the
information that's needed to reprocess the relocations.
But I agree with you, this is all likely broken in BFD because we have
no way of testing it (gas can't create multiple relocs to a single
location to the best of my knowledge).
R.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] PR30437 aarch64: make RELA relocs idempotent
2023-05-25 15:56 ` Richard Earnshaw (lists)
@ 2023-05-25 16:01 ` Michael Matz
0 siblings, 0 replies; 11+ messages in thread
From: Michael Matz @ 2023-05-25 16:01 UTC (permalink / raw)
To: Richard Earnshaw (lists); +Cc: binutils
Hello,
On Thu, 25 May 2023, Richard Earnshaw (lists) wrote:
> > (And of course, it's always possible that REL relocations cannot always be
> > used to achieve idempotence even in presence of 'ld -r', in which case
> > RELA must be used. The aarch64 psABI thankfully even spells this out.)
>
> There's no fundamental reason why a toolchain doing 'ld -r' can't always emit
> RELA format relocs, even if the input format was REL. In fact, I'd argue that
> really it has to in most cases as 'ld -r' destroys the information that's
> needed to reprocess the relocations.
Right.
> But I agree with you, this is all likely broken in BFD because we have
> no way of testing it (gas can't create multiple relocs to a single
> location to the best of my knowledge).
With the .reloc directive it should be possible. But if you try to do
that you probably go down a rabbit hole of strange and wonderful
proportions :)
Ciao,
Michael.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2023-05-25 16:01 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-10 14:04 [PATCH] PR30437 aarch64: make RELA relocs idempotent Michael Matz
2023-05-17 14:35 ` Nick Clifton
2023-05-24 15:26 ` Richard Earnshaw (lists)
2023-05-24 16:03 ` Michael Matz
2023-05-25 9:35 ` Richard Earnshaw (lists)
2023-05-25 12:29 ` Michael Matz
2023-05-25 13:22 ` Richard Earnshaw (lists)
2023-05-25 14:12 ` Michael Matz
2023-05-25 15:56 ` Richard Earnshaw (lists)
2023-05-25 16:01 ` Michael Matz
2023-05-24 22:54 ` Alan Modra
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).