diff options
author | Alan Modra <amodra@gmail.com> | 2023-03-30 12:10:16 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-03-30 15:18:02 +1030 |
commit | 6b958fe36b765f70878e8d3d002864967c4bc3a4 (patch) | |
tree | e2e0d906f2a3f079e8ee0deb7785569dd7e4de50 /bfd/elf.c | |
parent | ea7672c10e0b762c02fd40ce94d490b56bc14675 (diff) | |
download | gdb-6b958fe36b765f70878e8d3d002864967c4bc3a4.zip gdb-6b958fe36b765f70878e8d3d002864967c4bc3a4.tar.gz gdb-6b958fe36b765f70878e8d3d002864967c4bc3a4.tar.bz2 |
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.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 30 |
1 files changed, 16 insertions, 14 deletions
@@ -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) |