On Tue, Apr 16, 2024 at 9:20 AM Jiangli Zhou <jiangliz...@google.com> wrote:
>
> On Tue, Apr 16, 2024 at 8:30 AM Magnus Ihse Bursie
> <magnus.ihse.bur...@oracle.com> wrote:
> >
> > Jiangli,
> >
> > First of all: I tried building the leyden branch "hermetic-java-runtime" 
> > but failed. :-( I tried some various attempts to work around the failures, 
> > but the javastatic file I ended up with were unable to start.
>
> Magnus, I recall you mentioned that you had build issues during one of
> the zoom meetings earlier this year (didn't hear any follow-up on it).
> Let's get this resolved for you first. Can you please share the build
> failures/errors and runtime errors that you run into?
>
> Same questions about your build environment, as you asked below.
>
> >
> > What kind of environment are you using to build this branch? (OS, compiler, 
> > libc version, etc) Do you have any special configure flags that are 
> > required?
>
> For the leyden hermetic-java-runtime branch, I've only been building
> on Linux. I've used both gcc and clang.
>
> Yes, the branch requires `--with-static-java=yes`, e.g.
>
>   bash configure --with-boot-jdk=<jdk_path>
> --with-debug-level=slowdebug --with-static-java=yes
>
> I documented the build information in one of the comment messages.
> That's probably not the best place. I'll look for a better place.
>
> Let's discuss more on the rest of the topics below during our meeting
> today. We can update on the mailing list about the discussion, if
> others are interested.

For anyone who's interested in the topics,
https://mail.openjdk.org/pipermail/leyden-dev/2024-April/000643.html
is a separate email thread with today's meeting summary from @Magnus
Ihse Bursie and responses from me.

Best,
Jiangli

>
> Best,
> Jiangli
>
> >
> > I would very much like to test it out myself to check this static java 
> > launcher that you are creating.
> >
> > On 2024-04-16 03:01, Jiangli Zhou wrote:
> >
> > The main purpose of StaticLink.gmk is to support the static-java-image
> > make target, which can be used to perform the actual static linking
> > step using libjvm.a and JDK static libraries. That currently doesn't
> > exist in the JDK mainline. Creating a "fully" statically linked Java
> > launcher is the first step (out of many) towards supporting
> > static/hermetic Java.
> >
> > I am still not sure it is the best design to have this in a separate file. 
> > You are in some way "just" creating a new launcher.
> >
> > As part of cleaning/refactoring/integrating for the static linking
> > step, we want to agree and decide/accept on the following:
> >
> > - Support the "fully" statically linked java launcher for testing and
> > demoing the capability of static JDK support, e.g.
> >   - Support running jtreg testing using the "fully" statically linked
> > Java launcher
> >
> > So how do you want to test native jtreg tests? By compiling the jtreg tests 
> > to native .a files and statically link with those as well, or to make this 
> > a hybrid mode where a statically linked launcher loads the jtreg tests 
> > dynamically?
> >
> >   - Set up tests in github workflow to help detect any breaking
> > changes for static support, e.g. new symbol issues introduced by any
> > changes. There were some earlier discussions on this with Ron and Alan
> > during the zoom meetings.
> >
> > If we do this correct, we should not have to worry about symbol conflicts. 
> > (Local symbols should all be hidden before creation of the static 
> > libraries.) That said, creating static libraries needs to be regularly 
> > tested or it will break.
> >
> > - Which JDK native libraries to be statically linked with the new
> > launcher target? E.g. StaticLink.gmk currently excludes libjsound.a,
> > libawt_xawt.a, etc from statically linked with the launcher.
> >
> > That sounds rather arbitrarily. I would assume that a statically linked 
> > launcher should include native libraries from all included modules. If you 
> > are not interested in java.desktop native libraries, then you'd need to 
> > exclude java.desktop from the build. But my assumption here is that we need 
> > to build a solution that works with all modules included in the JDK, and 
> > that is what must be tested in GHA.
> >
> > - Do we want more than one statically linked launcher target, based on
> > the set of linked native libraries?
> >
> > Do you mean that you want like "static-java-java.base-only", 
> > "static-java-eveything-but-java.desktop" etc? That does not sound like 
> > something that belongs in the makefiles. If you want to build a JDK that 
> > can only support a certain subset of modules, you need to specify those 
> > module in your build scripts as input to configure.
> >
> > (II) What missing:
> > - Static linking step as mentioned above
> >
> > (III) What needs to be improved (require cleanups and refactoring, and
> > you mentioned some of those in your response as well):
> > - Support building both the static libraries and dynamic libraries
> > using the same set of .o files, instead of separately compiled .o
> > files. That helps improve build speed and reduce memory overhead for
> > building JDK. Your current refactoring work aims to help that.
> > - Clean up the usages of STATIC_BUILD macro. Most of the usages are in
> > test code.
> > - Other runtime fixes/enhancements in the leyden
> > https://github.com/openjdk/leyden/tree/hermetic-java-runtime branch
> >
> > I think most work mentioned in III has dependencies on II. We need a
> > workable base to be able to build the "fully" statically linked
> > launcher for building and testing the work mentioned in III, when
> > integrating any of those to the JDK mainline. The makefile refactoring
> > work can be done in parallel but does not need to be completed before
> > we add the static linking step in JDK mainline.
> >
> > I'm not sure I understand why you consider (II) to be a prerequisite for 
> > the (III) issues. From my point of view, they are all mutually independent 
> > changes that needs to be done, and if anything, I think getting in code to 
> > create a statically linked launcher will probably be easier if we get 
> > further along on the other issues.
> >
> > In particular, I'd like to see changes to the STATIC_BUILD macro come in 
> > first. Ideally, we should not send in such a macro at all. The JNI_OnLoad 
> > stuff is bugging me mostly.
> >
> > As of today, the leyden
> > https://github.com/openjdk/leyden/tree/hermetic-java-runtime branch
> > can build a "fully" statically linked Java launcher. The issue of
> > compiling the dynamic and static libraries .o files separately is not
> > a blocker. It's good to have it resolved at some point of time.
> >
> > Weeeell, yes and no... It is not *technically* a blocker, but unless we can 
> > reuse the .o files, including static builds in the standard testing on GHA 
> > will effectively double the build time, and that is definitely not 
> > acceptable. And the alternative is to bring in static builds without having 
> > it regularly tested, which I don't think is acceptable either.
> >
> > So the conclusion is that getting static and dynamic libraries built from 
> > the same .o files is in effect a blocker for Hermetic Java.
> >
> > This, in turn, require several changes:
> >
> > 1) The linking code needs to be cleaned up, and all technical debt needs to 
> > be resolved. This is what I have been doing since I started working on 
> > static builds for Hermetic Java. JDK-8329704 (which was integrated 
> > yesterday) was the first major milestone of this cleanup. Now, the path 
> > were to find a library created by the JDK (static or dynamic) is 
> > encapsulated in ResolveLibPath. This is currently a monster, but at least 
> > all knowledge is collected in a single location, instead of spread over the 
> > code base. Getting this simplified is the next step.
> >
> > 2) We need to stop passing the STATIC_BUILD define when compiling. This is 
> > partially addressed in your PR, where you have replaced #ifdef STATIC_BUILD 
> > with a dynamic lookup. But there is also the problem of JNI/JVMTI entry 
> > points. I have been pondering how we can compile the code in a way so we 
> > support both dynamic and static name resolution, and I think I have a 
> > solution.
> >
> > This is unfortunately quite complex, and I have started a discussion with 
> > Alan if it is possible to update the JNI spec so that both static and 
> > dynamic entry points can have the form "JNI_OnLoad_<library-name>". 
> > Ideally, I'd like to see us push for this with as much effort as possible. 
> > If we got this in place, static builds would be much easier, and the 
> > changes required for Hermetic Java even smaller.
> >
> > Thumbs up! That seems to be a good direction. Currently in the leyden
> > branch, it first looks up the unique
> > JNI_OnLoad<_lib_name>|Agent_OnLoad<_lib_name> etc for built-in
> > libraries, then search for the dynamic libraries using the
> > conventional naming when necessary. e.g.:
> >
> > https://github.com/openjdk/leyden/commit/a5c886d2e85a0ff0c3712a5488ae61d8c9d7ba1a
> > https://github.com/openjdk/leyden/commit/1da8e3240e0bd27366d19f2e7dde386e46015135
> >
> > When spec supports JNI_OnLoad_<library-name> and etc. for dynamic
> > libraries, we may still need to support the conventional naming
> > without the <_lib_name> part for existing libraries out there.
> >
> > That looks interesting. Basically, this is very similar to what I imagine 
> > needs to be done in the mainline. However, I don't think we can just change 
> > this code like that without a CSR? Or are we allowed to treat JDK-internal 
> > libraries different than the specification states?
> >
> > I would say getting this part into mainline should be the main focus right 
> > now, not the StaticLink.gmk file. And that includes getting any CSR 
> > approvals etc.
> >
> > Thank you for taking this on! Potentially we could consider taking the
> > objcopy to localizing hotspot symbols on unix-like platforms, based on
> > https://github.com/openjdk/jdk/pull/17456 discussions. Additional
> > testing is still needed to verify the solution.
> >
> > We don't need any additional testing on that; proof of concept shows it 
> > works. It just needs to be implemented. With JDK-8330261 (pushed today), 
> > the ground is now prepared to get it done. It is next on my todo-list.
> >
> > It might be a good idea to follow up on the static linking discussion
> > in tomorrow's zoom meeting (hope you'll be able to join tomorrow).
> >
> > I'll join but might be somewhat late due to family commitments.
> >
> > /Magnus

Reply via email to