mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-18 02:49:31 +08:00
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).
69 lines
2.6 KiB
Plaintext
69 lines
2.6 KiB
Plaintext
# Set this as a minimum (unless overriden by arch t-files) since it's a
|
||
# reasonable lowest common denominator that works for all our archs.
|
||
HOST_LIBGCC2_CFLAGS += $(DARWIN_MIN_LIB_VERSION)
|
||
|
||
crt3.o: $(srcdir)/config/darwin-crt3.c
|
||
$(crt_compile) $(DARWIN_MIN_CRT_VERSION) -c $<
|
||
|
||
crttms.o: $(srcdir)/config/darwin-crt-tm.c
|
||
$(crt_compile) $(DARWIN_MIN_CRT_VERSION) -DSTART -c $<
|
||
|
||
crttme.o: $(srcdir)/config/darwin-crt-tm.c
|
||
$(crt_compile) $(DARWIN_MIN_CRT_VERSION) -DEND -c $<
|
||
|
||
# Make emutls weak so that we can deal with -static-libgcc, override the
|
||
# hidden visibility when this is present in libgcc_eh.
|
||
emutls.o: HOST_LIBGCC2_CFLAGS += \
|
||
-DEMUTLS_ATTR='__attribute__((__weak__,__visibility__("default")))'
|
||
emutls_s.o: HOST_LIBGCC2_CFLAGS += \
|
||
-DEMUTLS_ATTR='__attribute__((__weak__,__visibility__("default")))'
|
||
|
||
# Make the emutls crt as a convenience lib so that it can be linked
|
||
# optionally, use the shared version so that we can link with DSO.
|
||
libemutls_w.a: emutls_s.o
|
||
$(AR_CREATE_FOR_TARGET) $@ $<
|
||
$(RANLIB_FOR_TARGET) $@
|
||
|
||
# Patch to __Unwind_Find_Enclosing_Function for Darwin10.
|
||
# This needs to be built for darwin10, regardless of the current platform
|
||
# version.
|
||
d10-uwfef.o: $(srcdir)/config/darwin10-unwind-find-enc-func.c libgcc_tm.h
|
||
$(crt_compile) -mmacosx-version-min=10.6 -c $<
|
||
|
||
# Using this crt as a library means that it will not be added to an exe
|
||
# (or module) unless needed.
|
||
libd10-uwfef.a: d10-uwfef.o
|
||
$(AR_CREATE_FOR_TARGET) $@ d10-uwfef.o
|
||
$(RANLIB_FOR_TARGET) $@
|
||
|
||
###### Unwinder #######
|
||
# Most Darwin versions get their unwinder from libSystem; older versions
|
||
# have an installed /usr/lib/libgcc_s.1.dylib.
|
||
# So do not add the unwinder to the shared libgcc.
|
||
LIB2ADDEHSHARED =
|
||
|
||
# We still need it in the _eh.a for earlier platform versions.
|
||
# Use unwind-dw2-fde-darwin
|
||
LIB2ADDEH = $(srcdir)/unwind-dw2.c \
|
||
$(srcdir)/config/unwind-dw2-fde-darwin.c \
|
||
$(srcdir)/unwind-c.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
|