Skip to content

Commit

Permalink
devel/binutils: Setting sh_link for SHT_REL/SHT_RELA
Browse files Browse the repository at this point in the history
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 <SHT_REL, SHT_RELA>): 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 <ehaupt@FreeBSD.org>
Approved by:	cy
Obtained from:	Upstream commit 6b958fe36b7
MFH:		2022Q2
  • Loading branch information
ehaupt authored and cschuber committed Apr 25, 2023
1 parent 9552d6c commit 898053f
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
2 changes: 1 addition & 1 deletion 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
Expand Down
39 changes: 39 additions & 0 deletions 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)

0 comments on commit 898053f

Please sign in to comment.