From c1497d86e35c8e5a4602e32964e670a36f91747d79934e33bdc078604336f15b Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Tue, 30 May 2023 12:57:13 +0000 Subject: [PATCH] Accepting request 1089774 from home:Andreas_Schwab:riscv:binutils - riscv-dynamic-tls-reloc-pie.patch: Backport for PR ld/22263 and PR ld/25694 - riscv-pr22263-1.patch: Backport for PR ld/22263 OBS-URL: https://build.opensuse.org/request/show/1089774 OBS-URL: https://build.opensuse.org/package/show/devel:gcc/binutils?expand=0&rev=445 --- binutils.changes | 7 ++ binutils.spec | 4 ++ riscv-dynamic-tls-reloc-pie.patch | 103 ++++++++++++++++++++++++++++ riscv-pr22263-1.patch | 108 ++++++++++++++++++++++++++++++ 4 files changed, 222 insertions(+) create mode 100644 riscv-dynamic-tls-reloc-pie.patch create mode 100644 riscv-pr22263-1.patch diff --git a/binutils.changes b/binutils.changes index 4200f6e..bc20347 100644 --- a/binutils.changes +++ b/binutils.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Tue May 30 09:43:15 UTC 2023 - Andreas Schwab + +- 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 diff --git a/binutils.spec b/binutils.spec index 210c357..53e09ae 100644 --- a/binutils.spec +++ b/binutils.spec @@ -154,6 +154,8 @@ Patch42: binutils-compat-old-behaviour.diff Patch43: binutils-revert-hlasm-insns.diff Patch44: binutils-revert-rela.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 Patch90: cross-avr-nesc-as.patch Patch92: cross-avr-omit_section_dynsym.patch @@ -278,6 +280,8 @@ cp ld/ldgram.y ld/ldgram.y.orig %patch44 -p1 %patch45 -p1 %endif +%patch46 -p1 +%patch47 -p1 %patch100 -p1 %if "%{TARGET}" == "avr" cp gas/config/tc-avr.h gas/config/tc-avr-nesc.h diff --git a/riscv-dynamic-tls-reloc-pie.patch b/riscv-dynamic-tls-reloc-pie.patch new file mode 100644 index 0000000..d72527a --- /dev/null +++ b/riscv-dynamic-tls-reloc-pie.patch @@ -0,0 +1,103 @@ +From f491758f183592cbf8113e02a2bebbd412ff7358 Mon Sep 17 00:00:00 2001 +From: Nelson Chu +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 + diff --git a/riscv-pr22263-1.patch b/riscv-pr22263-1.patch new file mode 100644 index 0000000..7ee853c --- /dev/null +++ b/riscv-pr22263-1.patch @@ -0,0 +1,108 @@ +From 53e0482788fa665f532936ba3637bc0fcde6db2c Mon Sep 17 00:00:00 2001 +From: Nelson Chu +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 +