Accepting request 1089814 from devel:gcc
- riscv-dynamic-tls-reloc-pie.patch: Backport for PR ld/22263 and PR ld/25694 - riscv-pr22263-1.patch: Backport for PR ld/22263 (forwarded request 1089774 from Andreas_Schwab) OBS-URL: https://build.opensuse.org/request/show/1089814 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/binutils?expand=0&rev=166
This commit is contained in:
commit
f640d8dd9c
@ -1,3 +1,10 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue May 30 09:43:15 UTC 2023 - Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
- riscv-dynamic-tls-reloc-pie.patch: Backport for PR ld/22263 and PR
|
||||||
|
ld/25694
|
||||||
|
- riscv-pr22263-1.patch: Backport for PR ld/22263
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Apr 12 14:56:56 UTC 2023 - Martin Liška <mliska@suse.cz>
|
Wed Apr 12 14:56:56 UTC 2023 - Martin Liška <mliska@suse.cz>
|
||||||
|
|
||||||
|
@ -154,6 +154,8 @@ Patch42: binutils-compat-old-behaviour.diff
|
|||||||
Patch43: binutils-revert-hlasm-insns.diff
|
Patch43: binutils-revert-hlasm-insns.diff
|
||||||
Patch44: binutils-revert-rela.diff
|
Patch44: binutils-revert-rela.diff
|
||||||
Patch45: extensa-gcc-4_3-fix.diff
|
Patch45: extensa-gcc-4_3-fix.diff
|
||||||
|
Patch46: riscv-dynamic-tls-reloc-pie.patch
|
||||||
|
Patch47: riscv-pr22263-1.patch
|
||||||
Patch100: add-ulp-section.diff
|
Patch100: add-ulp-section.diff
|
||||||
Patch90: cross-avr-nesc-as.patch
|
Patch90: cross-avr-nesc-as.patch
|
||||||
Patch92: cross-avr-omit_section_dynsym.patch
|
Patch92: cross-avr-omit_section_dynsym.patch
|
||||||
@ -278,6 +280,8 @@ cp ld/ldgram.y ld/ldgram.y.orig
|
|||||||
%patch44 -p1
|
%patch44 -p1
|
||||||
%patch45 -p1
|
%patch45 -p1
|
||||||
%endif
|
%endif
|
||||||
|
%patch46 -p1
|
||||||
|
%patch47 -p1
|
||||||
%patch100 -p1
|
%patch100 -p1
|
||||||
%if "%{TARGET}" == "avr"
|
%if "%{TARGET}" == "avr"
|
||||||
cp gas/config/tc-avr.h gas/config/tc-avr-nesc.h
|
cp gas/config/tc-avr.h gas/config/tc-avr-nesc.h
|
||||||
|
103
riscv-dynamic-tls-reloc-pie.patch
Normal file
103
riscv-dynamic-tls-reloc-pie.patch
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
From f491758f183592cbf8113e02a2bebbd412ff7358 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nelson Chu <nelson@nelson.ba.rivosinc.com>
|
||||||
|
Date: Thu, 4 May 2023 17:08:50 +0800
|
||||||
|
Subject: [PATCH] [PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs
|
||||||
|
in PIE.
|
||||||
|
|
||||||
|
Lots of targets already fixed the TEXTREL problem for TLS in PIE.
|
||||||
|
|
||||||
|
* For PR ld/25694,
|
||||||
|
In the check_reloc, refer to spare and loongarch, they don't need to reserve
|
||||||
|
any local dynamic reloc for TLS LE in pie/pde, and similar to other targets.
|
||||||
|
So it seems like riscv was too conservative to estimate the TLS LE before.
|
||||||
|
Just break and don't goto static_reloc for TLS LE in pie/pde can fix the
|
||||||
|
TEXTREL problem.
|
||||||
|
|
||||||
|
* For PR ld/22263,
|
||||||
|
The risc-v code for TLS GD/IE in the relocate_section seems same as MIPS port.
|
||||||
|
So similar to MIPS, pr22570, commits 9143e72c6d4d and 1cb83cac9a89, it seems
|
||||||
|
also the right way to do the same thing for risc-v.
|
||||||
|
|
||||||
|
On risc-v, fixes
|
||||||
|
FAIL: Build pr22263-1
|
||||||
|
|
||||||
|
RISC-V haven't supported the TLS transitions, so will need the same fix (use
|
||||||
|
bfd_link_dll) in the future.
|
||||||
|
|
||||||
|
bfd/
|
||||||
|
PR ld/22263
|
||||||
|
PR ld/25694
|
||||||
|
* elfnn-riscv.c (riscv_elf_check_relocs): Replace bfd_link_pic with
|
||||||
|
bfd_link_dll for TLS IE. Don't need to reserve the local dynamic
|
||||||
|
relocation for TLS LE in pie/pde, and report error in pic just like
|
||||||
|
before.
|
||||||
|
(riscv_elf_relocate_section): For TLS GD/IE, use bfd_link_dll rather
|
||||||
|
than !bfd_link_pic in determining the dynamic symbol index. Avoid
|
||||||
|
the index of -1.
|
||||||
|
---
|
||||||
|
bfd/elfnn-riscv.c | 25 +++++++++++--------------
|
||||||
|
1 file changed, 11 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
|
||||||
|
index 4a5da7df3fe..ee2d19f7699 100644
|
||||||
|
--- a/bfd/elfnn-riscv.c
|
||||||
|
+++ b/bfd/elfnn-riscv.c
|
||||||
|
@@ -732,7 +732,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_RISCV_TLS_GOT_HI20:
|
||||||
|
- if (bfd_link_pic (info))
|
||||||
|
+ if (bfd_link_dll (info))
|
||||||
|
info->flags |= DF_STATIC_TLS;
|
||||||
|
if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
|
||||||
|
|| !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
|
||||||
|
@@ -787,11 +787,12 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||||
|
goto static_reloc;
|
||||||
|
|
||||||
|
case R_RISCV_TPREL_HI20:
|
||||||
|
+ /* This is not allowed in the pic, but okay in pie. */
|
||||||
|
if (!bfd_link_executable (info))
|
||||||
|
return bad_static_reloc (abfd, r_type, h);
|
||||||
|
if (h != NULL)
|
||||||
|
riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
|
||||||
|
- goto static_reloc;
|
||||||
|
+ break;
|
||||||
|
|
||||||
|
case R_RISCV_HI20:
|
||||||
|
if (bfd_link_pic (info))
|
||||||
|
@@ -2689,24 +2690,20 @@ riscv_elf_relocate_section (bfd *output_bfd,
|
||||||
|
if (htab->elf.srelgot == NULL)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
- if (h != NULL)
|
||||||
|
- {
|
||||||
|
- bool dyn, pic;
|
||||||
|
- dyn = htab->elf.dynamic_sections_created;
|
||||||
|
- pic = bfd_link_pic (info);
|
||||||
|
-
|
||||||
|
- if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
|
||||||
|
- && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||||
|
- indx = h->dynindx;
|
||||||
|
- }
|
||||||
|
+ bool dyn = elf_hash_table (info)->dynamic_sections_created;
|
||||||
|
+ if (h != NULL
|
||||||
|
+ && h->dynindx != -1
|
||||||
|
+ && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
|
||||||
|
+ && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||||
|
+ indx = h->dynindx;
|
||||||
|
|
||||||
|
/* The GOT entries have not been initialized yet. Do it
|
||||||
|
now, and emit any relocations. */
|
||||||
|
- if ((bfd_link_pic (info) || indx != 0)
|
||||||
|
+ if ((bfd_link_dll (info) || indx != 0)
|
||||||
|
&& (h == NULL
|
||||||
|
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||||
|
|| h->root.type != bfd_link_hash_undefweak))
|
||||||
|
- need_relocs = true;
|
||||||
|
+ need_relocs = true;
|
||||||
|
|
||||||
|
if (tls_type & GOT_TLS_GD)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.40.1
|
||||||
|
|
108
riscv-pr22263-1.patch
Normal file
108
riscv-pr22263-1.patch
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
From 53e0482788fa665f532936ba3637bc0fcde6db2c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nelson Chu <nelson@rivosinc.com>
|
||||||
|
Date: Sat, 27 May 2023 09:36:20 +0800
|
||||||
|
Subject: [PATCH] RISC-V: Avoid spurious R_RISCV_NONE for pr22263-1 test.
|
||||||
|
|
||||||
|
For TLS GD/IE, add the same condition with the relocate_section in the
|
||||||
|
allocate_dynrelocs, to make sure we won't reserve redundant spaces
|
||||||
|
for dynamic relocations since the conservative estimatation.
|
||||||
|
|
||||||
|
After applying this patch, ld seems no longer generate the spurious
|
||||||
|
R_RISCV_NONE for pr22263-1 test.
|
||||||
|
|
||||||
|
bfd/
|
||||||
|
PR ld/22263
|
||||||
|
* elfnn-riscv.c (RISCV_TLS_GD_IE_NEED_DYN_RELOC): New defined.
|
||||||
|
Set NEED_RELOC to true if TLS GD/IE needs dynamic relocations,
|
||||||
|
and INDX will be the dynamic index.
|
||||||
|
(allocate_dynrelocs): Don't reserve extra spaces in the rela.got
|
||||||
|
if RISCV_TLS_GD_IE_NEED_DYN_RELOC set need_reloc to false. This
|
||||||
|
condition needs to be same as relocate_section.
|
||||||
|
(relocate_section): Likewise, use the same condition as
|
||||||
|
allocate_dynrelocs.
|
||||||
|
---
|
||||||
|
bfd/elfnn-riscv.c | 41 ++++++++++++++++++++++++++++-------------
|
||||||
|
1 file changed, 28 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
|
||||||
|
index ee2d19f7699..d02c4a29324 100644
|
||||||
|
--- a/bfd/elfnn-riscv.c
|
||||||
|
+++ b/bfd/elfnn-riscv.c
|
||||||
|
@@ -38,6 +38,25 @@
|
||||||
|
#define CHAR_BIT 8
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/* Set NEED_RELOC to true if TLS GD/IE needs dynamic relocations, and INDX will
|
||||||
|
+ be the dynamic index. PR22263, use the same check in allocate_dynrelocs and
|
||||||
|
+ riscv_elf_relocate_section for TLS GD/IE. */
|
||||||
|
+#define RISCV_TLS_GD_IE_NEED_DYN_RELOC(INFO, DYN, H, INDX, NEED_RELOC) \
|
||||||
|
+ do \
|
||||||
|
+ { \
|
||||||
|
+ if ((H) != NULL \
|
||||||
|
+ && (H)->dynindx != -1 \
|
||||||
|
+ && WILL_CALL_FINISH_DYNAMIC_SYMBOL ((DYN), bfd_link_pic (INFO), (H)) \
|
||||||
|
+ && (bfd_link_dll (INFO) || !SYMBOL_REFERENCES_LOCAL ((INFO), (H)))) \
|
||||||
|
+ (INDX) = (H)->dynindx; \
|
||||||
|
+ if ((bfd_link_dll (INFO) || (INDX) != 0) \
|
||||||
|
+ && ((H) == NULL \
|
||||||
|
+ || ELF_ST_VISIBILITY ((H)->other) == STV_DEFAULT \
|
||||||
|
+ || (H)->root.type != bfd_link_hash_undefweak)) \
|
||||||
|
+ (NEED_RELOC) = true; \
|
||||||
|
+ } \
|
||||||
|
+ while (0)
|
||||||
|
+
|
||||||
|
/* Internal relocations used exclusively by the relaxation pass. */
|
||||||
|
#define R_RISCV_DELETE (R_RISCV_max + 1)
|
||||||
|
|
||||||
|
@@ -1186,18 +1205,24 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||||
|
dyn = htab->elf.dynamic_sections_created;
|
||||||
|
if (tls_type & (GOT_TLS_GD | GOT_TLS_IE))
|
||||||
|
{
|
||||||
|
+ int indx = 0;
|
||||||
|
+ bool need_reloc = false;
|
||||||
|
+ RISCV_TLS_GD_IE_NEED_DYN_RELOC(info, dyn, h, indx, need_reloc);
|
||||||
|
+
|
||||||
|
/* TLS_GD needs two dynamic relocs and two GOT slots. */
|
||||||
|
if (tls_type & GOT_TLS_GD)
|
||||||
|
{
|
||||||
|
s->size += 2 * RISCV_ELF_WORD_BYTES;
|
||||||
|
- htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
|
||||||
|
+ if (need_reloc)
|
||||||
|
+ htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TLS_IE needs one dynamic reloc and one GOT slot. */
|
||||||
|
if (tls_type & GOT_TLS_IE)
|
||||||
|
{
|
||||||
|
s->size += RISCV_ELF_WORD_BYTES;
|
||||||
|
- htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
|
||||||
|
+ if (need_reloc)
|
||||||
|
+ htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
@@ -2691,20 +2716,10 @@ riscv_elf_relocate_section (bfd *output_bfd,
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
bool dyn = elf_hash_table (info)->dynamic_sections_created;
|
||||||
|
- if (h != NULL
|
||||||
|
- && h->dynindx != -1
|
||||||
|
- && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
|
||||||
|
- && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||||
|
- indx = h->dynindx;
|
||||||
|
+ RISCV_TLS_GD_IE_NEED_DYN_RELOC (info, dyn, h, indx, need_relocs);
|
||||||
|
|
||||||
|
/* The GOT entries have not been initialized yet. Do it
|
||||||
|
now, and emit any relocations. */
|
||||||
|
- if ((bfd_link_dll (info) || indx != 0)
|
||||||
|
- && (h == NULL
|
||||||
|
- || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||||
|
- || h->root.type != bfd_link_hash_undefweak))
|
||||||
|
- need_relocs = true;
|
||||||
|
-
|
||||||
|
if (tls_type & GOT_TLS_GD)
|
||||||
|
{
|
||||||
|
if (need_relocs)
|
||||||
|
--
|
||||||
|
2.40.1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user