On Wed, 12 Jul 2023 10:58:49 GMT, Jaikiran Pai <j...@openjdk.org> wrote:

>> Can I please get a review for this change which proposes to fix the issue 
>> reported in https://bugs.openjdk.org/browse/JDK-8206890?
>> 
>> The `jlink` command allows a `--endian` option to specify the byte order in 
>> the generated image. Before this change, when such a image was being 
>> launched, the code would assume the byte order in the image to be the native 
>> order of the host where the image is being launched. That would result in 
>> failure to launch java, as noted in the linked issue.
>> 
>> The commit in this PR, changes relevant places to not assume native order 
>> and instead determine the byte order by reading the magic bytes in the image 
>> file's header content.
>> 
>> A new jtreg test has been added which reproduces the issue and verifies the 
>> fix.
>
> Jaikiran Pai has updated the pull request with a new target base due to a 
> merge or a rebase. The pull request now contains 45 commits:
> 
>  - move copyright before imports in the new test
>  - add a new test for jlink --endian usages
>  - merge latest from master branch
>  - use newly introduced Architecture.byteOrder() API
>  - merge latest from master branch
>  - update jdk.tools.jlink.internal.Platform class to be aware of non-current 
> platform's endianness
>  - remove no longer needed constructor
>  - merge latest from master branch
>  - foo
>  - merge latest from master branch
>  - ... and 35 more: https://git.openjdk.org/jdk/compare/753bd563...962d542d

Looks okay with a suggestion to determine the endianness outside `ImageHelper`.

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Jlink.java line 168:

> 166:             this.output = output;
> 167:             this.modules = Objects.requireNonNull(modules);
> 168:             this.endian = endian;

`JlinkConfiguration` does not need to know the endianness.   Only the image 
builder needs it.   Probably good to take the `endian` parameter out from 
`JlinkConfiguration` and instead pass the value of `--endian` to 
`JlinkTask::createImageProvider` like other jlink options.

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java line 412:

> 410: 
> 411:         // First create the image provider
> 412:         ImageHelper imageProvider = createImageProvider(config,

formatting nit: line 413-415 should be adjusted to align the parameters.

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java line 568:

> 566:         Map<String, Path> mods = cf.modules().stream()
> 567:             .collect(Collectors.toMap(ResolvedModule::name, 
> JlinkTask::toPathLocation));
> 568:         return new ImageHelper(cf, mods, config.getByteOrder(), 
> retainModulesPath, ignoreSigning,

Also we can move the logic of determining the endianess of the target platform 
out of `ImageHelper`.   Evaluate the target platform and endianness here and 
pass to `ImageHelper`.

Suggestion:

        // endian is the value specified via --endian and a new parameter to 
createImageProvider 
        Platform targetPlatform = targetPlatform(cf, modsPaths);
        ByteOrder targetOrder = endian != null ? endian : 
targetPlatform.arch().byteOrder();
        return new ImageHelper(cf, mods, targetOrder, retainModulesPath, 
ignoreSigning,

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java line 856:

> 854:         // returns true if the current platform's "jmods" directory is 
> the parent of the
> 855:         // passed javaBasePath
> 856:         private static boolean isJavaBaseFromCurrentPlatform(Path 
> javaBasePath) throws IOException {

This method checks if we are jlinking the JMOD files from the default module 
path.   This is not exactly checking if `java.base` matches the current 
platform since there are other possible setups too.    Suggest to rename the 
method name to `isJavaBaseFromDefaultModulePath`.   So the comments should also 
be updated to reflect that.

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java line 857:

> 855:         // passed javaBasePath
> 856:         private static boolean isJavaBaseFromCurrentPlatform(Path 
> javaBasePath) throws IOException {
> 857:             Path currentPlatformJmods = getDefaultModulePath();

Suggestion:

            Path defaultModulePath = getDefaultModulePath();

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

PR Review: https://git.openjdk.org/jdk/pull/11943#pullrequestreview-1527094883
PR Review Comment: https://git.openjdk.org/jdk/pull/11943#discussion_r1261636015
PR Review Comment: https://git.openjdk.org/jdk/pull/11943#discussion_r1261642743
PR Review Comment: https://git.openjdk.org/jdk/pull/11943#discussion_r1261654437
PR Review Comment: https://git.openjdk.org/jdk/pull/11943#discussion_r1261639546
PR Review Comment: https://git.openjdk.org/jdk/pull/11943#discussion_r1261640202

Reply via email to