]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Darwin: Correct handling of weak crts.
authorIain Sandoe <iain@sandoe.co.uk>
Thu, 21 Mar 2024 14:34:44 +0000 (14:34 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Sun, 28 Apr 2024 14:39:00 +0000 (15:39 +0100)
Backport part of 506e74f53a5 from trunk.

We need the weak crts to be considered ahead of GCC target libraries
(except libgcc_s) to avoid spurious dependencies on otherwise unused
libs.

gcc/ChangeLog:

* config/darwin.h (LINK_COMMAND_SPEC_A): Handle weak crts
before other objects. (REAL_LIBGCC_SPEC): Remove weak crts
from here.  (DARWIN_WEAK_CRTS): New.

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

index e2aa6b745d007c458409a845f2aaed60e25c1506..1fded756c605380b04e1f715d9779cc36912ef99 100644 (file)
@@ -351,7 +351,9 @@ extern GTY(()) int darwin_ms_struct;
     %{e*} %{r} \
     %{o*}%{!o:-o a.out} \
     %{!r:%{!nostdlib:%{!nostartfiles:%S}}} \
-    %{L*} %(link_libgcc) %o \
+    %{L*} %(link_libgcc) \
+    %{!r:%{!nostdlib:%{!nodefaultlibs: " DARWIN_WEAK_CRTS "}}} \
+    %o \
     %{!r:%{!nostdlib:%{!nodefaultlibs:\
       %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} \
       %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1): \
@@ -365,15 +367,15 @@ extern GTY(()) int darwin_ms_struct;
       %(link_ssp) \
       %:version-compare(>< 10.6 10.7 mmacosx-version-min= -ld10-uwfef) \
       %(link_gcc_c_sequence) \
-      %{!nodefaultexport:%{dylib|dynamiclib|bundle: \
-       %:version-compare(>= 10.11 asm_macosx_version_min= -U) \
-       %:version-compare(>= 10.11 asm_macosx_version_min= ___emutls_get_address) \
-       %:version-compare(>= 10.11 asm_macosx_version_min= -exported_symbol) \
-       %:version-compare(>= 10.11 asm_macosx_version_min= ___emutls_get_address) \
-       %:version-compare(>= 10.11 asm_macosx_version_min= -U) \
-       %:version-compare(>= 10.11 asm_macosx_version_min= ___emutls_register_common) \
-       %:version-compare(>= 10.11 asm_macosx_version_min= -exported_symbol) \
-       %:version-compare(>= 10.11 asm_macosx_version_min= ___emutls_register_common) \
+      %{!nodefaultexport: \
+       %{%:version-compare(>= 10.11 asm_macosx_version_min= -U): \
+          ___emutls_get_address -exported_symbol ___emutls_get_address \
+         -U ___emutls_register_common \
+         -exported_symbol ___emutls_register_common \
+         -U ___gcc_nested_func_ptr_created \
+         -exported_symbol ___gcc_nested_func_ptr_created \
+         -U ___gcc_nested_func_ptr_deleted \
+         -exported_symbol ___gcc_nested_func_ptr_deleted \
       }} \
     }}}\
     %{!r:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} "\
@@ -500,17 +502,22 @@ extern GTY(()) int darwin_ms_struct;
 #undef REAL_LIBGCC_SPEC
 #define REAL_LIBGCC_SPEC \
 "%{static-libgcc|static:                                                 \
-    %:version-compare(!> 10.6 mmacosx-version-min= -lgcc_eh)             \
-    %:version-compare(>= 10.6 mmacosx-version-min= -lemutls_w);                  \
+    %:version-compare(!> 10.6 mmacosx-version-min= -lgcc_eh);            \
    shared-libgcc|fexceptions|fobjc-exceptions|fgnu-runtime:              \
     %:version-compare(!> 10.11 mmacosx-version-min= -lgcc_s.1.1)         \
-    %:version-compare(>= 10.11 mmacosx-version-min= -lemutls_w)                  \
     %:version-compare(!> 10.3.9 mmacosx-version-min= -lgcc_eh)           \
     %:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_s.10.4)   \
-    %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5);   \
-   : -lemutls_w                                                                  \
+    %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5)    \
   } -lgcc "
 
+#define DARWIN_WEAK_CRTS \
+"%{static-libgcc|static:                                                 \
+   %:version-compare(>= 10.6 mmacosx-version-min= -lemutls_w) ; \
+   shared-libgcc|fexceptions|fobjc-exceptions|fgnu-runtime: \
+     %:version-compare(>= 10.11 mmacosx-version-min= -lemutls_w) ; \
+   : -lemutls_w \
+  }"
+
 /* We specify crt0.o as -lcrt0.o so that ld will search the library path.  */
 
 #undef  STARTFILE_SPEC