diff options
author | Alan Modra <amodra@gmail.com> | 2021-12-08 20:04:25 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-12-10 08:33:12 +1030 |
commit | b6d1f70cc7e948de99f91fc44d07c44686275fc4 (patch) | |
tree | 18a575389f6374734af296155a876c832d38efce /bfd/elf.c | |
parent | fe72c32765e1190c8a17d309fc3a7e1882d6a430 (diff) | |
download | gdb-b6d1f70cc7e948de99f91fc44d07c44686275fc4.zip gdb-b6d1f70cc7e948de99f91fc44d07c44686275fc4.tar.gz gdb-b6d1f70cc7e948de99f91fc44d07c44686275fc4.tar.bz2 |
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.c | 26 |
1 files changed, 16 insertions, 10 deletions
@@ -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; |