Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <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
Showing
2 changed files
with
40 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |