PR 4888
authorAlan Modra <amodra@gmail.com>
Sat, 4 Aug 2007 08:26:38 +0000 (08:26 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 4 Aug 2007 08:26:38 +0000 (08:26 +0000)
* objcopy.c (setup_section): Do modify section flags for ELF
STRIP_NONDEBUG (reverting part of 2007-05-30 change).  Prevent
header rewrite by twiddling input section flags instead.
Simplify code setting SHT_NOBITS.

binutils/ChangeLog
binutils/objcopy.c

index 2e71518ad13e916846a5b2edfcb23f853c49027d..2b8834172070c2af0c740adea3229fe91481c3eb 100644 (file)
@@ -1,3 +1,11 @@
+2007-08-04  Alan Modra  <amodra@bigpond.net.au>
+
+       PR 4888
+       * objcopy.c (setup_section): Do modify section flags for ELF
+       STRIP_NONDEBUG (reverting part of 2007-05-30 change).  Prevent
+       header rewrite by twiddling input section flags instead.
+       Simplify code setting SHT_NOBITS.
+
 2007-07-28  Christopher Faylor  <me+binutils@cgf.cx>
 
        * MAINTAINERS: Update my email address.
index b9932765c348039cfbfd858ef43978eab44f970e..e577dd30160b55bed773cae29f09da23324542ab 100644 (file)
@@ -2165,6 +2165,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
   const char *err;
   const char * name;
   char *prefix = NULL;
+  bfd_boolean make_nobits;
 
   if (is_strip_section (ibfd, isection))
     return;
@@ -2193,12 +2194,26 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
       name = n;
     }
 
+  make_nobits = FALSE;
   if (p != NULL && p->set_flags)
     flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
   else if (strip_symbols == STRIP_NONDEBUG
-          && obfd->xvec->flavour != bfd_target_elf_flavour
-          && (flags & SEC_ALLOC) != 0)
-    flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
+          && (flags & SEC_ALLOC) != 0
+          && (ibfd->xvec->flavour != bfd_target_elf_flavour
+              || elf_section_type (isection) != SHT_NOTE))
+    {
+      flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
+      if (obfd->xvec->flavour == bfd_target_elf_flavour)
+       {
+         make_nobits = TRUE;
+
+         /* Twiddle the input section flags so that it seems to
+            elf.c:copy_private_bfd_data that section flags have not
+            changed between input and output sections.  This hack
+            prevents wholesale rewriting of the program headers.  */
+         isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
+       }
+    }
 
   osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
 
@@ -2208,13 +2223,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
       goto loser;
     }
 
-  if (strip_symbols == STRIP_NONDEBUG
-      && obfd->xvec->flavour == bfd_target_elf_flavour
-      && (flags & SEC_ALLOC) != 0
-      && elf_section_type (osection) != SHT_NOTE
-      && (ibfd->xvec->flavour != bfd_target_elf_flavour
-         || elf_section_type (isection) != SHT_NOTE)
-      && (p == NULL || !p->set_flags))
+  if (make_nobits)
     elf_section_type (osection) = SHT_NOBITS;
 
   size = bfd_section_size (ibfd, isection);