summaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-12-08 20:04:25 +1030
committerAlan Modra <amodra@gmail.com>2021-12-10 08:33:12 +1030
commitb6d1f70cc7e948de99f91fc44d07c44686275fc4 (patch)
tree18a575389f6374734af296155a876c832d38efce /bfd/elf.c
parentfe72c32765e1190c8a17d309fc3a7e1882d6a430 (diff)
Set sh_link for reloc sections created as normal sections
binutils-all/strip-13 and binutils-all/strip-14 tests create SHT_REL/SHT_RELA sections by hand. These don't have sh_link set to the .symtab section as they should, leading to readelf warnings if you happen to be looking at the object files. * elf.c (assign_section_numbers): Formatting. Set sh_link for reloc sections created as normal sections in relocatable objects.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 5ffe36900e..98f47da079 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3779,9 +3779,9 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
}
need_symtab = (bfd_get_symcount (abfd) > 0
- || (link_info == NULL
- && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
- == HAS_RELOC)));
+ || (link_info == NULL
+ && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
+ == HAS_RELOC)));
if (need_symtab)
{
elf_onesymtab (abfd) = section_number++;
@@ -3935,11 +3935,17 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
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.
- FIXME: How can we be sure? */
- s = bfd_get_section_by_name (abfd, ".dynsym");
- if (s != NULL)
- d->this_hdr.sh_link = elf_section_data (s)->this_idx;
+ 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)
+ {
+ s = bfd_get_section_by_name (abfd, ".dynsym");
+ if (s != NULL)
+ d->this_hdr.sh_link = elf_section_data (s)->this_idx;
+ }
+ if (d->this_hdr.sh_link == 0)
+ d->this_hdr.sh_link = elf_onesymtab (abfd);
s = elf_get_reloc_section (sec);
if (s != NULL)
@@ -3994,8 +4000,8 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
/* sh_link is the section header index of the prelink library
list used for the dynamic entries, or the symbol table, or
the version strings. */
- s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC)
- ? ".dynstr" : ".gnu.libstr");
+ s = bfd_get_section_by_name (abfd, ((sec->flags & SEC_ALLOC)
+ ? ".dynstr" : ".gnu.libstr"));
if (s != NULL)
d->this_hdr.sh_link = elf_section_data (s)->this_idx;
break;