# HG changeset patch # User bobv # Date 1445275297 14400 # Node ID f108f239ffcf6142b55e07b93acf5fd5b53c0a0d # Parent 1ae4191359d811a51512f17dca80ffe79837a5ff 8136556: Add the ability to perform static builds of MacOSX x64 binaries Reviewed-by: ihse, bdelsart, gadams, lfoltan, rriggs, hseigel, twisti diff --git a/make/Makefile b/make/Makefile --- a/make/Makefile +++ b/make/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -403,6 +403,8 @@ $(install-dir) $(EXPORT_SERVER_DIR)/%.dSYM: $(C2_BUILD_DIR)/%.dSYM $(install-dir) +$(EXPORT_SERVER_DIR)/%.symbols: $(C2_BUILD_DIR)/%.symbols + $(install-file) endif # Client (C1) diff --git a/make/bsd/makefiles/buildtree.make b/make/bsd/makefiles/buildtree.make --- a/make/bsd/makefiles/buildtree.make +++ b/make/bsd/makefiles/buildtree.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -224,6 +224,11 @@ echo "OPENJDK = $(OPENJDK)"; \ echo "$(LP64_SETTING/$(DATA_MODE))"; \ echo; \ + echo "STATIC_BUILD = $(STATIC_BUILD)"; \ + echo "COMPILER_WARNINGS_FATAL = $(COMPILER_WARNINGS_FATAL)"; \ + echo "EXTRA_LDFLAGS = $(EXTRA_LDFLAGS)"; \ + echo "LIBRARY_SUFFIX = $(LIBRARY_SUFFIX)"; \ + echo; \ echo "# Used for platform dispatching"; \ echo "TARGET_DEFINES = -DTARGET_OS_FAMILY_\$$(Platform_os_family)"; \ echo "TARGET_DEFINES += -DTARGET_ARCH_\$$(Platform_arch)"; \ diff --git a/make/bsd/makefiles/defs.make b/make/bsd/makefiles/defs.make --- a/make/bsd/makefiles/defs.make +++ b/make/bsd/makefiles/defs.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -186,13 +186,16 @@ # executed multiple times. We reduce the noise by at least checking that # BUILD_FLAVOR has been set. ifneq ($(BUILD_FLAVOR),) - ifeq ($(BUILD_FLAVOR), product) - FULL_DEBUG_SYMBOLS ?= 1 - ENABLE_FULL_DEBUG_SYMBOLS = $(FULL_DEBUG_SYMBOLS) - else - # debug variants always get Full Debug Symbols (if available) - ENABLE_FULL_DEBUG_SYMBOLS = 1 - endif + # FULL_DEBUG_SYMBOLS not created for individual static libraries + ifeq ($(STATIC_BUILD),false) + ifeq ($(BUILD_FLAVOR), product) + FULL_DEBUG_SYMBOLS ?= 1 + ENABLE_FULL_DEBUG_SYMBOLS = $(FULL_DEBUG_SYMBOLS) + else + # debug variants always get Full Debug Symbols (if available) + ENABLE_FULL_DEBUG_SYMBOLS = 1 + endif + endif $(eval $(call print_info, "ENABLE_FULL_DEBUG_SYMBOLS=$(ENABLE_FULL_DEBUG_SYMBOLS)")) # since objcopy is optional, we set ZIP_DEBUGINFO_FILES later @@ -256,16 +259,24 @@ JDK_INCLUDE_SUBDIR=bsd # Library suffix -ifeq ($(OS_VENDOR),Darwin) - LIBRARY_SUFFIX=dylib +ifneq ($(STATIC_BUILD),true) + ifeq ($(OS_VENDOR),Darwin) + LIBRARY_SUFFIX=dylib + else + LIBRARY_SUFFIX=so + endif else - LIBRARY_SUFFIX=so + LIBRARY_SUFFIX=a endif + EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html +# jsig library not needed for static builds +ifneq ($(STATIC_BUILD),true) # client and server subdirectories have symbolic links to ../libjsig.so -EXPORT_LIST += $(EXPORT_LIB_ARCH_DIR)/libjsig.$(LIBRARY_SUFFIX) + EXPORT_LIST += $(EXPORT_LIB_ARCH_DIR)/libjsig.$(LIBRARY_SUFFIX) +endif ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ifeq ($(ZIP_DEBUGINFO_FILES),1) @@ -286,6 +297,9 @@ ifeq ($(findstring true, $(JVM_VARIANT_SERVER) $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true) EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.$(LIBRARY_SUFFIX) + ifeq ($(STATIC_BUILD),true) + EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.symbols + endif ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ifeq ($(ZIP_DEBUGINFO_FILES),1) @@ -303,6 +317,9 @@ ifeq ($(JVM_VARIANT_CLIENT),true) EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.$(LIBRARY_SUFFIX) + ifeq ($(STATIC_BUILD),true) + EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.symbols + endif ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ifeq ($(ZIP_DEBUGINFO_FILES),1) @@ -320,6 +337,9 @@ ifeq ($(JVM_VARIANT_MINIMAL1),true) EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/Xusage.txt EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.$(LIBRARY_SUFFIX) + ifeq ($(STATIC_BUILD),true) + EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.symbols + endif endif # Serviceability Binaries @@ -388,7 +408,9 @@ endif # Binaries to 'universalize' if built - UNIVERSAL_LIPO_LIST += $(EXPORT_LIB_DIR)/libjsig.$(LIBRARY_SUFFIX) + ifneq ($(STATIC_BUILD),true) + UNIVERSAL_LIPO_LIST += $(EXPORT_LIB_DIR)/libjsig.$(LIBRARY_SUFFIX) + endif UNIVERSAL_LIPO_LIST += $(EXPORT_LIB_DIR)/libsaproc.$(LIBRARY_SUFFIX) UNIVERSAL_LIPO_LIST += $(EXPORT_LIB_DIR)/server/libjvm.$(LIBRARY_SUFFIX) UNIVERSAL_LIPO_LIST += $(EXPORT_LIB_DIR)/client/libjvm.$(LIBRARY_SUFFIX) @@ -396,6 +418,13 @@ # Files to simply copy in place UNIVERSAL_COPY_LIST += $(EXPORT_LIB_DIR)/server/Xusage.txt UNIVERSAL_COPY_LIST += $(EXPORT_LIB_DIR)/client/Xusage.txt + + ifeq ($(STATIC_BUILD),true) + UNIVERSAL_COPY_LIST += $(EXPORT_LIB_DIR)/server/libjvm.symbols + UNIVERSAL_COPY_LIST += $(EXPORT_LIB_DIR)/client/libjvm.symbols + UNIVERSAL_COPY_LIST += $(EXPORT_LIB_DIR)/minimal/libjvm.symbols + endif + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ifeq ($(ZIP_DEBUGINFO_FILES),1) UNIVERSAL_COPY_LIST += $(EXPORT_LIB_DIR)/server/libjvm.diz diff --git a/make/bsd/makefiles/dtrace.make b/make/bsd/makefiles/dtrace.make --- a/make/bsd/makefiles/dtrace.make +++ b/make/bsd/makefiles/dtrace.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -37,15 +37,15 @@ # Bsd does not build libjvm_db, does not compile on macosx # disabled in build: rule in vm.make JVM_DB = libjvm_db -LIBJVM_DB = libjvm_db.dylib +LIBJVM_DB = libjvm_db.$(LIBRARY_SUFFIX) -LIBJVM_DB_DEBUGINFO = libjvm_db.dylib.dSYM +LIBJVM_DB_DEBUGINFO = libjvm_db.$(LIBRARY_SUFFIX).dSYM LIBJVM_DB_DIZ = libjvm_db.diz JVM_DTRACE = jvm_dtrace -LIBJVM_DTRACE = libjvm_dtrace.dylib +LIBJVM_DTRACE = libjvm_dtrace.$(LIBRARY_SUFFIX) -LIBJVM_DTRACE_DEBUGINFO = libjvm_dtrace.dylib.dSYM +LIBJVM_DTRACE_DEBUGINFO = libjvm_dtrace.$(LIBRARY_SUFFIX).dSYM LIBJVM_DTRACE_DIZ = libjvm_dtrace.diz JVMOFFS = JvmOffsets @@ -167,14 +167,14 @@ LFLAGS_GENOFFS += -L. -lib$(GENOFFS).dylib: $(DTRACE_SRCDIR)/$(GENOFFS).cpp $(DTRACE_SRCDIR)/$(GENOFFS).h \ +lib$(GENOFFS).$(LIBRARY_SUFFIX): $(DTRACE_SRCDIR)/$(GENOFFS).cpp $(DTRACE_SRCDIR)/$(GENOFFS).h \ $(LIBJVM.o) $(QUIETLY) $(CXX) $(CXXFLAGS) $(GENOFFS_CFLAGS) $(SHARED_FLAG) $(PICFLAG) \ $(LFLAGS_GENOFFS) -o $@ $(DTRACE_SRCDIR)/$(GENOFFS).cpp -ljvm -$(GENOFFS): $(DTRACE_SRCDIR)/$(GENOFFS)Main.c lib$(GENOFFS).dylib +$(GENOFFS): $(DTRACE_SRCDIR)/$(GENOFFS)Main.c lib$(GENOFFS).$(LIBRARY_SUFFIX) $(QUIETLY) $(LINK.CXX) -o $@ $(DTRACE_SRCDIR)/$(GENOFFS)Main.c \ - ./lib$(GENOFFS).dylib + ./lib$(GENOFFS).$(LIBRARY_SUFFIX) # $@.tmp is created first to avoid an empty $(JVMOFFS).h if an error occurs. $(JVMOFFS).h: $(GENOFFS) diff --git a/make/bsd/makefiles/gcc.make b/make/bsd/makefiles/gcc.make --- a/make/bsd/makefiles/gcc.make +++ b/make/bsd/makefiles/gcc.make @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -185,7 +185,14 @@ CFLAGS += $(LIBFFI_CFLAGS) CFLAGS += $(LLVM_CFLAGS) endif + +ifeq ($(STATIC_BUILD),true) +CXXFLAGS += -DSTATIC_BUILD +CFLAGS += -DSTATIC_BUILD +else CFLAGS += $(VM_PICFLAG) +endif + CFLAGS += -fno-rtti CFLAGS += -fno-exceptions ifeq ($(USE_CLANG),) diff --git a/make/bsd/makefiles/jsig.make b/make/bsd/makefiles/jsig.make --- a/make/bsd/makefiles/jsig.make +++ b/make/bsd/makefiles/jsig.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -28,9 +28,9 @@ JSIG = jsig ifeq ($(OS_VENDOR), Darwin) - LIBJSIG = lib$(JSIG).dylib + LIBJSIG = lib$(JSIG).$(LIBRARY_SUFFIX) - LIBJSIG_DEBUGINFO = lib$(JSIG).dylib.dSYM + LIBJSIG_DEBUGINFO = lib$(JSIG).$(LIBRARY_SUFFIX).dSYM LIBJSIG_DIZ = lib$(JSIG).diz else LIBJSIG = lib$(JSIG).so @@ -61,8 +61,14 @@ $(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE) @echo $(LOG_INFO) Making signal interposition lib... +ifeq ($(STATIC_BUILD),true) + $(QUIETLY) $(CC) -c $(SYMFLAG) $(EXTRA_CFLAGS) $(ARCHFLAG) $(PICFLAG) \ + $(LFLAGS_JSIG) $(JSIG_DEBUG_CFLAGS) -o $(JSIG).o $< + $(QUIETLY) $(AR) $(ARFLAGS) $@ $(JSIG).o +else $(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \ $(LFLAGS_JSIG) $(JSIG_DEBUG_CFLAGS) -o $@ $< +endif ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ifeq ($(OS_VENDOR), Darwin) $(DSYMUTIL) $@ diff --git a/make/bsd/makefiles/rules.make b/make/bsd/makefiles/rules.make --- a/make/bsd/makefiles/rules.make +++ b/make/bsd/makefiles/rules.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,11 @@ COMPILE.CC = $(CC_COMPILE) -c GENASM.CC = $(CC_COMPILE) -S LINK.CC = $(CC) $(LFLAGS) $(AOUT_FLAGS) $(PROF_AOUT_FLAGS) +ifeq ($(STATIC_BUILD),true) +LINK_LIB.CC = $(AR) $(ARFLAGS) +else LINK_LIB.CC = $(CC) $(LFLAGS) $(SHARED_FLAG) +endif PREPROCESS.CC = $(CC_COMPILE) -E COMPILE.CXX = $(CXX_COMPILE) -c diff --git a/make/bsd/makefiles/saproc.make b/make/bsd/makefiles/saproc.make --- a/make/bsd/makefiles/saproc.make +++ b/make/bsd/makefiles/saproc.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -28,9 +28,9 @@ SAPROC = saproc ifeq ($(OS_VENDOR), Darwin) - LIBSAPROC = lib$(SAPROC).dylib + LIBSAPROC = lib$(SAPROC).$(LIBRARY_SUFFIX) - LIBSAPROC_DEBUGINFO = lib$(SAPROC).dylib.dSYM + LIBSAPROC_DEBUGINFO = lib$(SAPROC).$(LIBRARY_SUFFIX).dSYM LIBSAPROC_DIZ = lib$(SAPROC).diz else LIBSAPROC = lib$(SAPROC).so diff --git a/make/bsd/makefiles/vm.make b/make/bsd/makefiles/vm.make --- a/make/bsd/makefiles/vm.make +++ b/make/bsd/makefiles/vm.make @@ -142,10 +142,10 @@ JVM = jvm ifeq ($(OS_VENDOR), Darwin) - LIBJVM = lib$(JVM).dylib + LIBJVM = lib$(JVM).$(LIBRARY_SUFFIX) CFLAGS += -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE - LIBJVM_DEBUGINFO = lib$(JVM).dylib.dSYM + LIBJVM_DEBUGINFO = lib$(JVM).$(LIBRARY_SUFFIX).dSYM LIBJVM_DIZ = lib$(JVM).diz else LIBJVM = lib$(JVM).so @@ -261,6 +261,16 @@ { print $$0 } \ }' > $@ < $(MAPFILE) +ifeq ($(STATIC_BUILD),true) +EXPORTED_SYMBOLS = libjvm.symbols + +libjvm.symbols : mapfile + $(CP) mapfile libjvm.symbols + +else +EXPORTED_SYMBOLS = +endif + mapfile_reorder : mapfile $(REORDERFILE) rm -f $@ cat $^ > $@ @@ -288,9 +298,11 @@ LFLAGS_VM += $(SONAMEFLAG:SONAME=$(LIBJVM)) ifeq ($(OS_VENDOR), Darwin) - LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/. - LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/.. - LFLAGS_VM += -Xlinker -install_name -Xlinker @rpath/$(@F) + ifneq ($(STATIC_BUILD),true) + LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/. + LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/.. + LFLAGS_VM += -Xlinker -install_name -Xlinker @rpath/$(@F) + endif else LFLAGS_VM += -Wl,-z,defs endif @@ -345,6 +357,10 @@ endif $(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE) $(LD_SCRIPT) +ifeq ($(STATIC_BUILD),true) + echo Linking static vm...; + $(LINK_LIB.CC) $@ $(LIBJVM.o) +else $(QUIETLY) { \ echo $(LOG_INFO) Linking vm...; \ $(LINK_LIB.CXX/PRE_HOOK) \ @@ -354,6 +370,8 @@ rm -f $@.1; ln -s $@ $@.1; \ } +endif + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ifeq ($(OS_VENDOR), Darwin) $(DSYMUTIL) $@ @@ -410,10 +428,10 @@ ifeq ($(OS_VENDOR), Darwin) # no libjvm_db for macosx -build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(BUILDLIBSAPROC) dtraceCheck +build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(BUILDLIBSAPROC) dtraceCheck $(EXPORTED_SYMBOLS) echo "Doing vm.make build:" else -build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC) +build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC) $(EXPORTED_SYMBOLS) endif install: install_jvm install_jsig install_saproc diff --git a/src/os/bsd/vm/os_bsd.cpp b/src/os/bsd/vm/os_bsd.cpp --- a/src/os/bsd/vm/os_bsd.cpp +++ b/src/os/bsd/vm/os_bsd.cpp @@ -442,6 +442,10 @@ if (pslash != NULL) { *pslash = '\0'; // Get rid of /{client|server|hotspot}. } +#ifdef STATIC_BUILD + strcat(buf, "/lib"); +#endif + Arguments::set_dll_dir(buf); if (pslash != NULL) { @@ -1390,6 +1394,9 @@ #ifdef __APPLE__ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { +#ifdef STATIC_BUILD + return os::get_default_process_handle(); +#else void * result= ::dlopen(filename, RTLD_LAZY); if (result != NULL) { // Successful loading @@ -1401,9 +1408,13 @@ ebuf[ebuflen-1]='\0'; return NULL; +#endif // STATIC_BUILD } #else void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { +#ifdef STATIC_BUILD + return os::get_default_process_handle(); +#else void * result= ::dlopen(filename, RTLD_LAZY); if (result != NULL) { // Successful loading @@ -1576,6 +1587,7 @@ } return NULL; +#endif // STATIC_BUILD } #endif // !__APPLE__ diff --git a/src/share/vm/compiler/disassembler.cpp b/src/share/vm/compiler/disassembler.cpp --- a/src/share/vm/compiler/disassembler.cpp +++ b/src/share/vm/compiler/disassembler.cpp @@ -88,6 +88,12 @@ os::jvm_path(buf, sizeof(buf)); int jvm_offset = -1; int lib_offset = -1; +#ifdef STATIC_BUILD + char* p = strrchr(buf, '/'); + *p = '\0'; + strcat(p, "/lib/"); + lib_offset = jvm_offset = strlen(buf); +#else { // Match "jvm[^/]*" in jvm_path. const char* base = buf; @@ -96,6 +102,7 @@ p = strstr(p ? p : base, "jvm"); if (p != NULL) jvm_offset = p - base; } +#endif // Find the disassembler shared library. // Search for several paths derived from libjvm, in this order: // 1. /jre/lib///libhsdis-.so (for compatibility)