Hermetic Java (static image packaging/formatting) investigation and proposal

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Tue Feb 14 08:55:06 UTC 2023


On 2023-02-14 00:52, Jiangli Zhou wrote:

> Hi Magnus,
>
> Thanks for the thoughts! Please see comments inlined below.
>
> On Mon, Feb 13, 2023 at 5:43 AM Magnus Ihse Bursie 
> <magnus.ihse.bursie at oracle.com> wrote:
>
>     Hi Jiangli,
>
>     On 2023-02-08 03:08, Jiangli Zhou wrote:
>     > Hi Brian,
>     >
>     > Here are the main buckets of the changes discovered in JDK/VM to
>     > support the proposed hermetic image:
>     >
>     > 1) Resolve symbol conflicts to fully support JDK static builds.
>     Those
>     > are mainly caused by duplicated symbols defined in different native
>     > libraries or VM code.
>     >
>     > 2) Complete the built-in native library support in JDK. For
>     easier and
>     > more reliable testing/release/deployment, we wanted to support JDK
>     > dynamic and static builds with the same set of object files (.o).
>     > We've changed to use unique names for
>     >
>     JNI_OnLoad|JNI_OnUnload|Agent_OnLoad|Agent_OnUnload|Agent_OnAttach in
>     > different JDK JNI libraries by default. For both dynamic linked and
>     > static linked JDK builds, we use unique symbols for JNI_OnLoad
>     > function and friends. However, non-builtin application JNI libraries
>     > can still have the default JNI_OnLoad|... naming. We still properly
>     > support application JNI libraries using the default JNI_OnLoad (and
>     > friends) naming.
>     >
>     > As we wanted to produce dynamic and static builds from the same
>     set of
>     > object files, we've moved away from using the STATIC_BUILD macro.
>     >
>     > We've also done some makefile work to build both dynamic shared
>     > libraries (DSOs) and static libraries, within one JDK build.
>
>     This sounds like interesting work indeed. However, I am inclined to
>     agree with Andrew and wonder how much it relates to Project
>     Leyden. It
>     might be that Leyden will need some kind of packaging story, and that
>     this can have a role to play in that. But it is not immediately clear
>     that it does fit in, and indeed, I think this is not one of Leyden
>     main
>     problem areas at the time.
>
>     But your code sounds very much interesting from a pure build
>     perspective! For at least this part of the code, I think you should
>     ignore Leyden for now, and just see if the static build changes
>     you have
>     made could be fit for inclusion in OpenJDK.
>
>     The static build part of the build system has been sadly neglected
>     due
>     to resource limitations, for a long time. :( The rudimentary system
>     (actually, more like two separate systems) we have was put in place
>     mostly due to external requirements from Project Mobile and the Graal
>     integration, and was tacked on mostly as an after-thought. It is not
>     regularly tested, and I'd frankly be surprised if it actually works
>     right now. So I fully understand if you have been staying away from
>     STATIC_BUILD. :)
>
>     It sounds like you have created a more dynamic system to be able to
>     select per library, if it should be compiled statically or
>     dynamically.
>     Do I understand you correctly? If done correctly, it can probably
>     help
>     bring a better abstraction to the build process.
>
>
> For JDK/hotspot natives, our experiment/prototype builds all the JDK 
> regular artifacts (e.g. lib/.../*.so) that the existing JDK build 
> produces. Additionally, it also creates the JDK static libraries (e.g. 
> lib_static/*.a) and a bin/javastatic (with most of the needed JDK 
> static libraries statically linked into the launcher, for testing 
> purposes only, such as running jtreg tests) in the binary, as part of 
> the single JDK build. The hermetic image creation is done as a post 
> process, which takes the needed pre-built JDK static libraries for 
> linking into the final executable. The post process is done outside 
> the JDK build. The JDK runtime support is enhanced to be able to 
> support both built-in libraries and dynamically loaded shared libraries.
>
> It doesn't seem to be problematic to get the JDK static support into 
> OpenJDK first. It's especially helpful for you or erikj@ to look at 
> the makefiles changes and help massage the changes according to the 
> JDK build standard.
>
>
>     If you are willing to contribute your work to OpenJDK, I would
>     definitely be interested in studying it in detail. 
>
>
> Thanks!
>
>     As you might be
>     aware, contributions to OpenJDK must be done on the OpenJDK
>     infrastructure. One way to do this is to create a branch in the
>     sandbox
>     repo[1], and push your changes there.
>
>
> Will get back to you on this, after some explorations on open sourcing 
> the changes.

Let me know when you are done with that process.

/Magnus

>
>     If it turns out to be of use for Project Leyden, all the better if
>     it is
>     already in place. And if it turns out that this is orthogonal to
>     Project
>     Leyden, I still think a cleanup in this area might be beneficial
>     for all
>     of the JDK.
>
>
> All sounds good!
>
> Best,
> Jiangli
>
>
>     /Magnus
>
>     [1] https://github.com/openjdk/jdk-sandbox
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/build-dev/attachments/20230214/3e783c3d/attachment.htm>


More information about the build-dev mailing list