* elfcode.h (bfd_section_from_shdr): If a SHT_SYMTAB section in a
authorIan Lance Taylor <ian@airs.com>
Mon, 15 Aug 1994 18:08:13 +0000 (18:08 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 15 Aug 1994 18:08:13 +0000 (18:08 +0000)
shared object has SHF_ALLOC set, create a BFD section for it.
(elf_section_from_bfd_section): There may be a BFD section for a
SHT_SYMTAB section.

bfd/ChangeLog
bfd/elfcode.h

index e49850b..74c58e8 100644 (file)
@@ -1,5 +1,10 @@
 Mon Aug 15 12:16:56 1994  Ian Lance Taylor  (ian@sanguine.cygnus.com)
 
+       * elfcode.h (bfd_section_from_shdr): If a SHT_SYMTAB section in a
+       shared object has SHF_ALLOC set, create a BFD section for it.
+       (elf_section_from_bfd_section): There may be a BFD section for a
+       SHT_SYMTAB section.
+
        * coffcode.h (styp_to_sec_flags): Add name argument.  If no flags
        are recognized, chose section flags based on the name.
        (bfd_coff_backend_data): _bfd_styp_to_sec_flags_hook field: Add
index f6e14fa..5a2ef54 100644 (file)
@@ -546,6 +546,18 @@ bfd_section_from_shdr (abfd, shindex)
       elf_tdata (abfd)->symtab_hdr = *hdr;
       elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->symtab_hdr;
       abfd->flags |= HAS_SYMS;
+
+      /* Sometimes a shared object will map in the symbol table.  If
+         SHF_ALLOC is set, and this is a shared object, then we also
+         treat this section as a BFD section.  We can not base the
+         decision purely on SHF_ALLOC, because that flag is sometimes
+         set in a relocateable object file, which would confuse the
+         linker.  */
+      if ((hdr->sh_flags & SHF_ALLOC) != 0
+         && (abfd->flags & DYNAMIC) != 0
+         && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
+       return false;
+
       return true;
 
     case SHT_DYNSYM:           /* A dynamic symbol table */
@@ -2586,6 +2598,7 @@ elf_section_from_bfd_section (abfd, asect)
        case SHT_HASH:
        case SHT_DYNAMIC:
        case SHT_DYNSYM:
+       case SHT_SYMTAB:
          if (hdr->rawdata)
            {
              if (((struct sec *) (hdr->rawdata)) == asect)