diff --git a/make/autoconf/flags-cflags.m4 b/make/autoconf/flags-cflags.m4 --- a/make/autoconf/flags-cflags.m4 +++ b/make/autoconf/flags-cflags.m4 @@ -36,13 +36,24 @@ [ if test "x$TOOLCHAIN_TYPE" = xgcc; then C_FLAG_REORDER='' + if test "x$OPENJDK_TARGET_OS" = xmacosx; then + # Linking is different on MacOSX + SHARED_LIBRARY_FLAGS="-dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0" + SET_EXECUTABLE_ORIGIN='-Wl,-rpath,@loader_path$(or [$]1,/.)' + SET_SHARED_LIBRARY_ORIGIN="$SET_EXECUTABLE_ORIGIN" + SET_SHARED_LIBRARY_NAME='-Wl,-install_name,@rpath/[$]1' + SET_SHARED_LIBRARY_MAPFILE='-Wl,-exported_symbols_list,[$]1' + + else # Default works for linux, might work on other platforms as well. - SHARED_LIBRARY_FLAGS='-shared' - SET_EXECUTABLE_ORIGIN='-Wl,-rpath,\$$ORIGIN[$]1' - SET_SHARED_LIBRARY_ORIGIN="-Wl,-z,origin $SET_EXECUTABLE_ORIGIN" - SET_SHARED_LIBRARY_NAME='-Wl,-soname=[$]1' - SET_SHARED_LIBRARY_MAPFILE='-Wl,-version-script=[$]1' + SHARED_LIBRARY_FLAGS='-shared' + SET_EXECUTABLE_ORIGIN='-Wl,-rpath,\$$ORIGIN[$]1' + SET_SHARED_LIBRARY_ORIGIN="-Wl,-z,origin $SET_EXECUTABLE_ORIGIN" + SET_SHARED_LIBRARY_NAME='-Wl,-soname=[$]1' + SET_SHARED_LIBRARY_MAPFILE='-Wl,-version-script=[$]1' + + fi elif test "x$TOOLCHAIN_TYPE" = xclang; then C_FLAG_REORDER='' diff --git a/make/autoconf/flags-ldflags.m4 b/make/autoconf/flags-ldflags.m4 --- a/make/autoconf/flags-ldflags.m4 +++ b/make/autoconf/flags-ldflags.m4 @@ -64,20 +64,25 @@ [ # Setup basic LDFLAGS if test "x$TOOLCHAIN_TYPE" = xgcc; then - # If this is a --hash-style=gnu system, use --hash-style=both, why? - # We have previously set HAS_GNU_HASH if this is the case - if test -n "$HAS_GNU_HASH"; then - BASIC_LDFLAGS="-Wl,--hash-style=both" - LIBJSIG_HASHSTYLE_LDFLAGS="-Wl,--hash-style=both" - fi + if test "x$OPENJDK_TARGET_OS" = xmacosx; then + BASIC_LDFLAGS_JVM_ONLY="-mno-omit-leaf-frame-pointer -mpreferred-stack-boundary=4 \ + -fPIC" + else + # If this is a --hash-style=gnu system, use --hash-style=both, why? + # We have previously set HAS_GNU_HASH if this is the case + if test -n "$HAS_GNU_HASH"; then + BASIC_LDFLAGS="-Wl,--hash-style=both" + LIBJSIG_HASHSTYLE_LDFLAGS="-Wl,--hash-style=both" + fi - # Add -z defs, to forbid undefined symbols in object files. - BASIC_LDFLAGS="$BASIC_LDFLAGS -Wl,-z,defs" + # Add -z defs, to forbid undefined symbols in object files. + BASIC_LDFLAGS="$BASIC_LDFLAGS -Wl,-z,defs" - BASIC_LDFLAGS_JVM_ONLY="-Wl,-z,noexecstack -Wl,-O1 -Wl,-z,relro" + BASIC_LDFLAGS_JVM_ONLY="-Wl,-z,noexecstack -Wl,-O1 -Wl,-z,relro" - BASIC_LDFLAGS_JDK_LIB_ONLY="-Wl,-z,noexecstack" - LIBJSIG_NOEXECSTACK_LDFLAGS="-Wl,-z,noexecstack" + BASIC_LDFLAGS_JDK_LIB_ONLY="-Wl,-z,noexecstack" + LIBJSIG_NOEXECSTACK_LDFLAGS="-Wl,-z,noexecstack" + fi elif test "x$TOOLCHAIN_TYPE" = xclang; then BASIC_LDFLAGS_JVM_ONLY="-mno-omit-leaf-frame-pointer -mstack-alignment=16 \ @@ -139,7 +144,9 @@ # Setup LDFLAGS for linking executables if test "x$TOOLCHAIN_TYPE" = xgcc; then - EXECUTABLE_LDFLAGS="$EXECUTABLE_LDFLAGS -Wl,--allow-shlib-undefined" + if test "x$OPENJDK_TARGET_OS" != xmacosx; then + EXECUTABLE_LDFLAGS="$EXECUTABLE_LDFLAGS -Wl,--allow-shlib-undefined" + fi fi # Export some intermediate variables for compatibility diff --git a/make/autoconf/flags-other.m4 b/make/autoconf/flags-other.m4 --- a/make/autoconf/flags-other.m4 +++ b/make/autoconf/flags-other.m4 @@ -108,7 +108,11 @@ AC_DEFUN([FLAGS_SETUP_ASFLAGS], [ if test "x$OPENJDK_TARGET_OS" = xmacosx; then - JVM_BASIC_ASFLAGS="-x assembler-with-cpp -mno-omit-leaf-frame-pointer -mstack-alignment=16" + if test "x$TOOLCHAIN_TYPE" = xgcc; then + JVM_BASIC_ASFLAGS="-x assembler-with-cpp -mno-omit-leaf-frame-pointer -mpreferred-stack-boundary=4" + else + JVM_BASIC_ASFLAGS="-x assembler-with-cpp -mno-omit-leaf-frame-pointer -mstack-alignment=16" + fi fi ]) diff --git a/make/autoconf/lib-std.m4 b/make/autoconf/lib-std.m4 --- a/make/autoconf/lib-std.m4 +++ b/make/autoconf/lib-std.m4 @@ -77,6 +77,32 @@ fi fi + # on macos if building with gcc, need to statically link with libgcc + if test "x$OPENJDK_TARGET_OS" = xmacosx; then + if test "x$TOOLCHAIN_TYPE" = xgcc; then + # Test if libgcc can be linked statically. + AC_MSG_CHECKING([if static link of libgcc is possible]) + STATIC_LIBGCC_FLAGS="-static-libgcc" + AC_LANG_PUSH(C++) + OLD_LIBS="$LIBS" + LIBS="$STATIC_LIBGCC_FLAGS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([], [return 0;])], + [has_static_libgcc=yes], + [has_static_libgcc=no]) + LIBS="$OLD_LIBS" + AC_LANG_POP(C++) + AC_MSG_RESULT([$has_static_libgcc]) + + if test "x$has_static_libgcc" = xno; then + AC_MSG_ERROR([Static linking of libgcc was not possible!]) + fi + + LIBCXX="$LIBCXX $STATIC_LIBGCC_FLAGS" + JVM_LDFLAGS="$JVM_LDFLAGS $STATIC_LIBGCC_FLAGS" + OPENJDK_BUILD_JVM_LDFLAGS="$OPENJDK_BUILD_JVM_LDFLAGS $STATIC_LIBGCC_FLAGS" + fi + fi + # libCrun is the c++ runtime-library with SunStudio (roughly the equivalent of gcc's libstdc++.so) if test "x$TOOLCHAIN_TYPE" = xsolstudio && test "x$LIBCXX" = x; then LIBCXX="${SYSROOT}/usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libCrun.so.1" diff --git a/make/lib/Lib-jdk.hotspot.agent.gmk b/make/lib/Lib-jdk.hotspot.agent.gmk --- a/make/lib/Lib-jdk.hotspot.agent.gmk +++ b/make/lib/Lib-jdk.hotspot.agent.gmk @@ -36,8 +36,13 @@ SA_LDFLAGS := -mt else ifeq ($(OPENJDK_TARGET_OS), macosx) - SA_CFLAGS := -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \ + ifeq ($(TOOLCHAIN_TYPE), gcc) + SA_CFLAGS := -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \ + -mpreferred-stack-boundary=4 -fPIC + else + SA_CFLAGS := -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \ -mstack-alignment=16 -fPIC + endif LIBSA_EXTRA_SRC := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.hotspot.agent else ifeq ($(OPENJDK_TARGET_OS), windows) SA_CFLAGS := -D_WINDOWS -D_DEBUG -D_CONSOLE -D_MBCS -EHsc diff --git a/make/lib/LibCommon.gmk b/make/lib/LibCommon.gmk --- a/make/lib/LibCommon.gmk +++ b/make/lib/LibCommon.gmk @@ -43,7 +43,9 @@ ifeq ($(TOOLCHAIN_TYPE), gcc) CFLAGS_JDKLIB += -fvisibility=hidden CXXFLAGS_JDKLIB += -fvisibility=hidden - LDFLAGS_JDKLIB += -Wl,--exclude-libs,ALL + ifneq ($(OPENJDK_TARGET_OS), macosx) + LDFLAGS_JDKLIB += -Wl,--exclude-libs,ALL + endif EXPORT_ALL_SYMBOLS := -fvisibility=default else ifeq ($(TOOLCHAIN_TYPE), clang) ifneq ($(OPENJDK_TARGET_OS), macosx)