From 8098bf5371cf0eac0d3039aedfe2b7d90c4ad1b5 Mon Sep 17 00:00:00 2001 From: Emanuel Haupt Date: Tue, 25 Apr 2023 07:05:48 -0700 Subject: devel/binutils: Setting sh_link for SHT_REL/SHT_RELA Import upstream commit 6b958fe36b7: It's wrong to have an alloc reloc section trying to use a non-alloc symbol table. * elf.c (assign_section_numbers ): Correct comment. Always set sh_link to .dynsym for alloc reloc sections and to .symtab for non-alloc. This also fixes strip when using llvm-strip, i.e. when base built with WITH_LLVM_BINUTILS. PR: 271061, see also: 270961, 270960 Reported by: Emanuel Haupt Approved by: cy Obtained from: Upstream commit 6b958fe36b7 (cherry picked from commit 898053f9100240f305a2bc6d49998a13728d3a71) --- devel/binutils/Makefile | 2 +- devel/binutils/files/patch-bfd_elf.c | 39 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 devel/binutils/files/patch-bfd_elf.c diff --git a/devel/binutils/Makefile b/devel/binutils/Makefile index a468d736263d..f33baaa17357 100644 --- a/devel/binutils/Makefile +++ b/devel/binutils/Makefile @@ -1,6 +1,6 @@ PORTNAME= binutils DISTVERSION= 2.40 -PORTREVISION= 2 +PORTREVISION= 3 PORTEPOCH?= 1 CATEGORIES?= devel MASTER_SITES= SOURCEWARE/binutils/releases diff --git a/devel/binutils/files/patch-bfd_elf.c b/devel/binutils/files/patch-bfd_elf.c new file mode 100644 index 000000000000..7f27ebb80a10 --- /dev/null +++ b/devel/binutils/files/patch-bfd_elf.c @@ -0,0 +1,39 @@ +--- bfd/elf.c.orig 2023-01-14 00:00:00 UTC ++++ bfd/elf.c +@@ -3870,21 +3870,23 @@ assign_section_numbers (bfd *abfd, struct bfd_link_inf + { + case SHT_REL: + case SHT_RELA: +- /* A reloc section which we are treating as a normal BFD +- section. sh_link is the section index of the symbol +- table. sh_info is the section index of the section to +- which the relocation entries apply. We assume that an +- allocated reloc section uses the dynamic symbol table +- if there is one. Otherwise we guess the normal symbol +- table. FIXME: How can we be sure? */ +- if (d->this_hdr.sh_link == 0 && (sec->flags & SEC_ALLOC) != 0) ++ /* sh_link is the section index of the symbol table. ++ sh_info is the section index of the section to which the ++ relocation entries apply. */ ++ if (d->this_hdr.sh_link == 0) + { +- s = bfd_get_section_by_name (abfd, ".dynsym"); +- if (s != NULL) +- d->this_hdr.sh_link = elf_section_data (s)->this_idx; ++ /* FIXME maybe: If this is a reloc section which we are ++ treating as a normal section then we likely should ++ not be assuming its sh_link is .dynsym or .symtab. */ ++ if ((sec->flags & SEC_ALLOC) != 0) ++ { ++ s = bfd_get_section_by_name (abfd, ".dynsym"); ++ if (s != NULL) ++ d->this_hdr.sh_link = elf_section_data (s)->this_idx; ++ } ++ else ++ d->this_hdr.sh_link = elf_onesymtab (abfd); + } +- if (d->this_hdr.sh_link == 0) +- d->this_hdr.sh_link = elf_onesymtab (abfd); + + s = elf_get_reloc_section (sec); + if (s != NULL) -- cgit v1.2.3