Subject: bug#9927: 24.1.50; unexec/unexmacosx doesn't grok GCC 4.6+ sections

From: Paul Eggert <[email-masked]>
Date: Sat, 04 Oct 2014 10:19:29 -0700

Peter Dyballa wrote:
> I think it is not fixed trunk, because GNU Emacs pretest 24.3.94 does not have it.

If I understand you correctly, you're saying that GNU Emacs 24.3.94 has the bug, 
and that the bug went away when you applied the patch (attached), and that we 
should therefore backport this patch to the emacs-24 branch.  Is that what you 
meant?  If so, Stefan, OK if I do that?
=== modified file 'src/ChangeLog'
--- src/ChangeLog	2014-09-17 18:27:36 +0000
+++ src/ChangeLog	2014-09-17 19:58:31 +0000
@@ -1,3 +1,7 @@
+2014-09-17  Samuel Bronson  <[email-masked]>
+
+	* unexmacosx.c (copy_data_segment): Port to GCC 4.6+ (Bug#9927).
+
 2014-09-17  Paul Eggert  <[email-masked]>
 
 	Fix minor problems found by static checking.

=== modified file 'src/unexmacosx.c'
--- src/unexmacosx.c	2014-09-01 02:37:22 +0000
+++ src/unexmacosx.c	2014-09-17 19:58:31 +0000
@@ -879,6 +879,27 @@
 	  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 @@
 	       || 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))