RFR: 8303796: Optionally build fully statically linked JDK image

Jiangli Zhou jiangli at openjdk.org
Fri Apr 28 01:41:27 UTC 2023


Initial implementation for supporting building a fully statically linked (with a desired set of JDK native libraries and libjvm) Java launcher executable, which is named as 'javastatic'.

In this PR, the support is only added for the linux platform. Both gcc and clang can be supported. For current demo/testing purpose, the bin/javastatic is statically linked with awt headless and other common JDK native libraries. The current PR doesn't fully handle creating the bundle for a static JDK image, which can be supported later.

To build the statically linked executable:

1. Configure the JDK build with --with-static-java=yes
2. Build static-java-image, e.g. 'make jdk-image static-java-image'

 The 'javastatic' binary created by the static-java-image target is not runnable. The runtime issues will be handled separately.

Following is a summary of the changes in this PR:

- Add make/autoconf/static-java.m4 for defining STATIC_JAVA_SETUP. Add STATIC_JAVA_SETUP to make/autoconf/configure.ac.

- Changes in make/Main.gmk
  - Add HOTSPOT_VARIANT_STATIC_LIBS_TARGETS and DeclareHotspotStaticLibsRecipe for building libjvm static library.
  - Add static-java-image for creating the fully statically linked standard Java launcher binary, bin/javastatic. The build process also places libjvm.a into the 'static-libs' image lib/ directory.

- Add make/StaticLink.gmk, which contains the main support for creating the fully statically linked Java launcher binary.

- Setup LDFLAGS_CXX_STATIC_JDK based on $TOOLCHAIN_TYPE in make/autoconf/flags-ldflags.m4.

- Always use bundled libraries for zlib, freetype, etc for static build support. The related changes are in make/autoconf/lib-bundled.m4 and make/autoconf/lib-freetype.m4. Building the bundled zlib, freetype and etc libraries ensures those libraries are included in the JDK binary bundle. It decouples the assumptions/requirements of the static Java image build process from the assumptions/requirements of the JDK build process. A post process that builds the static Java image can use those bundled libraries provided by JDK binary if needed.

- When building a fully statically linked java launcher executable, the --whole-archive linker option is used for the JDK/VM static libraries to make sure it links every object (.o) file provided by those static libraries. As a result, we need to remove any duplicate object files from the different JDK/VM static libraries. To do that, STATIC_LIB_EXCLUDE_OBJS is added and used in make/common/NativeCompilation.gmk. STATIC_LIB_EXCLUDE_OBJS contains the list of object files that need to be filtered out when creating a specific static library. STATIC_LIB_EXCLUDE_OBJS is defined for JDK/VM static libraries that may contain object files from other libraries (those are needed when building shared libraries), and those object files are added to the STATIC_LIB_EXCLUDE_OBJS. See make/hotspot/lib/CompileJvm.gmk, make/modules/java.base/lib/CoreLibraries.gmk and make/modules/java.desktop/lib/Awt2dLibraries.gmk.

- In make/common/NativeCompilation.gmk, move the code handling long arguments so that it can be used for the static build support as well.

- In make/hotspot/lib/CompileJvm.gmk, it specifies to exclude operator_new.o from the libjvm static library. See details in the comment added in CompileJvm.gmk.

Thanks manc for a bug fix for JAVASTATIC_OBJECT_DIR in StaticLink.gmk.

-------------

Commit messages:
 - Update copyright headers.
 - Fix jcheck whitespace error with make/autoconf/lib-bundled.m4.
 - Merge branch 'master' into JDK-8303796
 - - Update make/StaticLink.gmk:
 - Merge branch 'master' into JDK-8303796
 - Add make/StaticLink.gmk and make/autoconf/static-java.m4.
 - 8303796: Optionally build fully statically linked JDK image

Changes: https://git.openjdk.org/jdk/pull/13709/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=13709&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8303796
  Stats: 301 lines in 12 files changed: 258 ins; 34 del; 9 mod
  Patch: https://git.openjdk.org/jdk/pull/13709.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/13709/head:pull/13709

PR: https://git.openjdk.org/jdk/pull/13709



More information about the client-libs-dev mailing list