]> git.eshelyaron.com Git - emacs.git/commitdiff
* src/unexmacosx.c (copy_data_segment): Port to GCC 4.6+ (backport)
authorSamuel Bronson <naesten@gmail.com>
Thu, 30 Oct 2014 05:31:12 +0000 (22:31 -0700)
committerGlenn Morris <rgm@gnu.org>
Thu, 30 Oct 2014 05:31:12 +0000 (22:31 -0700)
Fixes: debbugs:9927
src/ChangeLog
src/unexmacosx.c

index 33ee723fe66106b07bf10bb319522b401d6a8b7c..1fb2c7b00a133d3458067a18909176e0f3ae3c7f 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-30  Samuel Bronson  <naesten@gmail.com>
+
+       * unexmacosx.c (copy_data_segment): Port to GCC 4.6+ (Bug#9927).
+
 2014-10-28  Eli Zaretskii  <eliz@gnu.org>
 
        * fileio.c (Fexpand_file_name): Use make_unibyte_string, not
index 7d4762fdab2fe3ccc7e5358d86228381491566bd..2a045aa12f840dc65b8dd1bdfcf365ea763751b1 100644 (file)
@@ -881,6 +881,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
@@ -892,6 +913,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))