574c09da48
There was a race condition where the link for the new shared EH library (only used on earlier Darwin) could fail because the new crts had not been copied to the gcc directory. This can cause a build failure (although currently only seen on powerpc-darwin). Fixed by adding specific dependency on the crts and on the multi target. We also add the declaration header for the Darwin10 unwinder shim to the powerpc cases, since we build that there for Rosetta use. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> libgcc/ChangeLog: * config.host: Add shim declaration header to powerpc*-darwin builds. * config/rs6000/t-darwin-ehs: Remove dependency on the powerpc end file. * config/t-darwin-ehs: Add dependencies to the shared unwinder objects. * config/t-slibgcc-darwin: Add extra_parts to the dependencies for the shared EH lib. Add all-multi to the dependencies for the libgcc_s.1.dylib redirections.
184 lines
6.6 KiB
Plaintext
184 lines
6.6 KiB
Plaintext
# Build a shared libgcc library with the darwin linker.
|
|
|
|
SHLIB_SOVERSION = 1.1
|
|
SHLIB_SO_MINVERSION = 1
|
|
SHLIB_VERSTRING = -compatibility_version $(SHLIB_SO_MINVERSION) \
|
|
-current_version $(SHLIB_SOVERSION)
|
|
SHLIB_EXT = .dylib
|
|
SHLIB_LC = -lSystem
|
|
SHLIB_INSTALL_DIR = $(slibdir)
|
|
|
|
SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
|
|
SHLIB_MKMAP_OPTS = -v leading_underscore=1
|
|
|
|
# Shorthand expressions for the LINK below, these are substituted in the
|
|
# link expression.
|
|
SHLIB_INSTALL_NAME = @shlib_base_name@.$(SHLIB_SOVERSION)$(SHLIB_EXT)
|
|
SHLIB_MAP = @shlib_map_file@
|
|
SHLIB_DIR = @multilib_dir@
|
|
SHLIB_SONAME = @shlib_base_name@$(SHLIB_EXT)
|
|
|
|
# Darwin only searches in shlib_slibdir for shared libraries, not in
|
|
# subdirectories. The link builds one architecture slice in its designated
|
|
# subdir. The code under MULTIBUILDTOP combines these into a single FAT
|
|
# library, that is what we eventually install.
|
|
|
|
SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) $(LDFLAGS) -dynamiclib -nodefaultlibs \
|
|
-install_name $(SHLIB_INSTALL_DIR)/$(SHLIB_INSTALL_NAME) \
|
|
-single_module -o $(SHLIB_DIR)/$(SHLIB_SONAME) \
|
|
-Wl,-exported_symbols_list,$(SHLIB_MAP) \
|
|
$(SHLIB_VERSTRING) \
|
|
@multilib_flags@ @shlib_objs@ $(SHLIB_LC)
|
|
|
|
# we do our own thing
|
|
SHLIB_INSTALL =
|
|
|
|
LGCC_FILES = libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)
|
|
|
|
ifeq ($(BUILD_LIBGCCS1),YES)
|
|
|
|
# We are going to build a libgcc_s.1.dylib so that distributions can
|
|
# install it for compatibility with binaries linked against the old
|
|
# libgcc_ext.10.x.dylib stubs.
|
|
|
|
# For systems after macOS 10.7 we can forward the correct unwinder symbols
|
|
# from libSystem.
|
|
|
|
# For older systems we have to forward an entire library (since they cannot
|
|
# selectively forward symbols, which means that we cannot forward the unwinder
|
|
# in /usr/lib/libgcc_s.1.dylib). We also cannot forward the entire library
|
|
# since that creates a self-referencing loop when DYLD_LIBRARY_PATH is used.
|
|
# To provide the unwinder symbols in this case, we build the unwinder into a
|
|
# separate shared lib (libgcc_ehs) and forward that.
|
|
|
|
# These targets are local to this make fragment, which means that they do not
|
|
# get the substitutions seen in SHLIB_LINK.
|
|
|
|
ifneq ($(LIBEHSOBJS),)
|
|
|
|
EHS_INSTNAME = libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)
|
|
|
|
# multilib build for a shared EH lib.
|
|
|
|
libgcc_ehs$(SHLIB_EXT): $(LIBEHSOBJS) $(extra-parts)
|
|
mkdir -p $(MULTIDIR)
|
|
$(CC) $(LIBGCC2_CFLAGS) $(LDFLAGS) -dynamiclib -nodefaultlibs \
|
|
-install_name $(SHLIB_INSTALL_DIR)/$(EHS_INSTNAME) \
|
|
-o $(MULTIDIR)/libgcc_ehs$(SHLIB_EXT) $(SHLIB_VERSTRING) \
|
|
$(LIBEHSOBJS) $(SHLIB_LC)
|
|
|
|
all: libgcc_ehs$(SHLIB_EXT)
|
|
|
|
LGCC_FILES += libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)
|
|
|
|
endif
|
|
|
|
# Provide libgcc_s.1 for backwards compatibility.
|
|
LGCC_FILES += libgcc_s.1.dylib
|
|
|
|
endif
|
|
|
|
INSTALL_FILES=$(LGCC_FILES)
|
|
|
|
# For the toplevel multilib, build FAT dylibs including all the multilibs.
|
|
ifeq ($(MULTIBUILDTOP),)
|
|
|
|
ifeq ($(enable_shared),yes)
|
|
all: $(INSTALL_FILES)
|
|
install-leaf: install-darwin-libgcc-stubs
|
|
endif
|
|
|
|
libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT): all-multi libgcc_s$(SHLIB_EXT)
|
|
MLIBS=`$(CC) --print-multi-lib | sed -e 's/;.*$$//'` ; \
|
|
for mlib in $$MLIBS ; do \
|
|
cp ../$${mlib}/libgcc/$${mlib}/libgcc_s$(SHLIB_EXT) \
|
|
./libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \
|
|
done
|
|
$(LIPO) -output libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT) \
|
|
-create libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T*
|
|
rm libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T*
|
|
|
|
ifeq ($(BUILD_LIBGCCS1),YES)
|
|
ifneq ($(LIBEHSOBJS),)
|
|
|
|
libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT): all-multi libgcc_ehs$(SHLIB_EXT)
|
|
MLIBS=`$(CC) --print-multi-lib | sed -e 's/;.*$$//'` ; \
|
|
for mlib in $$MLIBS ; do \
|
|
cp ../$${mlib}/libgcc/$${mlib}/libgcc_ehs$(SHLIB_EXT) \
|
|
./libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \
|
|
done
|
|
$(LIPO) -output libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT) \
|
|
-create libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T*
|
|
rm libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T*
|
|
|
|
|
|
libgcc_s.1.dylib: all-multi libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT) \
|
|
libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)
|
|
MLIBS=`$(CC) --print-multi-lib | sed -e 's/;.*$$//'` ; \
|
|
for mlib in $$MLIBS ; do \
|
|
cp ../$${mlib}/libgcc/$${mlib}/libgcc_s$(SHLIB_EXT) \
|
|
./libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \
|
|
cp ../$${mlib}/libgcc/$${mlib}/libgcc_ehs$(SHLIB_EXT) \
|
|
./libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \
|
|
arch=`$(LIPO) -info libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} | sed -e 's/.*:\ //'` ; \
|
|
$(CC) -arch $${arch} -nodefaultlibs -dynamiclib \
|
|
-o libgcc_s.1$(SHLIB_EXT)_T_$${mlib} \
|
|
-Wl,-reexport_library,libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} \
|
|
-Wl,-reexport_library,libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} \
|
|
-install_name $(SHLIB_INSTALL_DIR)/libgcc_s.1.dylib \
|
|
-compatibility_version 1 -current_version 1 ; \
|
|
done
|
|
$(LIPO) -output libgcc_s.1$(SHLIB_EXT) -create libgcc_s.1$(SHLIB_EXT)_T*
|
|
rm libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T*
|
|
rm libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T*
|
|
|
|
else
|
|
|
|
libgcc_s.1.dylib: all-multi libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)
|
|
MLIBS=`$(CC) --print-multi-lib | sed -e 's/;.*$$//'` ; \
|
|
for mlib in $$MLIBS ; do \
|
|
cp ../$${mlib}/libgcc/$${mlib}/libgcc_s$(SHLIB_EXT) \
|
|
./libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \
|
|
arch=`$(LIPO) -info libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} | sed -e 's/.*:\ //'` ; \
|
|
$(CC) -arch $${arch} -nodefaultlibs -dynamiclib \
|
|
-o libgcc_s.1$(SHLIB_EXT)_T_$${mlib} \
|
|
-Wl,-reexport_library,libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} \
|
|
-lSystem \
|
|
-Wl,-reexported_symbols_list,$(srcdir)/config/darwin-unwind.ver \
|
|
-install_name $(SHLIB_INSTALL_DIR)/libgcc_s.1.dylib \
|
|
-compatibility_version 1 -current_version 1 ; \
|
|
done
|
|
$(LIPO) -output libgcc_s.1$(SHLIB_EXT) -create libgcc_s.1$(SHLIB_EXT)_T*
|
|
rm libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T*
|
|
|
|
endif
|
|
endif
|
|
|
|
# Install the shared libraries.
|
|
|
|
install-darwin-libgcc-stubs :
|
|
$(mkinstalldirs) $(DESTDIR)$(slibdir)
|
|
for d in $(INSTALL_FILES) ; do \
|
|
$(INSTALL_DATA) $$d $(DESTDIR)$(slibdir)/$$d || exit 1 ; \
|
|
done
|
|
|
|
else
|
|
|
|
# Do not install shared libraries for multilibs. Unless we are putting them
|
|
# in the gcc directory during a build, for compatibility with the pre-top-
|
|
# level layout. In that case we provide symlinks to the FAT lib from the
|
|
# multilib sub-directories.
|
|
|
|
ifeq ($(enable_shared),yes)
|
|
all: install-darwin-libgcc-links
|
|
endif
|
|
|
|
install-darwin-libgcc-links:
|
|
$(mkinstalldirs) $(gcc_objdir)$(MULTISUBDIR)
|
|
for file in $(INSTALL_FILES); do \
|
|
rm -f $(gcc_objdir)$(MULTISUBDIR)/$$file; \
|
|
$(LN_S) ../$$file $(gcc_objdir)$(MULTISUBDIR)/; \
|
|
done
|
|
|
|
endif
|