Setting sh_link for SHT_REL/SHT_RELA

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 commit is contained in:
Alan Modra 2023-03-30 12:10:16 +10:30
parent ea7672c10e
commit 6b958fe36b

View File

@ -3870,21 +3870,23 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
{
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)
{
s = bfd_get_section_by_name (abfd, ".dynsym");
if (s != NULL)
d->this_hdr.sh_link = elf_section_data (s)->this_idx;
}
/* 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)
d->this_hdr.sh_link = elf_onesymtab (abfd);
{
/* 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);
}
s = elf_get_reloc_section (sec);
if (s != NULL)