bfd:
authorIain Sandoe <iain@codesourcery.com>
Wed, 11 Jan 2012 15:24:10 +0000 (15:24 +0000)
committerIain Sandoe <iain@codesourcery.com>
Wed, 11 Jan 2012 15:24:10 +0000 (15:24 +0000)
* mach-o.c (bfd_mach_o_build_seg_command): Separate computation of
vmsize from filesize.  Don't compute offsets or file sizes for
zerofill sections.

bfd/ChangeLog
bfd/mach-o.c

index 21f137c15fee6179cc86cbdea325589ae199e8af..55ccf7e5d5cd917b7466c8fb6c3f98c50189b878 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-11  Iain Sandoe  <idsandoe@googlemail.com>
+
+       * mach-o.c (bfd_mach_o_build_seg_command): Separate computation of
+       vmsize from filesize.  Don't compute offsets or file sizes for
+       zerofill sections.
+
 2012-01-11  Iain Sandoe  <idsandoe@googlemail.com>
 
        * mach-o.c (bfd_mach_o_build_commands): Make the building of each
index 307a8ebd762f7ad700fb5c73fad8ce4996297853..6913b1d929d4c33cb634eb94622dc8e00f7c4c11 100644 (file)
@@ -2023,6 +2023,7 @@ bfd_mach_o_build_seg_command (const char *segment,
 
   /* TODO: fix this up for non-MH_OBJECT cases.  */
   seg->vmaddr = 0;
+  seg->vmsize = 0;
 
   seg->fileoff = mdata->filelen;
   seg->filesize = 0;
@@ -2048,9 +2049,21 @@ bfd_mach_o_build_seg_command (const char *segment,
 
       bfd_mach_o_append_section_to_segment (seg, sec);
 
-      if (s->size == 0)
-         s->offset = 0;
-      else
+      s->offset = 0;
+      if (s->size > 0)
+       {
+          seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
+         seg->vmsize += s->size;
+        }
+      
+      /* Zerofill sections have zero file size & offset, 
+        and are not written.  */
+      if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) == BFD_MACH_O_S_ZEROFILL
+          || (s->flags & BFD_MACH_O_SECTION_TYPE_MASK) 
+             == BFD_MACH_O_S_GB_ZEROFILL)
+        continue;
+
+      if (s->size > 0)
        {
           mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
           s->offset = mdata->filelen;
@@ -2062,7 +2075,6 @@ bfd_mach_o_build_seg_command (const char *segment,
     }
 
   seg->filesize = mdata->filelen - seg->fileoff;
-  seg->vmsize = seg->filesize;
 
   return TRUE;
 }