On Fri, 14 Mar 2025 15:41:56 GMT, Joachim Kern <jk...@openjdk.org> wrote:

> After "JDK-8339480: Build static-jdk image with a statically linked launcher" 
> AIX was not able to build the new target. Therefore with "JDK-8345590 AIX 
> 'make all' fails after JDK-8339480" the new target was disabled again.
> 
> Now with this change we can enable the statically linked launcher target 
> again.
> There are 3 things to do.
> 1.    Modify `dladdr()`. Because this API does not exist on AIX it is 
> implemented based on the `loadquery()` API. Unfortunately, this API does only 
> return the name of the executable, but not its path. Beforehand this was no 
> problem, because we asked for a loaded library, for which the API provides 
> the path. But now we are asking for the executable itself.
> 2.    `dladdr()` is differently implemented three times in the openjdk code. 
> In the static case I supressed now the usage of the additional modules 
> containing version two and three. I know this shouldn't be the final version. 
> Magnus mentioned that they have discussed from time to time to have a "basic 
> JDK utility lib" that can be shared between hotspot and the JDK libraries. I 
> think this is a good idea for the future, but far beyond the scope of this 
> PR. The second best thing Magnus proposed is to only have the `dladdr()` 
> functionality in Hotspot and then export it. Let's see how the community 
> decides.
> 3.    Because we lack a linker flag like `whole-archive`, I had to force the 
> export of all symbols by creating export files containing all symbols of the 
> static libs. I introduced the new rule for the export file generation as 
> "raw" make recipes. Magnus claimed to use the `SetupExecute`. Unfortunately I 
> was not able to make it function. So I still have my "raw" solution in place, 
> but my last try with `SetupExecute` as comment beneath. Help is welcome.

make/StaticLibs.gmk line 116:

> 114: #    DEPS :=  $(STATIC_LIB_FILE), \
> 115: #    OUTPUT_FILE := $(STATIC_LIB_EXPORT_FILES), \
> 116: #    COMMAND := $(AR) $(ARFLAGS) -w $(patsubst %.exp, %, $@) | $(GREP) 
> -v '^\.' | $(AWK) '{print $$1}' | sort -u >$@, \

The problem with using SetupExecute here is using `$@` variables in the command 
line. To get this to work you need to delay resolving such variables. It may 
work by adding an adequate number of extra `$`, but I'm not sure how many would 
be needed or if it would actually work. You could try this, but it's probably 
trickier to get right than just doubling:

Suggestion:

#    COMMAND := $(AR) $(ARFLAGS) -w $$(patsubst %.exp, %, $$@) | $(GREP) -v 
'^.' | $(AWK) '{print $$$$1}' | sort -u >$$@, \


You are probably better off using the explicit output file variable 
`$(STATIC_LIB_EXPORT_FILES)`.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/24062#discussion_r1996001131

Reply via email to