]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libgcc: Make heap trampoline support dynamic [PR113403].
authorIain Sandoe <iain@sandoe.co.uk>
Sun, 28 Jan 2024 13:31:56 +0000 (13:31 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Tue, 30 Jan 2024 09:33:09 +0000 (09:33 +0000)
In order to handle system security constraints during GCC build
and test and that most platform versions cannot link to libgcc_eh
since the unwinder there is incompatible with the system one.

1. We make the support functions weak definitions.
2. We include them as a CRT for platform conditions that do not
   allow libgcc_eh.
3. We ensure that the weak symbols are exported from DSOs (which
   includes exes on Darwin) so that the dynamic linker will
   pick one instance (which avoids duplication of trampoline
   caches).

PR libgcc/113403

gcc/ChangeLog:

* config/darwin.h (DARWIN_SHARED_WEAK_ADDS, DARWIN_WEAK_CRTS): New.
(REAL_LIBGCC_SPEC): Move weak CRT handling to separate spec.
* config/i386/darwin.h (DARWIN_HEAP_T_LIB): New.
* config/i386/darwin32-biarch.h (DARWIN_HEAP_T_LIB): New.
* config/i386/darwin64-biarch.h (DARWIN_HEAP_T_LIB): New.
* config/rs6000/darwin.h (DARWIN_HEAP_T_LIB): New.

libgcc/ChangeLog:

* config.host: Build libheap_t.a for i686/x86_64 Darwin.
* config/aarch64/heap-trampoline.c (HEAP_T_ATTR): New.
(allocate_tramp_ctrl): Allow a target to build this as a weak def.
(__gcc_nested_func_ptr_created): Likewise.
* config/i386/heap-trampoline.c (HEAP_T_ATTR): New.
(allocate_tramp_ctrl): Allow a target to build this as a weak def.
(__gcc_nested_func_ptr_created): Likewise.
* config/t-darwin: Build libheap_t.a (a CRT with heap trampoline
support).

gcc/config/darwin.h
gcc/config/i386/darwin.h
gcc/config/i386/darwin32-biarch.h
gcc/config/i386/darwin64-biarch.h
gcc/config/rs6000/darwin.h
libgcc/config.host
libgcc/config/aarch64/heap-trampoline.c
libgcc/config/i386/heap-trampoline.c
libgcc/config/t-darwin

index cb96d67b3b1bf58fc27ee74af0c2f25db0004fc2..31019a0c49d4ce430eb88869deef3a2d329a065e 100644 (file)
@@ -314,13 +314,17 @@ extern GTY(()) int darwin_ms_struct;
 # define DARWIN_RPATH_LINK \
 "%{!r:%{!nostdlib:%{!nodefaultrpaths:%(darwin_rpaths)}}}"
 # define DARWIN_SHARED_LIBGCC "-lgcc_s.1.1"
+# define DARWIN_SHARED_WEAK_ADDS " "
 #else
 # define DARWIN_RPATH_LINK ""
 # define DARWIN_SHARED_LIBGCC \
-"%:version-compare(!> 10.11 mmacosx-version-min= -lgcc_s.1.1) \
- %:version-compare(>= 10.11 mmacosx-version-min= -lemutls_w) "
+"%:version-compare(!> 10.11 mmacosx-version-min= -lgcc_s.1.1)"
+# define DARWIN_SHARED_WEAK_ADDS \
+"%{%:version-compare(>= 10.11 mmacosx-version-min= -lemutls_w): \
+ " DARWIN_HEAP_T_LIB "}"
 #endif
 
+
 /* We might elect to add a path even when this compiler does not use embedded
    run paths, so that we can use libraries from an alternate compiler that is
    using embedded runpaths.  */
@@ -398,7 +402,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): \
@@ -412,15 +418,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*} "\
@@ -542,16 +548,21 @@ 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:              \
    " DARWIN_SHARED_LIBGCC "                                              \
     %: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):        \
+      " DARWIN_HEAP_T_LIB "} ;                                           \
+   : -lemutls_w        " DARWIN_HEAP_T_LIB "                                     \
+  }"
+
 /* We specify crt0.o as -lcrt0.o so that ld will search the library path.  */
 
 #undef  STARTFILE_SPEC
index b7814f7c42e7be4e245d5e9a9aadf198b2230332..8e64b4e9b5ffa2bc4127789042affe957f5f92c8 100644 (file)
@@ -119,6 +119,8 @@ along with GCC; see the file COPYING3.  If not see
 /* We default to x86_64 for single-arch builds, bi-arch overrides.  */
 #define DARWIN_ARCH_SPEC "x86_64"
 #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC
+#undef DARWIN_HEAP_T_LIB
+#define DARWIN_HEAP_T_LIB " -lheapt_w "
 #endif
 
 #undef SUBTARGET_EXTRA_SPECS
index 051ad12b4259a9517470e34c509e044c31cc795e..2180f5a53528cb82fe3c713dfeadccd9a5788415 100644 (file)
@@ -27,6 +27,9 @@ along with GCC; see the file COPYING3.  If not see
 #undef  DARWIN_SUBARCH_SPEC
 #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC
 
+#undef DARWIN_HEAP_T_LIB
+#define DARWIN_HEAP_T_LIB " %{m64:-lheapt_w}"
+
 #undef SUBTARGET_EXTRA_SPECS
 #define SUBTARGET_EXTRA_SPECS                                   \
   DARWIN_EXTRA_SPECS                                            \
index 85436791a6c80643f319b612d574236ee98447c7..620800749a8f09284bb14dd2a8eef2e6901e7ad0 100644 (file)
@@ -28,6 +28,9 @@ along with GCC; see the file COPYING3.  If not see
 #undef  DARWIN_SUBARCH_SPEC
 #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC
 
+#undef DARWIN_HEAP_T_LIB
+#define DARWIN_HEAP_T_LIB "%{!m32:-lheapt_w}"
+
 #undef SUBTARGET_EXTRA_SPECS
 #define SUBTARGET_EXTRA_SPECS                                   \
   DARWIN_EXTRA_SPECS                                            \
index b264284100f4f91877b7e6c200ab300595fcdee8..e8b194982b4d766290489b1aaaeec824340efc1e 100644 (file)
   -lSystem                                                             \
 }"
 
+#undef DARWIN_HEAP_T_LIB
+#define DARWIN_HEAP_T_LIB " "
+
 /* We want -fPIC by default, unless we're using -static to compile for
    the kernel or some such.  The "-faltivec" option should have been
    called "-maltivec" all along.  */
index 017fbc7a06dc4f91c9079c6ee795b56a15f5e6d6..3e7d00f67aafe6cd1cc552711bde26fb8d87570f 100644 (file)
@@ -715,12 +715,15 @@ hppa*-*-netbsd*)
 i[34567]86-*-darwin*)
        tmake_file="$tmake_file i386/t-crtpc t-crtfm i386/t-msabi"
        tm_file="$tm_file i386/darwin-lib.h"
-       extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o"
+       extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o"
+       extra_parts="$extra_parts crtfastmath.o libheapt_w.a"
+       tmake_file="${tmake_file} i386/t-heap-trampoline"
        ;;
 x86_64-*-darwin*)
        tmake_file="$tmake_file i386/t-crtpc t-crtfm i386/t-msabi"
        tm_file="$tm_file i386/darwin-lib.h"
-       extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o"
+       extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o"
+       extra_parts="$extra_parts crtfastmath.o libheapt_w.a"
        tmake_file="${tmake_file} i386/t-heap-trampoline"
        ;;
 i[34567]86-*-elfiamcu)
index 2041fe6aa39388ab05bf595fcd5d0f32f71ce0fc..b463399c1e9dd42eb418dcadab355a2633e189a1 100644 (file)
 #include <pthread.h>
 #endif
 
+/* HEAP_T_ATTR is provided to allow targets to build the exported functions
+   as weak definitions.  */
+#ifndef HEAP_T_ATTR
+#  define HEAP_T_ATTR
+#endif
+
 void *allocate_trampoline_page (void);
 int get_trampolines_per_page (void);
 struct tramp_ctrl_data *allocate_tramp_ctrl (struct tramp_ctrl_data *parent);
@@ -107,6 +113,7 @@ allocate_tramp_ctrl (struct tramp_ctrl_data *parent)
   return p;
 }
 
+HEAP_T_ATTR
 void
 __gcc_nested_func_ptr_created (void *chain, void *func, void **dst)
 {
@@ -154,6 +161,7 @@ __gcc_nested_func_ptr_created (void *chain, void *func, void **dst)
   *dst = &trampoline->insns;
 }
 
+HEAP_T_ATTR
 void
 __gcc_nested_func_ptr_deleted (void)
 {
index 726cf55277a40ed4b54bc9010f97c4fea5dbb8ac..4e069c458a73805ff3bdeacd80ef94de415ae368 100644 (file)
 #include <pthread.h>
 #endif
 
+/* HEAP_T_ATTR is provided to allow targets to build the exported functions
+   as weak definitions.  */
+#ifndef HEAP_T_ATTR
+#  define HEAP_T_ATTR
+#endif
+
 void *allocate_trampoline_page (void);
 int get_trampolines_per_page (void);
 struct tramp_ctrl_data *allocate_tramp_ctrl (struct tramp_ctrl_data *parent);
@@ -107,6 +113,7 @@ allocate_tramp_ctrl (struct tramp_ctrl_data *parent)
   return p;
 }
 
+HEAP_T_ATTR
 void
 __gcc_nested_func_ptr_created (void *chain, void *func, void **dst)
 {
@@ -154,6 +161,7 @@ __gcc_nested_func_ptr_created (void *chain, void *func, void **dst)
   *dst = &trampoline->insns;
 }
 
+HEAP_T_ATTR
 void
 __gcc_nested_func_ptr_deleted (void)
 {
index a3bb70c6a0ae9c13b78e4f2197b8053b8ade3d9f..0f65b54a2302335cde125b01725a8806886eabdc 100644 (file)
@@ -51,5 +51,18 @@ LIB2ADDEH = $(srcdir)/unwind-dw2.c \
 # Do not build a shared unwind lib by default.
 LIBEHSOBJS=
 
+# Make heap trampoline helpers weak definitions so that we can merge them from
+# multiple DSOs.
+heap-trampoline.o: HOST_LIBGCC2_CFLAGS += \
+  -DHEAP_T_ATTR='__attribute__((__weak__,__visibility__("default")))'
+heap-trampoline_s.o: HOST_LIBGCC2_CFLAGS += \
+  -DHEAP_T_ATTR='__attribute__((__weak__,__visibility__("default")))'
+
+# Make a heap trampoline support CRT so that it can be linked optionally, use
+# the shared version so that we can link with DSOs.
+libheapt_w.a: heap-trampoline_s.o
+       $(AR_CREATE_FOR_TARGET) $@ $<
+       $(RANLIB_FOR_TARGET) $@
+
 # Symbols for all the sub-ports.
 SHLIB_MAPFILES = libgcc-std.ver $(srcdir)/config/libgcc-libsystem.ver