]> git.eshelyaron.com Git - emacs.git/commitdiff
* unexmacosx.c (copy_data_segment): Port to GCC 4.6+.
authorSamuel Bronson <naesten@gmail.com>
Wed, 17 Sep 2014 19:58:31 +0000 (12:58 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 17 Sep 2014 19:58:31 +0000 (12:58 -0700)
Fixes: debbugs:9927
src/ChangeLog
src/unexmacosx.c

index 0b53c80d9e1668e383ca068d3901fd85c7145cb7..ff9e6e5778d3c4e8196f17dea3832e30e8354d51 100644 (file)
@@ -1,3 +1,7 @@
+2014-09-17  Samuel Bronson  <naesten@gmail.com>
+
+       * unexmacosx.c (copy_data_segment): Port to GCC 4.6+ (Bug#9927).
+
 2014-09-17  Paul Eggert  <eggert@cs.ucla.edu>
 
        Fix minor problems found by static checking.
index ae34237a66bd264a3b636b5ee2e563cc1c68c59e..940cbfacb10b871e6bac60f409e93c79ccdb1b6c 100644 (file)
@@ -879,6 +879,27 @@ copy_data_segment (struct load_command *lc)
          if (!unexec_write (header_offset, sectp, sizeof (struct section)))
            unexec_error ("cannot write section %.16s's header", sectp->sectname);
        }
+      else if (strncmp (sectp->sectname, "__bss", 5) == 0
+              || strncmp (sectp->sectname, "__pu_bss", 8) == 0)
+       {
+         sectp->flags = S_REGULAR;
+
+         /* These sections are produced by GCC 4.6+.
+
+            FIXME: We possibly ought to clear uninitialized local
+            variables in statically linked libraries like for
+            SECT_BSS (__bss) above, but setting up the markers we
+            need in lastfile.c would be rather messy. See
+            darwin_output_aligned_bss () in gcc/config/darwin.c for
+            the root of the problem, keeping in mind that the
+            sections are numbered by their alignment in GCC 4.6, but
+            by log2(alignment) in GCC 4.7. */
+
+         if (!unexec_write (sectp->offset, (void *) sectp->addr, sectp->size))
+           unexec_error ("cannot copy section %.16s", sectp->sectname);
+         if (!unexec_write (header_offset, sectp, sizeof (struct section)))
+           unexec_error ("cannot write section %.16s's header", sectp->sectname);
+       }
       else if (strncmp (sectp->sectname, "__la_symbol_ptr", 16) == 0
               || strncmp (sectp->sectname, "__nl_symbol_ptr", 16) == 0
               || strncmp (sectp->sectname, "__got", 16) == 0
@@ -890,6 +911,7 @@ copy_data_segment (struct load_command *lc)
               || strncmp (sectp->sectname, "__program_vars", 16) == 0
               || strncmp (sectp->sectname, "__mod_init_func", 16) == 0
               || strncmp (sectp->sectname, "__mod_term_func", 16) == 0
+              || strncmp (sectp->sectname, "__static_data", 16) == 0
               || strncmp (sectp->sectname, "__objc_", 7) == 0)
        {
          if (!unexec_copy (sectp->offset, old_file_offset, sectp->size))