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.
This commit is contained in:
Alan Modra
2021-12-08 20:04:25 +10:30
parent fe72c32765
commit b6d1f70cc7

View File

@ -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 section. sh_link is the section index of the symbol
table. sh_info is the section index of the section to table. sh_info is the section index of the section to
which the relocation entries apply. We assume that an which the relocation entries apply. We assume that an
allocated reloc section uses the dynamic symbol table. allocated reloc section uses the dynamic symbol table
FIXME: How can we be sure? */ 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"); s = bfd_get_section_by_name (abfd, ".dynsym");
if (s != NULL) if (s != NULL)
d->this_hdr.sh_link = elf_section_data (s)->this_idx; 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); s = elf_get_reloc_section (sec);
if (s != NULL) 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 /* sh_link is the section header index of the prelink library
list used for the dynamic entries, or the symbol table, or list used for the dynamic entries, or the symbol table, or
the version strings. */ the version strings. */
s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC) s = bfd_get_section_by_name (abfd, ((sec->flags & SEC_ALLOC)
? ".dynstr" : ".gnu.libstr"); ? ".dynstr" : ".gnu.libstr"));
if (s != NULL) if (s != NULL)
d->this_hdr.sh_link = elf_section_data (s)->this_idx; d->this_hdr.sh_link = elf_section_data (s)->this_idx;
break; break;