PR 4479
authorAlan Modra <amodra@gmail.com>
Tue, 15 May 2007 08:39:58 +0000 (08:39 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 15 May 2007 08:39:58 +0000 (08:39 +0000)
* elf.c (elf_fake_sections): Don't allow backend to change
SHT_NOBITS if called for strip/objcopy --only-keep-debug.
* elfxx-mips.c (_bfd_mips_elf_fake_sections): Remove similar
fix from here.

bfd/ChangeLog
bfd/elf.c
bfd/elfxx-mips.c

index c8662919d9eecbdc5ccf540ce9e97bee22f581c1..1a97ba19f41c345d4ac4cf8796ccc9f07b348eff 100644 (file)
@@ -1,3 +1,11 @@
+2007-05-15  Alan Modra  <amodra@bigpond.net.au>
+
+       PR 4479
+       * elf.c (elf_fake_sections): Don't allow backend to change
+       SHT_NOBITS if called for strip/objcopy --only-keep-debug.
+       * elfxx-mips.c (_bfd_mips_elf_fake_sections): Remove similar
+       fix from here.
+
 2007-05-14  Alan Modra  <amodra@bigpond.net.au>
 
        * elf.c (bfd_elf_string_from_elf_section): Return NULL on
index 458c6797658b567d1f27ef791c4eae6fd0ebc2e7..f39fdfab5ac15f144b80cf52438bb294f3027a47 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -2744,6 +2744,7 @@ elf_fake_sections (bfd *abfd, asection *asect, void *failedptrarg)
   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   bfd_boolean *failedptr = failedptrarg;
   Elf_Internal_Shdr *this_hdr;
+  unsigned int sh_type;
 
   if (*failedptr)
     {
@@ -2901,10 +2902,19 @@ elf_fake_sections (bfd *abfd, asection *asect, void *failedptrarg)
     }
 
   /* Check for processor-specific section types.  */
+  sh_type = this_hdr->sh_type;
   if (bed->elf_backend_fake_sections
       && !(*bed->elf_backend_fake_sections) (abfd, this_hdr, asect))
     *failedptr = TRUE;
 
+  if (sh_type == SHT_NOBITS
+      && elf_elfheader (abfd)->e_phnum == 0)
+    {
+      /* Don't change the header type from NOBITS if we are being
+        called for strip/objcopy --only-keep-debug.  */
+      this_hdr->sh_type = sh_type;
+    }
+
   /* If the section has relocs, set up a section header for the
      SHT_REL[A] section.  If two relocation sections are required for
      this section, it is up to the processor-specific back-end to
index d01b3e980cf2c03362062d8070b5c4109e582be9..23ea876b107d604a837c4b53ebd4aa4220a51da6 100644 (file)
@@ -5593,11 +5593,7 @@ _bfd_mips_elf_section_from_shdr (bfd *abfd,
 bfd_boolean
 _bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
 {
-  register const char *name;
-  unsigned int sh_type;
-
-  name = bfd_get_section_name (abfd, sec);
-  sh_type = hdr->sh_type;
+  const char *name = bfd_get_section_name (abfd, sec);
 
   if (strcmp (name, ".liblist") == 0)
     {
@@ -5698,12 +5694,6 @@ _bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
       hdr->sh_entsize = 8;
     }
 
-  /* In the unlikely event a special section is empty it has to lose its
-     special meaning.  This may happen e.g. when using `strip' with the
-     "--only-keep-debug" option.  */
-  if (sec->size > 0 && !(sec->flags & SEC_HAS_CONTENTS))
-    hdr->sh_type = sh_type;
-
   /* The generic elf_fake_sections will set up REL_HDR using the default
    kind of relocations.  We used to set up a second header for the
    non-default kind of relocations here, but only NewABI would use