On Fri, 28 Apr 2023 01:03:28 GMT, Jiangli Zhou <jian...@openjdk.org> wrote:
> 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. @jianglizhou I thought this work was proposed to be done under the Project Leyden umbrella? The other static-build tweaks have been fine but this seems to be part of a bigger, yet unspecified, project that may need to be covered by a JEP. ------------- PR Comment: https://git.openjdk.org/jdk/pull/13709#issuecomment-1526991027