]> gcc.gnu.org Git - gcc.git/commitdiff
Darwin : Mark the mod init/term section starts with a linker-visible sym.
authorIain Sandoe <iain@sandoe.co.uk>
Sat, 29 Aug 2020 21:05:30 +0000 (22:05 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Fri, 27 Aug 2021 16:02:12 +0000 (17:02 +0100)
Some newer assemblers emit section start temp symbols for mod init and term
sections if there is no suitable symbol present already.
The temp symbols are linker visible and therefore appear in the symbol tables.
Since the temp symbol number can vary when debug is enabled, that causes
compare-debug fails.  The solution is to provide a stable linker-visible
symbol.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config/darwin.c (finalize_ctors): Add a section-start linker-
visible symbol.
(finalize_dtors): Likewise.
* config/darwin.h (MIN_LD64_INIT_TERM_START_LABELS): New.

gcc/config/darwin.c
gcc/config/darwin.h

index 5d1d13c80aaf1278fa33fb591401d2762905e8ac..667fda79a60083cdc2190d68e42a6eacab19ef02 100644 (file)
@@ -109,6 +109,9 @@ static bool ld_uses_coal_sects = false;
    each FDE.  */
 static bool ld_needs_eh_markers = false;
 
+/* Emit a section-start symbol for mod init and term sections.  */
+static bool ld_init_term_start_labels = false;
+
 /* Section names.  */
 section * darwin_sections[NUM_DARWIN_SECTIONS];
 
@@ -1838,6 +1841,11 @@ finalize_ctors ()
   else
     switch_to_section (darwin_sections[constructor_section]);
 
+  /* Where needed, provide a linker-visible section-start symbol so that we
+     have stable output between debug and non-debug.  */
+  if (ld_init_term_start_labels)
+    fputs (MACHOPIC_INDIRECT ? "_Mod.init:\n" : "_CTOR.sect:\n", asm_out_file);
+
   if (vec_safe_length (ctors) > 1)
     ctors->qsort (sort_cdtor_records);
   FOR_EACH_VEC_SAFE_ELT (ctors, i, elt)
@@ -1858,6 +1866,11 @@ finalize_dtors ()
   else
     switch_to_section (darwin_sections[destructor_section]);
 
+  /* Where needed, provide a linker-visible section-start symbol so that we
+     have stable output between debug and non-debug.  */
+  if (ld_init_term_start_labels)
+    fputs (MACHOPIC_INDIRECT ? "_Mod.term:\n" : "_DTOR.sect:\n", asm_out_file);
+
   if (vec_safe_length (dtors) > 1)
     dtors->qsort (sort_cdtor_records);
   FOR_EACH_VEC_SAFE_ELT (dtors, i, elt)
@@ -3228,11 +3241,25 @@ darwin_override_options (void)
       /* Earlier versions are not specifically accounted, until required.  */
     }
 
-  /* Older Darwin ld could not coalesce weak entities without them being
-     placed in special sections.  */
-  if (darwin_target_linker
-      && (strverscmp (darwin_target_linker, MIN_LD64_NO_COAL_SECTS) < 0))
-    ld_uses_coal_sects = true;
+  /* Some codegen needs to account for the capabilities of the target
+     linker.  */
+  if (darwin_target_linker)
+    {
+      /* Older Darwin ld could not coalesce weak entities without them being
+        placed in special sections.  */
+      if (strverscmp (darwin_target_linker, MIN_LD64_NO_COAL_SECTS) < 0)
+       ld_uses_coal_sects = true;
+
+      /* Some newer assemblers emit section start temp symbols for mod init
+        and term sections if there is no suitable symbol present already.
+        The temp symbols are linker visible and therefore appear in the
+        symbol tables.  Since the temp symbol number can vary when debug is
+        enabled, that causes compare-debug fails.  The solution is to provide
+        a stable linker-visible symbol.  */
+      if (strverscmp (darwin_target_linker,
+                     MIN_LD64_INIT_TERM_START_LABELS) >= 0)
+       ld_init_term_start_labels = true;
+    }
 
   /* In principle, this should be c-family only.  However, we really need to
      set sensible defaults for LTO as well, since the section selection stuff
index b1be561e854ad30ca63f85da2552d677c0ff895b..f1d92f87e9a705e0343aaec0d49711069f86bb94 100644 (file)
@@ -1104,6 +1104,9 @@ extern void darwin_driver_init (unsigned int *,struct cl_decoded_option **);
    needed, and there is no need for the compiler to emit them.  */
 #define MIN_LD64_OMIT_STUBS "62.1"
 
+/* Emit start labels for init and term sections from this version.  */
+#define MIN_LD64_INIT_TERM_START_LABELS "136.0"
+
 /* If we have no definition for the linker version, pick the minimum version
    that will bootstrap the compiler.  */
 #ifndef LD64_VERSION
This page took 0.067704 seconds and 5 git commands to generate.