8339480: Build static-jdk image with a statically linked launcher

Co-authored-by: Magnus Ihse Bursie <ihse@openjdk.org>
Co-authored-by: Jiangli Zhou <jiangli@openjdk.org>
Reviewed-by: dholmes, erikj, coleenp
This commit is contained in:
Magnus Ihse Bursie 2024-12-02 15:12:24 +00:00
parent d589bafee3
commit 1ca764454b
27 changed files with 473 additions and 97 deletions

View File

@ -281,27 +281,6 @@ else
endif endif
CMDS_TARGET_SUBDIR := bin CMDS_TARGET_SUBDIR := bin
# Param 1 - dir to find debuginfo files in
FindDebuginfoFiles = \
$(wildcard $(addprefix $1/*, $(DEBUGINFO_SUFFIXES)) \
$(addprefix $1/*/*, $(DEBUGINFO_SUFFIXES)) \
$(addprefix $1/*/*/*, $(DEBUGINFO_SUFFIXES)))
# Pick the correct debug info files to copy, either zipped or not.
ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), true)
DEBUGINFO_SUFFIXES += .diz
else
DEBUGINFO_SUFFIXES := .debuginfo .pdb .map
# On Macosx, if debug symbols have not been zipped, find all files inside *.dSYM
# dirs.
ifeq ($(call isTargetOs, macosx), true)
$(call FillFindCache, \
$(SUPPORT_OUTPUTDIR)/modules_libs $(SUPPORT_OUTPUTDIR)/modules_cmds)
FindDebuginfoFiles = \
$(if $(wildcard $1), $(call containing, .dSYM/, $(call FindFiles, $1)))
endif
endif
# Param 1 - either JDK or JRE # Param 1 - either JDK or JRE
SetupCopyDebuginfo = \ SetupCopyDebuginfo = \
$(foreach m, $(ALL_$1_MODULES), \ $(foreach m, $(ALL_$1_MODULES), \

View File

@ -454,6 +454,18 @@ $(eval $(call SetupTarget, symbols-image, \
TARGET := symbols, \ TARGET := symbols, \
)) ))
$(eval $(call SetupTarget, static-launcher, \
MAKEFILE := StaticLibs, \
TARGET := static-launcher, \
DEPS := hotspot-static-libs static-libs, \
))
$(eval $(call SetupTarget, static-jdk-image, \
MAKEFILE := StaticLibs, \
TARGET := static-jdk-image, \
DEPS := static-exploded-image jdk-image, \
))
$(eval $(call SetupTarget, static-libs-image, \ $(eval $(call SetupTarget, static-libs-image, \
MAKEFILE := StaticLibsImage, \ MAKEFILE := StaticLibsImage, \
TARGET := static-libs-image, \ TARGET := static-libs-image, \
@ -1086,9 +1098,9 @@ else
symbols-image: $(LIBS_TARGETS) $(LAUNCHER_TARGETS) symbols-image: $(LIBS_TARGETS) $(LAUNCHER_TARGETS)
static-libs-image: hotspot-static-libs $(STATIC_LIBS_TARGETS) static-libs-image: hotspot-static-libs static-libs
static-libs-graal-image: $(STATIC_LIBS_TARGETS) static-libs-graal-image: static-libs
bootcycle-images: jdk-image bootcycle-images: jdk-image
@ -1254,6 +1266,8 @@ ifeq ($(call isTargetOs, macosx), true)
legacy-images: mac-legacy-jre-bundle legacy-images: mac-legacy-jre-bundle
endif endif
static-exploded-image: static-launcher exploded-image
# These targets build the various documentation images # These targets build the various documentation images
docs-jdk-image: docs-jdk docs-jdk-image: docs-jdk
docs-javase-image: docs-javase docs-javase-image: docs-javase
@ -1296,7 +1310,7 @@ endif
################################################################################ ################################################################################
# all-images builds all our deliverables as images. # all-images builds all our deliverables as images.
all-images: product-images test-image all-docs-images all-images: product-images static-jdk-image test-image all-docs-images
# all-bundles packages all our deliverables as tar.gz bundles. # all-bundles packages all our deliverables as tar.gz bundles.
all-bundles: product-bundles test-bundles docs-bundles static-libs-bundles all-bundles: product-bundles test-bundles docs-bundles static-libs-bundles
@ -1309,7 +1323,7 @@ ALL_TARGETS += buildtools hotspot hotspot-libs hotspot-static-libs \
create-buildjdk docs-jdk-api docs-javase-api docs-reference-api docs-jdk \ create-buildjdk docs-jdk-api docs-javase-api docs-reference-api docs-jdk \
docs-javase docs-reference docs-javadoc mac-bundles product-images legacy-images \ docs-javase docs-reference docs-javadoc mac-bundles product-images legacy-images \
docs-image docs-javase-image docs-reference-image all-docs-images \ docs-image docs-javase-image docs-reference-image all-docs-images \
docs-bundles all-docs-bundles test-image all-images \ docs-bundles all-docs-bundles test-image all-images static-exploded-image \
all-bundles all-bundles
################################################################################ ################################################################################

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -45,6 +45,23 @@ TARGETS :=
# Include the file being wrapped. # Include the file being wrapped.
include $(MAKEFILE_PREFIX).gmk include $(MAKEFILE_PREFIX).gmk
ifeq ($(MAKEFILE_PREFIX), Lib)
# We need to keep track of what libraries are generated/needed by this
# module. This information is required when doing static linking, to know
# which static library files to include. The variable $(MODULE)_INCLUDED_LIBS is
# added to for each call to SetupJdkLibrary. The file module-included-libs.txt is then
# read in StaticLibs.gmk.
ifneq ($($(MODULE)_JDK_LIBS), )
LIBLIST := $(SUPPORT_OUTPUTDIR)/modules_static-libs/$(MODULE)/module-included-libs.txt
$(LIBLIST): $(TARGETS)
$(call MakeDir, $(@D))
$(ECHO) $($(MODULE)_INCLUDED_LIBS) > $@
TARGETS += $(LIBLIST)
endif
endif
# Setup copy rules from the modules directories to the jdk image directory. # Setup copy rules from the modules directories to the jdk image directory.
ifeq ($(call isTargetOs, windows), true) ifeq ($(call isTargetOs, windows), true)
TO_BIN_FILTER := %$(SHARED_LIBRARY_SUFFIX) %.diz %.pdb %.map TO_BIN_FILTER := %$(SHARED_LIBRARY_SUFFIX) %.diz %.pdb %.map

191
make/StaticLibs.gmk Normal file
View File

@ -0,0 +1,191 @@
#
# Copyright (c) 2024, 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
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
default: all
include $(SPEC)
include MakeBase.gmk
include CopyFiles.gmk
include Modules.gmk
include modules/LauncherCommon.gmk
################################################################################
#
# Create the static java launcher
#
################################################################################
STATIC_JDK_IMAGE_DIR := $(IMAGES_OUTPUTDIR)/static-jdk
STATIC_LAUNCHER_OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/static-native/launcher
HOTSPOT_STATIC_LIB_PATH := $(HOTSPOT_OUTPUTDIR)/*/libjvm/objs/static
ifneq ($(word 2, $(wildcard $(HOTSPOT_STATIC_LIB_PATH))), )
$(error Cannot perform static linking when building more than one JVM library)
endif
# Find all modules with static libraries
STATIC_LIB_MODULES := $(patsubst $(SUPPORT_OUTPUTDIR)/modules_static-libs/%, \
%, $(wildcard $(SUPPORT_OUTPUTDIR)/modules_static-libs/*))
# Filter out known broken libraries. This is a temporary measure until
# proper support for these libraries can be provided.
ifeq ($(call isTargetOs, linux), true)
# libsplashscreen has a name conflict with libawt in the function
# BitmapToYXBandedRectangles, so we exclude it for now.
BROKEN_STATIC_LIBS += splashscreen
else ifeq ($(call isTargetOs, macosx), true)
# libosxsecurity has a name conflict with libosxapp in the function
# JavaStringToNSString, so we exclude it for now.
BROKEN_STATIC_LIBS += osxsecurity
else ifeq ($(call isTargetOs, windows), true)
# libsplashscreen has a name conflict with libawt in the function
# BitmapToYXBandedRectangles, so we exclude it for now.
BROKEN_STATIC_LIBS += splashscreen
# libsspi_bridge has name conflicts with sunmscapi
BROKEN_STATIC_LIBS += sspi_bridge
# These libs define DllMain which conflict with Hotspot
BROKEN_STATIC_LIBS += awt dt_shmem dt_socket
# These libs are dependent on any of the above disabled libs
BROKEN_STATIC_LIBS += fontmanager jawt lcms net nio
endif
$(foreach module, $(STATIC_LIB_MODULES), \
$(eval LIBS_$(module) := $(filter-out $(BROKEN_STATIC_LIBS), $(shell cat \
$(SUPPORT_OUTPUTDIR)/modules_static-libs/$(module)/module-included-libs.txt))) \
)
STATIC_LIB_FILES := $(foreach module, $(STATIC_LIB_MODULES), \
$(foreach lib, $(LIBS_$(module)), \
$(SUPPORT_OUTPUTDIR)/native/$(module)/lib$(lib)/static/$(LIBRARY_PREFIX)$(lib)$(STATIC_LIBRARY_SUFFIX)))
# Add Hotspot
STATIC_LIB_FILES += $(wildcard $(HOTSPOT_STATIC_LIB_PATH)/$(LIBRARY_PREFIX)jvm$(STATIC_LIBRARY_SUFFIX))
# Figure out what external libraries are required to link these static JDK
# libraries.
LIB_FLAGS_FILES := $(addsuffix .lib-flags.txt, $(STATIC_LIB_FILES))
# Gather the lib flags from all individual libraries. There are many duplicates,
# so sort and just keep unique instances. On macOS, a common pattern is
# "-framework FooFramework", so we must make sure we keep the two words together.
EXTERNAL_LIBS := $(strip $(shell $(CAT) $(LIB_FLAGS_FILES) | \
$(SED) -e 's/-framework /-framework_/g' | $(TR) ' ' '\n' | $(SORT) -u | \
$(SED) -e 's/-framework_/-framework /g'))
ifeq ($(call isTargetOs, macosx), true)
STATIC_LIBS := $(addprefix -force_load$(SPACE), $(STATIC_LIB_FILES))
STANDARD_LIBS += -lstdc++
else ifeq ($(call isTargetOs, linux), true)
STATIC_LIBS := -Wl,--export-dynamic -Wl,--whole-archive $(STATIC_LIB_FILES) -Wl,--no-whole-archive
STANDARD_LIBS := -l:libstdc++.a
else ifeq ($(call isTargetOs, windows), true)
STATIC_LIBS := $(addprefix -wholearchive:, $(STATIC_LIB_FILES))
else
$(error Unsupported platform)
endif
$(eval $(call SetupBuildLauncher, java, \
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS -DENABLE_ARG_FILES, \
EXTRA_RCFLAGS := $(JAVA_RCFLAGS), \
VERSION_INFO_RESOURCE := $(JAVA_VERSION_INFO_RESOURCE), \
OPTIMIZATION := HIGH, \
STATIC_LAUNCHER := true, \
LDFLAGS := $(LDFLAGS_STATIC_JDK), \
LIBS := $(STATIC_LIBS) $(EXTERNAL_LIBS) $(STANDARD_LIBS), \
OUTPUT_DIR := $(STATIC_LAUNCHER_OUTPUT_DIR), \
OBJECT_DIR := $(STATIC_LAUNCHER_OUTPUT_DIR), \
))
$(java): $(STATIC_LIB_FILES)
TARGETS += $(java)
JAVA_LAUNCHER := $(BUILD_LAUNCHER_java_TARGET)
static-launcher: $(java)
################################################################################
#
# Create the static-jdk image with the statically built java launcher
#
################################################################################
# Until we get proper support in jlink for generating an image with static
# builds, we need to create the image ourselves. We base it on a normal
# dynamically linked JDK image.
# All these files/dirs should be copied as-is
JDK_IMAGE_COPY_FILES := $(addprefix $(JDK_IMAGE_DIR)/, conf demo include jmods \
legal man/man1/java.1 release README)
# We need to copy some files from lib, but not the dynamic libraries themselves
ALL_LIB_FILES := $(call FindFiles, $(JDK_IMAGE_DIR)/lib)
# Remove all dynamic libraries from the list
JDK_IMAGE_COPY_LIB_FILES := $(filter-out %$(SHARED_LIBRARY_SUFFIX), $(ALL_LIB_FILES))
# Remove all debug files from the list
ifeq ($(call isTargetOs, macosx), true)
JDK_IMAGE_COPY_LIB_FILES := $(call not-containing, .dSYM, $(JDK_IMAGE_COPY_LIB_FILES))
else
JDK_IMAGE_COPY_LIB_FILES := $(filter-out %.debuginfo %.pdb %.map, $(JDK_IMAGE_COPY_LIB_FILES))
endif
static-jdk-info:
$(call LogWarn, Creating static-jdk image)
$(eval $(call SetupCopyFiles, copy-from-jdk-image, \
SRC := $(JDK_IMAGE_DIR), \
DEST := $(STATIC_JDK_IMAGE_DIR), \
FILES := $(call FindFiles, $(JDK_IMAGE_COPY_FILES)) \
$(JDK_IMAGE_COPY_LIB_FILES), \
))
TARGETS += $(copy-from-jdk-image)
$(copy-from-jdk-image): | static-jdk-info
$(eval $(call SetupCopyFiles, copy-static-launcher, \
FILES := $(JAVA_LAUNCHER), \
DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \
))
TARGETS += $(copy-static-launcher)
$(eval $(call SetupCopyFiles, copy-static-launcher-debuginfo, \
SRC := $(STATIC_LAUNCHER_OUTPUT_DIR), \
DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \
FILES := $(call FindDebuginfoFiles, $(STATIC_LAUNCHER_OUTPUT_DIR)), \
))
TARGETS += $(copy-static-launcher-debuginfo)
static-jdk-image: $(copy-from-jdk-image) $(copy-static-launcher) $(copy-static-launcher-debuginfo)
TARGETS += static-jdk-image
all: $(TARGETS)
.PHONY: all static-launcher static-jdk-image

View File

@ -192,18 +192,23 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_CPU_DEP],
# Export variables according to old definitions, prefix with $2 if present. # Export variables according to old definitions, prefix with $2 if present.
LDFLAGS_JDK_COMMON="$BASIC_LDFLAGS $BASIC_LDFLAGS_JDK_ONLY \ LDFLAGS_JDK_COMMON="$BASIC_LDFLAGS $BASIC_LDFLAGS_JDK_ONLY \
$OS_LDFLAGS $DEBUGLEVEL_LDFLAGS_JDK_ONLY ${$2EXTRA_LDFLAGS}" $OS_LDFLAGS $DEBUGLEVEL_LDFLAGS_JDK_ONLY ${$2EXTRA_LDFLAGS}"
$2LDFLAGS_JDKLIB="$LDFLAGS_JDK_COMMON $BASIC_LDFLAGS_JDK_LIB_ONLY \ $2LDFLAGS_JDKLIB="$LDFLAGS_JDK_COMMON \
$SHARED_LIBRARY_FLAGS $REPRODUCIBLE_LDFLAGS $FILE_MACRO_LDFLAGS" $SHARED_LIBRARY_FLAGS $REPRODUCIBLE_LDFLAGS $FILE_MACRO_LDFLAGS"
$2LDFLAGS_JDKEXE="$LDFLAGS_JDK_COMMON $EXECUTABLE_LDFLAGS \ $2LDFLAGS_JDKEXE="$LDFLAGS_JDK_COMMON $EXECUTABLE_LDFLAGS \
${$1_CPU_EXECUTABLE_LDFLAGS} $REPRODUCIBLE_LDFLAGS $FILE_MACRO_LDFLAGS" ${$1_CPU_EXECUTABLE_LDFLAGS} $REPRODUCIBLE_LDFLAGS $FILE_MACRO_LDFLAGS"
$2LDFLAGS_STATIC_JDK="$BASIC_LDFLAGS $BASIC_LDFLAGS_JVM_ONLY \
$OS_LDFLAGS ${$2EXTRA_LDFLAGS} $REPRODUCIBLE_LDFLAGS $FILE_MACRO_LDFLAGS"
$2JVM_LDFLAGS="$BASIC_LDFLAGS $BASIC_LDFLAGS_JVM_ONLY $OS_LDFLAGS $OS_LDFLAGS_JVM_ONLY \ $2JVM_LDFLAGS="$BASIC_LDFLAGS $BASIC_LDFLAGS_JVM_ONLY $OS_LDFLAGS $OS_LDFLAGS_JVM_ONLY \
$DEBUGLEVEL_LDFLAGS $DEBUGLEVEL_LDFLAGS_JVM_ONLY $BASIC_LDFLAGS_ONLYCXX \ $DEBUGLEVEL_LDFLAGS $DEBUGLEVEL_LDFLAGS_JVM_ONLY \
${$1_CPU_LDFLAGS} ${$1_CPU_LDFLAGS_JVM_ONLY} ${$2EXTRA_LDFLAGS} \ ${$1_CPU_LDFLAGS} ${$1_CPU_LDFLAGS_JVM_ONLY} ${$2EXTRA_LDFLAGS} \
$REPRODUCIBLE_LDFLAGS $FILE_MACRO_LDFLAGS" $REPRODUCIBLE_LDFLAGS $FILE_MACRO_LDFLAGS"
AC_SUBST($2LDFLAGS_JDKLIB) AC_SUBST($2LDFLAGS_JDKLIB)
AC_SUBST($2LDFLAGS_JDKEXE) AC_SUBST($2LDFLAGS_JDKEXE)
AC_SUBST($2LDFLAGS_STATIC_JDK)
AC_SUBST($2JVM_LDFLAGS) AC_SUBST($2JVM_LDFLAGS)
]) ])

View File

@ -369,6 +369,7 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_CODE_COVERAGE],
CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $GCOV_CFLAGS" CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $GCOV_CFLAGS"
LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $GCOV_LDFLAGS" LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $GCOV_LDFLAGS"
LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $GCOV_LDFLAGS" LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $GCOV_LDFLAGS"
LDFLAGS_STATIC_JDK="$LDFLAGS_STATIC_JDK $GCOV_LDFLAGS"
]) ])
AC_SUBST(GCOV_ENABLED) AC_SUBST(GCOV_ENABLED)
@ -463,6 +464,7 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_ADDRESS_SANITIZER],
CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $ASAN_CFLAGS" CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $ASAN_CFLAGS"
LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $ASAN_LDFLAGS" LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $ASAN_LDFLAGS"
LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $ASAN_LDFLAGS" LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $ASAN_LDFLAGS"
LDFLAGS_STATIC_JDK="$LDFLAGS_STATIC_JDK $ASAN_LDFLAGS"
]) ])
AC_SUBST(ASAN_ENABLED) AC_SUBST(ASAN_ENABLED)
]) ])
@ -496,6 +498,7 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_LEAK_SANITIZER],
CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $LSAN_CFLAGS" CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $LSAN_CFLAGS"
LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $LSAN_LDFLAGS" LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $LSAN_LDFLAGS"
LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $LSAN_LDFLAGS" LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $LSAN_LDFLAGS"
LDFLAGS_STATIC_JDK="$LDFLAGS_STATIC_JDK $LSAN_LDFLAGS"
]) ])
AC_SUBST(LSAN_ENABLED) AC_SUBST(LSAN_ENABLED)
]) ])
@ -538,6 +541,7 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_UNDEFINED_BEHAVIOR_SANITIZER],
CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $UBSAN_CFLAGS" CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $UBSAN_CFLAGS"
LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $UBSAN_LDFLAGS" LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $UBSAN_LDFLAGS"
LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $UBSAN_LDFLAGS" LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $UBSAN_LDFLAGS"
LDFLAGS_STATIC_JDK="$LDFLAGS_STATIC_JDK $UBSAN_LDFLAGS"
]) ])
if test "x$UBSAN_ENABLED" = xfalse; then if test "x$UBSAN_ENABLED" = xfalse; then
UBSAN_CFLAGS="" UBSAN_CFLAGS=""

View File

@ -559,6 +559,9 @@ LDFLAGS_JDKLIB := @LDFLAGS_JDKLIB@
# LDFLAGS used to link the jdk native launchers (C-code) # LDFLAGS used to link the jdk native launchers (C-code)
LDFLAGS_JDKEXE := @LDFLAGS_JDKEXE@ LDFLAGS_JDKEXE := @LDFLAGS_JDKEXE@
# LDFLAGS used to link the static jdk library
LDFLAGS_STATIC_JDK := @LDFLAGS_STATIC_JDK@
# LDFLAGS specific to C++ linking. # LDFLAGS specific to C++ linking.
LDFLAGS_CXX_JDK := @LDFLAGS_CXX_JDK@ LDFLAGS_CXX_JDK := @LDFLAGS_CXX_JDK@

View File

@ -307,3 +307,26 @@ ifeq ($(DISABLE_CACHE_FIND), true)
else else
FindFiles = $(CacheFindFiles) FindFiles = $(CacheFindFiles)
endif endif
# Find native debuginfo files in a directory
#
# Param 1 - dir to find debuginfo files in
FindDebuginfoFiles = \
$(wildcard $(addprefix $1/*, $(DEBUGINFO_SUFFIXES)) \
$(addprefix $1/*/*, $(DEBUGINFO_SUFFIXES)) \
$(addprefix $1/*/*/*, $(DEBUGINFO_SUFFIXES)))
# Pick the correct debug info files to copy, either zipped or not.
ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), true)
DEBUGINFO_SUFFIXES += .diz
else
DEBUGINFO_SUFFIXES := .debuginfo .pdb .map
# On Macosx, if debug symbols have not been zipped, find all files inside *.dSYM
# dirs.
ifeq ($(call isTargetOs, macosx), true)
$(call FillFindCache, \
$(SUPPORT_OUTPUTDIR)/modules_libs $(SUPPORT_OUTPUTDIR)/modules_cmds)
FindDebuginfoFiles = \
$(if $(wildcard $1), $(call containing, .dSYM/, $(call FindFiles, $1)))
endif
endif

View File

@ -275,6 +275,8 @@ JDK_RCFLAGS=$(RCFLAGS) \
# and EXTRA_HEADER_DIRS will be added. # and EXTRA_HEADER_DIRS will be added.
# JDK_LIBS_<os> or JDK_LIBS_<osType> -- additional JDK_LIBS for the given OS # JDK_LIBS_<os> or JDK_LIBS_<osType> -- additional JDK_LIBS for the given OS
# or OS type only # or OS type only
# ONLY_EXPORTED -- if true, this library will be flagged as not
# to be included for this module when building static libs
# EXTRA_RCFLAGS -- additional RCFLAGS to append. # EXTRA_RCFLAGS -- additional RCFLAGS to append.
# RC_FILEDESC -- override the default FILEDESC for Windows version.rc # RC_FILEDESC -- override the default FILEDESC for Windows version.rc
# DEFAULT_LIBCXX -- if false, do not add LIBCXX to LIBS for C++ compilations # DEFAULT_LIBCXX -- if false, do not add LIBCXX to LIBS for C++ compilations
@ -303,6 +305,15 @@ define SetupJdkNativeCompilationBody
$1_RC_FTYPE := 0x2L $1_RC_FTYPE := 0x2L
endif endif
ifneq ($$(MODULE), )
# Record the fact that this native library is part of the current module
# (unless told otherwise). This variable stores information about all
# created libraries, and is read by ModuleWrapper.
ifneq ($$($1_ONLY_EXPORTED), true)
$$(MODULE)_INCLUDED_LIBS += $$($1_NAME)
endif
endif
ifeq ($$($1_OUTPUT_DIR), ) ifeq ($$($1_OUTPUT_DIR), )
ifneq ($$(MODULE), ) ifneq ($$(MODULE), )
ifeq ($$($1_TYPE), STATIC_LIBRARY) ifeq ($$($1_TYPE), STATIC_LIBRARY)
@ -422,10 +433,10 @@ define SetupJdkNativeCompilationBody
ifneq ($$($1_DEFAULT_LDFLAGS), false) ifneq ($$($1_DEFAULT_LDFLAGS), false)
ifeq ($$($1_TYPE), EXECUTABLE) ifeq ($$($1_TYPE), EXECUTABLE)
# Set the default flags first to be able to override # Set the default flags first to be able to override
$1_LDFLAGS := $$(filter-out $$($1_LDFLAGS_FILTER_OUT), $$(LDFLAGS_JDKEXE)) $$($1_LDFLAGS) $1_LDFLAGS := $$(filter-out $$($1_LDFLAGS_FILTER_OUT), $$(LDFLAGS_JDKEXE) $$($1_LDFLAGS))
else else
# Set the default flags first to be able to override # Set the default flags first to be able to override
$1_LDFLAGS := $$(filter-out $$($1_LDFLAGS_FILTER_OUT), $$(LDFLAGS_JDKLIB)) $$($1_LDFLAGS) $1_LDFLAGS := $$(filter-out $$($1_LDFLAGS_FILTER_OUT), $$(LDFLAGS_JDKLIB) $$($1_LDFLAGS))
endif endif
endif endif

View File

@ -62,6 +62,7 @@ JAVA_MANIFEST := $(TOPDIR)/src/java.base/windows/native/launcher/java.manifest
# OPTIMIZATION Override default optimization level (LOW) # OPTIMIZATION Override default optimization level (LOW)
# OUTPUT_DIR Override default output directory # OUTPUT_DIR Override default output directory
# VERSION_INFO_RESOURCE Override default Windows resource file # VERSION_INFO_RESOURCE Override default Windows resource file
# STATIC_LAUNCHER If true, will use settings for building a static launcher
SetupBuildLauncher = $(NamedParamsMacroTemplate) SetupBuildLauncher = $(NamedParamsMacroTemplate)
define SetupBuildLauncherBody define SetupBuildLauncherBody
# Setup default values (unless overridden) # Setup default values (unless overridden)
@ -120,6 +121,15 @@ define SetupBuildLauncherBody
$1_EXTRA_FILES += $(TOPDIR)/make/data/lsan/lsan_default_options.c $1_EXTRA_FILES += $(TOPDIR)/make/data/lsan/lsan_default_options.c
endif endif
ifneq ($$($1_STATIC_LAUNCHER), true)
$1_JDK_LIBS := java.base:libjli
$1_JDK_LIBS_windows := java.base:libjava
else
ifneq ($(findstring $(TOOLCHAIN_TYPE), gcc clang), )
$1_LDFLAGS_FILTER_OUT := -Wl$(COMMA)--exclude-libs$(COMMA)ALL
endif
endif
############################################################################## ##############################################################################
## Build launcher "$1" ## Build launcher "$1"
############################################################################## ##############################################################################
@ -140,8 +150,9 @@ define SetupBuildLauncherBody
LDFLAGS := $$($1_LDFLAGS), \ LDFLAGS := $$($1_LDFLAGS), \
LDFLAGS_linux := $$(call SET_EXECUTABLE_ORIGIN,/../lib), \ LDFLAGS_linux := $$(call SET_EXECUTABLE_ORIGIN,/../lib), \
LDFLAGS_macosx := $$(call SET_EXECUTABLE_ORIGIN,/../lib), \ LDFLAGS_macosx := $$(call SET_EXECUTABLE_ORIGIN,/../lib), \
JDK_LIBS := java.base:libjli, \ LDFLAGS_FILTER_OUT := $$($1_LDFLAGS_FILTER_OUT), \
JDK_LIBS_windows := java.base:libjava, \ JDK_LIBS := $$($1_JDK_LIBS), \
JDK_LIBS_windows := $$($1_JDK_LIBS_windows), \
LIBS := $$($1_LIBS), \ LIBS := $$($1_LIBS), \
LIBS_unix := $(LIBZ_LIBS), \ LIBS_unix := $(LIBZ_LIBS), \
LIBS_linux := $(LIBDL) -lpthread, \ LIBS_linux := $(LIBDL) -lpthread, \
@ -150,6 +161,7 @@ define SetupBuildLauncherBody
-framework Cocoa \ -framework Cocoa \
-framework Security, \ -framework Security, \
OUTPUT_DIR := $$($1_OUTPUT_DIR), \ OUTPUT_DIR := $$($1_OUTPUT_DIR), \
OBJECT_DIR := $$($1_OBJECT_DIR), \
VERSIONINFO_RESOURCE := $$($1_VERSION_INFO_RESOURCE), \ VERSIONINFO_RESOURCE := $$($1_VERSION_INFO_RESOURCE), \
EXTRA_RCFLAGS := $$($1_EXTRA_RCFLAGS), \ EXTRA_RCFLAGS := $$($1_EXTRA_RCFLAGS), \
MANIFEST := $(JAVA_MANIFEST), \ MANIFEST := $(JAVA_MANIFEST), \

View File

@ -119,6 +119,7 @@ define CreateStaticLibrary
$(if $$($1_LINK_OBJS_RELATIVE), $$(CD) $$(OUTPUTDIR) ; ) \ $(if $$($1_LINK_OBJS_RELATIVE), $$(CD) $$(OUTPUTDIR) ; ) \
$$($1_AR) $$(ARFLAGS) -r -cs $$($1_TARGET) \ $$($1_AR) $$(ARFLAGS) -r -cs $$($1_TARGET) \
$$($1_AR_OBJ_ARG) $$($1_RES)) $$($1_AR_OBJ_ARG) $$($1_RES))
$$(ECHO) $$(strip $$($1_LIBS) $$($1_EXTRA_LIBS)) > $$($1_TARGET).lib-flags.txt
endef endef
################################################################################ ################################################################################

View File

@ -54,7 +54,8 @@ define CreateStaticLibraryMicrosoft
$$(call MakeDir, $$($1_OUTPUT_DIR) $$($1_SYMBOLS_DIR)) $$(call MakeDir, $$($1_OUTPUT_DIR) $$($1_SYMBOLS_DIR))
$$(call ExecuteWithLog, $$($1_OBJECT_DIR)/$$($1_SAFE_NAME)_run_lib, \ $$(call ExecuteWithLog, $$($1_OBJECT_DIR)/$$($1_SAFE_NAME)_run_lib, \
$$($1_LIB) -nologo $$(LIBFLAGS) -out:$$($1_TARGET) \ $$($1_LIB) -nologo $$(LIBFLAGS) -out:$$($1_TARGET) \
$$($1_LD_OBJ_ARG) $$($1_RES)) $$($1_LD_OBJ_ARG))
$$(ECHO) $$(strip $$($1_LIBS) $$($1_EXTRA_LIBS)) > $$($1_TARGET).lib-flags.txt
endef endef
################################################################################ ################################################################################

View File

@ -168,10 +168,16 @@ ifeq ($(call isTargetOs, windows macosx), false)
# static libraries cause linking errors due to duplicate symbols. # static libraries cause linking errors due to duplicate symbols.
LIBAWT_HEADLESS_STATIC_EXCLUDE_OBJS := systemScale.o LIBAWT_HEADLESS_STATIC_EXCLUDE_OBJS := systemScale.o
ifneq ($(ENABLE_HEADLESS_ONLY), true)
# We cannot link with both awt_headless and awt_xawt at the same time
LIBAWT_HEADLESS_ONLY_EXPORTED := true
endif
$(eval $(call SetupJdkLibrary, BUILD_LIBAWT_HEADLESS, \ $(eval $(call SetupJdkLibrary, BUILD_LIBAWT_HEADLESS, \
NAME := awt_headless, \ NAME := awt_headless, \
EXTRA_SRC := $(LIBAWT_HEADLESS_EXTRA_SRC), \ EXTRA_SRC := $(LIBAWT_HEADLESS_EXTRA_SRC), \
EXCLUDES := medialib, \ EXCLUDES := medialib, \
ONLY_EXPORTED := $(LIBAWT_HEADLESS_ONLY_EXPORTED), \
OPTIMIZATION := LOW, \ OPTIMIZATION := LOW, \
CFLAGS := -DHEADLESS=true $(CUPS_CFLAGS) $(FONTCONFIG_CFLAGS) \ CFLAGS := -DHEADLESS=true $(CUPS_CFLAGS) $(FONTCONFIG_CFLAGS) \
$(X_CFLAGS), \ $(X_CFLAGS), \
@ -308,6 +314,8 @@ ifeq ($(call isTargetOs, macosx), true)
LIBAWT_LWAWT_EXCLUDE_FILES := fontpath.c awt_Font.c X11Color.c LIBAWT_LWAWT_EXCLUDE_FILES := fontpath.c awt_Font.c X11Color.c
LIBAWT_LWAWT_EXCLUDES := $(TOPDIR)/src/$(MODULE)/unix/native/common/awt/medialib LIBAWT_LWAWT_EXCLUDES := $(TOPDIR)/src/$(MODULE)/unix/native/common/awt/medialib
LIBAWT_LWAWT_STATIC_EXCLUDE_OBJS := systemScale.o
$(eval $(call SetupJdkLibrary, BUILD_LIBAWT_LWAWT, \ $(eval $(call SetupJdkLibrary, BUILD_LIBAWT_LWAWT, \
NAME := awt_lwawt, \ NAME := awt_lwawt, \
EXTRA_SRC := $(LIBAWT_LWAWT_EXTRA_SRC), \ EXTRA_SRC := $(LIBAWT_LWAWT_EXTRA_SRC), \
@ -346,6 +354,7 @@ ifeq ($(call isTargetOs, macosx), true)
-framework OpenGL \ -framework OpenGL \
-framework QuartzCore \ -framework QuartzCore \
-framework Security, \ -framework Security, \
STATIC_LIB_EXCLUDE_OBJS := $(LIBAWT_LWAWT_STATIC_EXCLUDE_OBJS), \
)) ))
TARGETS += $(BUILD_LIBAWT_LWAWT) TARGETS += $(BUILD_LIBAWT_LWAWT)

View File

@ -155,6 +155,9 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
ifeq ($(USE_EXTERNAL_LIBJPEG), false) ifeq ($(USE_EXTERNAL_LIBJPEG), false)
LIBSPLASHSCREEN_EXTRA_SRC += libjavajpeg LIBSPLASHSCREEN_EXTRA_SRC += libjavajpeg
LIBJAVA_JPEG_OBJS := $(sort $(patsubst %.c,%.o, $(filter-out imageioJPEG.c, \
$(notdir $(wildcard $(TOPDIR)/src/java.desktop/share/native/libjavajpeg/*.c)))))
LIBSPLASHSCREEN_STATIC_LIB_EXCLUDE_OBJS += $(LIBJAVA_JPEG_OBJS)
endif endif
ifeq ($(USE_EXTERNAL_LIBPNG), false) ifeq ($(USE_EXTERNAL_LIBPNG), false)
@ -165,6 +168,10 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
ifeq ($(USE_EXTERNAL_LIBZ), false) ifeq ($(USE_EXTERNAL_LIBZ), false)
LIBSPLASHSCREEN_EXTRA_SRC += java.base:libzip/zlib LIBSPLASHSCREEN_EXTRA_SRC += java.base:libzip/zlib
LIBZIP_SRC_PATH := $(TOPDIR)/src/java.base/share/native/libzip
LIBZIP_OBJS := $(sort $(patsubst %.c,%.o, $(notdir \
$(wildcard $(LIBZIP_SRC_PATH)/*.c $(LIBZIP_SRC_PATH)/zlib/*.c))))
LIBSPLASHSCREEN_STATIC_LIB_EXCLUDE_OBJS += $(LIBZIP_OBJS)
endif endif
LIBSPLASHSCREEN_CFLAGS += -DSPLASHSCREEN -DPNG_NO_MMX_CODE \ LIBSPLASHSCREEN_CFLAGS += -DSPLASHSCREEN -DPNG_NO_MMX_CODE \
@ -207,6 +214,8 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 $(X_CFLAGS) LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 $(X_CFLAGS)
endif endif
LIBSPLASHSCREEN_STATIC_LIB_EXCLUDE_OBJS += systemScale.o
$(eval $(call SetupJdkLibrary, BUILD_LIBSPLASHSCREEN, \ $(eval $(call SetupJdkLibrary, BUILD_LIBSPLASHSCREEN, \
NAME := splashscreen, \ NAME := splashscreen, \
EXTRA_SRC := $(LIBSPLASHSCREEN_EXTRA_SRC), \ EXTRA_SRC := $(LIBSPLASHSCREEN_EXTRA_SRC), \
@ -257,6 +266,7 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
-framework Security, \ -framework Security, \
LIBS_aix := $(LIBDL) -liconv $(X_LIBS) -lX11 -lXext, \ LIBS_aix := $(LIBDL) -liconv $(X_LIBS) -lX11 -lXext, \
LIBS_windows := delayimp.lib gdi32.lib kernel32.lib user32.lib, \ LIBS_windows := delayimp.lib gdi32.lib kernel32.lib user32.lib, \
STATIC_LIB_EXCLUDE_OBJS := $(LIBSPLASHSCREEN_STATIC_LIB_EXCLUDE_OBJS), \
)) ))
TARGETS += $(BUILD_LIBSPLASHSCREEN) TARGETS += $(BUILD_LIBSPLASHSCREEN)

View File

@ -38,6 +38,7 @@ ifeq ($(call isTargetOs, windows), true)
NAME := javaaccessbridge, \ NAME := javaaccessbridge, \
EXTRA_SRC := common, \ EXTRA_SRC := common, \
OPTIMIZATION := LOW, \ OPTIMIZATION := LOW, \
ONLY_EXPORTED := true, \
DISABLED_WARNINGS_microsoft := 4311 4302 4312, \ DISABLED_WARNINGS_microsoft := 4311 4302 4312, \
CXXFLAGS_FILTER_OUT := -MD, \ CXXFLAGS_FILTER_OUT := -MD, \
CXXFLAGS := -MT -DACCESSBRIDGE_ARCH_64, \ CXXFLAGS := -MT -DACCESSBRIDGE_ARCH_64, \
@ -67,6 +68,7 @@ ifeq ($(call isTargetOs, windows), true)
CXXFLAGS := -DACCESSBRIDGE_ARCH_64, \ CXXFLAGS := -DACCESSBRIDGE_ARCH_64, \
EXTRA_HEADER_DIRS := \ EXTRA_HEADER_DIRS := \
include/bridge, \ include/bridge, \
ONLY_EXPORTED := true, \
LDFLAGS := \ LDFLAGS := \
-def:$(ACCESSIBILITY_SRCDIR)/libwindowsaccessbridge/WinAccessBridge.DEF, \ -def:$(ACCESSIBILITY_SRCDIR)/libwindowsaccessbridge/WinAccessBridge.DEF, \
LIBS_windows := advapi32.lib comdlg32.lib gdi32.lib kernel32.lib \ LIBS_windows := advapi32.lib comdlg32.lib gdi32.lib kernel32.lib \

View File

@ -49,6 +49,7 @@ $(eval $(call SetupJdkExecutable, BUILD_JPACKAGEAPPLAUNCHER, \
LINK_TYPE := $(JPACKAGEAPPLAUNCHER_LINK_TYPE), \ LINK_TYPE := $(JPACKAGEAPPLAUNCHER_LINK_TYPE), \
OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \ OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \
SYMBOLS_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/jpackageapplauncher, \ SYMBOLS_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/jpackageapplauncher, \
ONLY_EXPORTED := true, \
SRC := applauncher, \ SRC := applauncher, \
EXTRA_SRC := common, \ EXTRA_SRC := common, \
INCLUDE_FILES := $(JPACKAGEAPPLAUNCHER_INCLUDE_FILES), \ INCLUDE_FILES := $(JPACKAGEAPPLAUNCHER_INCLUDE_FILES), \
@ -83,6 +84,7 @@ ifeq ($(call isTargetOs, linux), true)
OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \ OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \
SYMBOLS_DIR := \ SYMBOLS_DIR := \
$(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libjpackageapplauncheraux, \ $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libjpackageapplauncheraux, \
ONLY_EXPORTED := true, \
SRC := libapplauncher, \ SRC := libapplauncher, \
EXTRA_SRC := \ EXTRA_SRC := \
applauncher \ applauncher \
@ -127,6 +129,7 @@ ifeq ($(call isTargetOs, windows), true)
NAME := wixhelper, \ NAME := wixhelper, \
OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \ OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \
SYMBOLS_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libwixhelper, \ SYMBOLS_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libwixhelper, \
ONLY_EXPORTED := true, \
OPTIMIZATION := LOW, \ OPTIMIZATION := LOW, \
EXTRA_SRC := common, \ EXTRA_SRC := common, \
CXXFLAGS_FILTER_OUT := -MD, \ CXXFLAGS_FILTER_OUT := -MD, \
@ -146,6 +149,7 @@ ifeq ($(call isTargetOs, windows), true)
NAME := msiwrapper, \ NAME := msiwrapper, \
OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \ OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \
SYMBOLS_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/msiwrapper, \ SYMBOLS_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/msiwrapper, \
ONLY_EXPORTED := true, \
EXTRA_SRC := common, \ EXTRA_SRC := common, \
CXXFLAGS_FILTER_OUT := -MD, \ CXXFLAGS_FILTER_OUT := -MD, \
CXXFLAGS_windows := -MT $(JPACKAGE_CXXFLAGS_windows), \ CXXFLAGS_windows := -MT $(JPACKAGE_CXXFLAGS_windows), \
@ -164,6 +168,7 @@ ifeq ($(call isTargetOs, windows), true)
OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \ OUTPUT_DIR := $(JPACKAGE_OUTPUT_DIR), \
SYMBOLS_DIR := \ SYMBOLS_DIR := \
$(SUPPORT_OUTPUTDIR)/native/$(MODULE)/jpackageapplauncherw, \ $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/jpackageapplauncherw, \
ONLY_EXPORTED := true, \
SRC := applauncher, \ SRC := applauncher, \
EXTRA_SRC := common, \ EXTRA_SRC := common, \
OPTIMIZATION := LOW, \ OPTIMIZATION := LOW, \

View File

@ -562,6 +562,7 @@ void os::init_system_properties_values() {
// Base path of extensions installed on the system. // Base path of extensions installed on the system.
#define SYS_EXT_DIR "/usr/java/packages" #define SYS_EXT_DIR "/usr/java/packages"
#define EXTENSIONS_DIR "/lib/ext" #define EXTENSIONS_DIR "/lib/ext"
#define JVM_LIB_NAME "libjvm.so"
// Buffer that fits several snprintfs. // Buffer that fits several snprintfs.
// Note that the space for the colon and the trailing null are provided // Note that the space for the colon and the trailing null are provided
@ -576,22 +577,32 @@ void os::init_system_properties_values() {
char *pslash; char *pslash;
os::jvm_path(buf, bufsize); os::jvm_path(buf, bufsize);
// Found the full path to libjvm.so. // Found the full path to the binary. It is normally of this structure:
// Now cut the path to <java_home>/jre if we can. // <jdk_path>/lib/<hotspot_variant>/libjvm.so
// but can also be like this for a statically linked binary:
// <jdk_path>/bin/<executable>
pslash = strrchr(buf, '/'); pslash = strrchr(buf, '/');
if (pslash != nullptr) { if (pslash != nullptr) {
*pslash = '\0'; // Get rid of /libjvm.so. if (strncmp(pslash + 1, JVM_LIB_NAME, strlen(JVM_LIB_NAME)) == 0) {
} // Binary name is libjvm.so. Get rid of /libjvm.so.
pslash = strrchr(buf, '/'); *pslash = '\0';
if (pslash != nullptr) { }
*pslash = '\0'; // Get rid of /{client|server|hotspot}.
// Get rid of /<hotspot_variant>, if binary is libjvm.so,
// or cut off /<executable>, if it is a statically linked binary.
pslash = strrchr(buf, '/');
if (pslash != nullptr) {
*pslash = '\0';
}
} }
Arguments::set_dll_dir(buf); Arguments::set_dll_dir(buf);
// Get rid of /lib, if binary is libjvm.so,
// or cut off /bin, if it is a statically linked binary.
if (pslash != nullptr) { if (pslash != nullptr) {
pslash = strrchr(buf, '/'); pslash = strrchr(buf, '/');
if (pslash != nullptr) { if (pslash != nullptr) {
*pslash = '\0'; // Get rid of /lib. *pslash = '\0';
} }
} }
Arguments::set_java_home(buf); Arguments::set_java_home(buf);

View File

@ -854,6 +854,12 @@ void os::dll_unload(void *lib) {
LINUX_ONLY(os::free(l_pathdup)); LINUX_ONLY(os::free(l_pathdup));
} }
void* os::lookup_function(const char* name) {
// This returns the global symbol in the main executable and its dependencies,
// as well as shared objects dynamically loaded with RTLD_GLOBAL flag.
return dlsym(RTLD_DEFAULT, name);
}
jlong os::lseek(int fd, jlong offset, int whence) { jlong os::lseek(int fd, jlong offset, int whence) {
return (jlong) ::lseek(fd, offset, whence); return (jlong) ::lseek(fd, offset, whence);
} }

View File

@ -1401,6 +1401,12 @@ void* os::dll_lookup(void *lib, const char *name) {
return ret; return ret;
} }
void* os::lookup_function(const char* name) {
// This is needed only for static builds which are not supported on Windows
ShouldNotReachHere();
return nullptr; // Satisfy compiler
}
// Directory routines copied from src/win32/native/java/io/dirent_md.c // Directory routines copied from src/win32/native/java/io/dirent_md.c
// * dirent_md.c 1.15 00/02/02 // * dirent_md.c 1.15 00/02/02
// //

View File

@ -949,16 +949,35 @@ void* ClassLoader::dll_lookup(void* lib, const char* name, const char* path) {
void ClassLoader::load_java_library() { void ClassLoader::load_java_library() {
assert(CanonicalizeEntry == nullptr, "should not load java library twice"); assert(CanonicalizeEntry == nullptr, "should not load java library twice");
if (is_vm_statically_linked()) {
CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, os::lookup_function("JDK_Canonicalize"));
assert(CanonicalizeEntry != nullptr, "could not lookup JDK_Canonicalize");
return;
}
void *javalib_handle = os::native_java_library(); void *javalib_handle = os::native_java_library();
if (javalib_handle == nullptr) { if (javalib_handle == nullptr) {
vm_exit_during_initialization("Unable to load java library", nullptr); vm_exit_during_initialization("Unable to load java library", nullptr);
} }
CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, dll_lookup(javalib_handle, "JDK_Canonicalize", nullptr)); CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, dll_lookup(javalib_handle, "JDK_Canonicalize", nullptr));
assert(CanonicalizeEntry != nullptr, "could not lookup JDK_Canonicalize in java library");
} }
void ClassLoader::load_jimage_library() { void ClassLoader::load_jimage_library() {
assert(JImageOpen == nullptr, "should not load jimage library twice"); assert(JImageOpen == nullptr, "should not load jimage library twice");
if (is_vm_statically_linked()) {
JImageOpen = CAST_TO_FN_PTR(JImageOpen_t, os::lookup_function("JIMAGE_Open"));
JImageClose = CAST_TO_FN_PTR(JImageClose_t, os::lookup_function("JIMAGE_Close"));
JImageFindResource = CAST_TO_FN_PTR(JImageFindResource_t, os::lookup_function("JIMAGE_FindResource"));
JImageGetResource = CAST_TO_FN_PTR(JImageGetResource_t, os::lookup_function("JIMAGE_GetResource"));
assert(JImageOpen != nullptr && JImageClose != nullptr &&
JImageFindResource != nullptr && JImageGetResource != nullptr,
"could not lookup all jimage library functions");
return;
}
char path[JVM_MAXPATHLEN]; char path[JVM_MAXPATHLEN];
char ebuf[1024]; char ebuf[1024];
void* handle = nullptr; void* handle = nullptr;
@ -973,6 +992,9 @@ void ClassLoader::load_jimage_library() {
JImageClose = CAST_TO_FN_PTR(JImageClose_t, dll_lookup(handle, "JIMAGE_Close", path)); JImageClose = CAST_TO_FN_PTR(JImageClose_t, dll_lookup(handle, "JIMAGE_Close", path));
JImageFindResource = CAST_TO_FN_PTR(JImageFindResource_t, dll_lookup(handle, "JIMAGE_FindResource", path)); JImageFindResource = CAST_TO_FN_PTR(JImageFindResource_t, dll_lookup(handle, "JIMAGE_FindResource", path));
JImageGetResource = CAST_TO_FN_PTR(JImageGetResource_t, dll_lookup(handle, "JIMAGE_GetResource", path)); JImageGetResource = CAST_TO_FN_PTR(JImageGetResource_t, dll_lookup(handle, "JIMAGE_GetResource", path));
assert(JImageOpen != nullptr && JImageClose != nullptr &&
JImageFindResource != nullptr && JImageGetResource != nullptr,
"could not lookup all jimage library functions in jimage library");
} }
int ClassLoader::crc32(int crc, const char* buf, int len) { int ClassLoader::crc32(int crc, const char* buf, int len) {

View File

@ -85,15 +85,20 @@ static verify_byte_codes_fn_t verify_byte_codes_fn() {
if (_verify_byte_codes_fn != nullptr) if (_verify_byte_codes_fn != nullptr)
return _verify_byte_codes_fn; return _verify_byte_codes_fn;
void *lib_handle = nullptr;
// Load verify dll // Load verify dll
char buffer[JVM_MAXPATHLEN]; if (is_vm_statically_linked()) {
char ebuf[1024]; lib_handle = os::get_default_process_handle();
if (!os::dll_locate_lib(buffer, sizeof(buffer), Arguments::get_dll_dir(), "verify")) } else {
return nullptr; // Caller will throw VerifyError char buffer[JVM_MAXPATHLEN];
char ebuf[1024];
if (!os::dll_locate_lib(buffer, sizeof(buffer), Arguments::get_dll_dir(), "verify"))
return nullptr; // Caller will throw VerifyError
void *lib_handle = os::dll_load(buffer, ebuf, sizeof(ebuf)); lib_handle = os::dll_load(buffer, ebuf, sizeof(ebuf));
if (lib_handle == nullptr) if (lib_handle == nullptr)
return nullptr; // Caller will throw VerifyError return nullptr; // Caller will throw VerifyError
}
void *fn = os::dll_lookup(lib_handle, "VerifyClassForMajorVersion"); void *fn = os::dll_lookup(lib_handle, "VerifyClassForMajorVersion");
if (fn == nullptr) if (fn == nullptr)

View File

@ -513,6 +513,11 @@ static void* _native_java_library = nullptr;
void* os::native_java_library() { void* os::native_java_library() {
if (_native_java_library == nullptr) { if (_native_java_library == nullptr) {
if (is_vm_statically_linked()) {
_native_java_library = get_default_process_handle();
return _native_java_library;
}
char buffer[JVM_MAXPATHLEN]; char buffer[JVM_MAXPATHLEN];
char ebuf[1024]; char ebuf[1024];

View File

@ -763,6 +763,9 @@ class os: AllStatic {
// Unload library // Unload library
static void dll_unload(void *lib); static void dll_unload(void *lib);
// Lookup the named function. This is used by the static JDK.
static void* lookup_function(const char* name);
// Callback for loaded module information // Callback for loaded module information
// Input parameters: // Input parameters:
// char* module_file_name, // char* module_file_name,

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -60,6 +60,10 @@ static inline bool not_loaded() {
} }
static void* dll_lookup(const char* name, const char* path, bool vm_exit_on_failure) { static void* dll_lookup(const char* name, const char* path, bool vm_exit_on_failure) {
if (is_vm_statically_linked()) {
return os::lookup_function(name);
}
assert(_zip_handle != nullptr, "invariant"); assert(_zip_handle != nullptr, "invariant");
void* func = os::dll_lookup(_zip_handle, name); void* func = os::dll_lookup(_zip_handle, name);
if (func == nullptr && vm_exit_on_failure) { if (func == nullptr && vm_exit_on_failure) {
@ -87,16 +91,23 @@ static void store_function_pointers(const char* path, bool vm_exit_on_failure) {
static void load_zip_library(bool vm_exit_on_failure) { static void load_zip_library(bool vm_exit_on_failure) {
assert(!is_loaded(), "should not load zip library twice"); assert(!is_loaded(), "should not load zip library twice");
char path[JVM_MAXPATHLEN]; char path[JVM_MAXPATHLEN];
if (os::dll_locate_lib(&path[0], sizeof path, Arguments::get_dll_dir(), "zip")) {
char ebuf[1024]; if (is_vm_statically_linked()) {
_zip_handle = os::dll_load(&path[0], &ebuf[0], sizeof ebuf); _zip_handle = os::get_default_process_handle();
} } else {
if (_zip_handle == nullptr) { // Load the libzip shared library and lookup the needed functions.
if (vm_exit_on_failure) { if (os::dll_locate_lib(&path[0], sizeof path, Arguments::get_dll_dir(), "zip")) {
vm_exit_during_initialization("Unable to load zip library", &path[0]); char ebuf[1024];
_zip_handle = os::dll_load(&path[0], &ebuf[0], sizeof ebuf);
}
if (_zip_handle == nullptr) {
if (vm_exit_on_failure) {
vm_exit_during_initialization("Unable to load zip library", &path[0]);
}
return;
} }
return;
} }
store_function_pointers(&path[0], vm_exit_on_failure); store_function_pointers(&path[0], vm_exit_on_failure);
Atomic::release_store(&_loaded, true); Atomic::release_store(&_loaded, true);
assert(is_loaded(), "invariant"); assert(is_loaded(), "invariant");

View File

@ -336,29 +336,31 @@ CreateExecutionEnvironment(int *pargc, char ***pargv,
int argc = *pargc; int argc = *pargc;
char **argv = *pargv; char **argv = *pargv;
/* Find out where the JDK is that we will be using. */ if (!JLI_IsStaticallyLinked()) {
if (!GetJDKInstallRoot(jdkroot, so_jdkroot, JNI_FALSE) ) { /* Find out where the JDK is that we will be using. */
JLI_ReportErrorMessage(LAUNCHER_ERROR1); if (!GetJDKInstallRoot(jdkroot, so_jdkroot, JNI_FALSE) ) {
exit(2); JLI_ReportErrorMessage(LAUNCHER_ERROR1);
} exit(2);
JLI_Snprintf(jvmcfg, so_jvmcfg, "%s%slib%sjvm.cfg", }
jdkroot, FILESEP, FILESEP); JLI_Snprintf(jvmcfg, so_jvmcfg, "%s%slib%sjvm.cfg",
/* Find the specified JVM type */ jdkroot, FILESEP, FILESEP);
if (ReadKnownVMs(jvmcfg, JNI_FALSE) < 1) { /* Find the specified JVM type */
JLI_ReportErrorMessage(CFG_ERROR7); if (ReadKnownVMs(jvmcfg, JNI_FALSE) < 1) {
exit(1); JLI_ReportErrorMessage(CFG_ERROR7);
} exit(1);
}
jvmpath[0] = '\0'; jvmpath[0] = '\0';
jvmtype = CheckJvmType(pargc, pargv, JNI_FALSE); jvmtype = CheckJvmType(pargc, pargv, JNI_FALSE);
if (JLI_StrCmp(jvmtype, "ERROR") == 0) { if (JLI_StrCmp(jvmtype, "ERROR") == 0) {
JLI_ReportErrorMessage(CFG_ERROR9); JLI_ReportErrorMessage(CFG_ERROR9);
exit(4); exit(4);
} }
if (!GetJVMPath(jdkroot, jvmtype, jvmpath, so_jvmpath)) { if (!GetJVMPath(jdkroot, jvmtype, jvmpath, so_jvmpath)) {
JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath); JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath);
exit(4); exit(4);
}
} }
/* /*

View File

@ -276,6 +276,13 @@ CreateExecutionEnvironment(int *pargc, char ***pargv,
char jdkroot[], jint so_jdkroot, char jdkroot[], jint so_jdkroot,
char jvmpath[], jint so_jvmpath, char jvmpath[], jint so_jvmpath,
char jvmcfg[], jint so_jvmcfg) { char jvmcfg[], jint so_jvmcfg) {
if (JLI_IsStaticallyLinked()) {
// With static builds, all JDK and VM natives are statically linked
// with the launcher executable. No need to manipulate LD_LIBRARY_PATH
// by adding <jdk_path>/lib and etc. The 'jrepath', 'jvmpath' and
// 'jvmcfg' are not used by the caller for static builds. Simply return.
return;
}
char * jvmtype = NULL; char * jvmtype = NULL;
char **argv = *pargv; char **argv = *pargv;
@ -318,6 +325,7 @@ CreateExecutionEnvironment(int *pargc, char ***pargv,
JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath); JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath);
exit(4); exit(4);
} }
/* /*
* we seem to have everything we need, so without further ado * we seem to have everything we need, so without further ado
* we return back, otherwise proceed to set the environment. * we return back, otherwise proceed to set the environment.
@ -519,11 +527,15 @@ LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn)
JLI_TraceLauncher("JVM path is %s\n", jvmpath); JLI_TraceLauncher("JVM path is %s\n", jvmpath);
libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL); if (JLI_IsStaticallyLinked()) {
if (libjvm == NULL) { libjvm = dlopen(NULL, RTLD_NOW + RTLD_GLOBAL);
JLI_ReportErrorMessage(DLL_ERROR1, __LINE__); } else {
JLI_ReportErrorMessage(DLL_ERROR2, jvmpath, dlerror()); libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL);
return JNI_FALSE; if (libjvm == NULL) {
JLI_ReportErrorMessage(DLL_ERROR1, __LINE__);
JLI_ReportErrorMessage(DLL_ERROR2, jvmpath, dlerror());
return JNI_FALSE;
}
} }
ifn->CreateJavaVM = (CreateJavaVM_t) ifn->CreateJavaVM = (CreateJavaVM_t)
@ -600,22 +612,26 @@ void* SplashProcAddress(const char* name) {
char jdkRoot[MAXPATHLEN]; char jdkRoot[MAXPATHLEN];
char splashPath[MAXPATHLEN]; char splashPath[MAXPATHLEN];
if (!GetJDKInstallRoot(jdkRoot, sizeof(jdkRoot), JNI_FALSE)) { if (JLI_IsStaticallyLinked()) {
JLI_ReportErrorMessage(LAUNCHER_ERROR1); hSplashLib = dlopen(NULL, RTLD_LAZY);
return NULL; } else {
} if (!GetJDKInstallRoot(jdkRoot, sizeof(jdkRoot), JNI_FALSE)) {
ret = JLI_Snprintf(splashPath, sizeof(splashPath), "%s/lib/%s", JLI_ReportErrorMessage(LAUNCHER_ERROR1);
return NULL;
}
ret = JLI_Snprintf(splashPath, sizeof(splashPath), "%s/lib/%s",
jdkRoot, SPLASHSCREEN_SO); jdkRoot, SPLASHSCREEN_SO);
if (ret >= (int) sizeof(splashPath)) { if (ret >= (int) sizeof(splashPath)) {
JLI_ReportErrorMessage(LAUNCHER_ERROR3); JLI_ReportErrorMessage(LAUNCHER_ERROR3);
return NULL; return NULL;
}
if (ret < 0) {
JLI_ReportErrorMessage(LAUNCHER_ERROR5);
return NULL;
}
hSplashLib = dlopen(splashPath, RTLD_LAZY | RTLD_GLOBAL);
} }
if (ret < 0) {
JLI_ReportErrorMessage(LAUNCHER_ERROR5);
return NULL;
}
hSplashLib = dlopen(splashPath, RTLD_LAZY | RTLD_GLOBAL);
JLI_TraceLauncher("Info: loaded %s\n", splashPath); JLI_TraceLauncher("Info: loaded %s\n", splashPath);
} }
if (hSplashLib) { if (hSplashLib) {

View File

@ -132,7 +132,9 @@ AWT_OnLoad(JavaVM *vm, void *reserved)
} }
#endif #endif
if (!JVM_IsStaticallyLinked()) { if (JVM_IsStaticallyLinked()) {
awtHandle = dlopen(NULL, RTLD_LAZY);
} else {
/* Get address of this library and the directory containing it. */ /* Get address of this library and the directory containing it. */
dladdr((void *)AWT_OnLoad, &dlinfo); dladdr((void *)AWT_OnLoad, &dlinfo);
realpath((char *)dlinfo.dli_fname, buf); realpath((char *)dlinfo.dli_fname, buf);