Hello,

We (the panama-foreign team), want to make the foreign linker, which is returned by the java.lang.foreign.Linker::nativeLinker() method a required API for Java 21. This move is needed in order to be able to start rewriting parts of the JDK itself to use the linker API.

In Java 20, this API is specified to throw an UnsupportedOperationException on unsupported platforms [1]. Making the API required on all platforms means removing this exception specification, meaning that implementations that continue to throw it would not be compliant to the spec.

There are several ports already:
- RISC-V: https://github.com/openjdk/jdk/pull/11004
- Windows/AArch64: https://github.com/openjdk/jdk/pull/12773
- PPC64le: https://github.com/openjdk/jdk/pull/12708 (not yet integrated)
- Zero VM: the zero VM configuration works with the fallback linker (see below)

For these ports nothing would need to be done.

For other ports, an implementation of the native linker would need to be provided. To facilitate this, we are adding a 'fallback' linker implementation as part of JEP 442 [2]. This allows a JDK to use libffi in order to implement (most of) the functionality of a linker. This approach is similar to the alternative implementation provided for VMContinuations, but would require ports to also bundle a working version of libffi.

The fallback linker can be enabled with the --enable-fallback-linker configure flag. When doing that, the build system will also require libffi to be available. I've tested this on Linux/x64 using libffi version 3.4.2. It is noteworthy that I had to build libffi from source, as the version that came with the particular distribution of Ubuntu I was using didn't work (resulting in SEGVs at runtime). I also had to use the same toolchain for building libffi as was used to build the JDK itself. The JEP 442 patch also contains a build script under make/devkit/createLibffiBundle.sh [3] which describes the steps needed to create a working libffi package on Linux/x64.

I would like to ask maintainers of other ports to try out the JEP patch together with the fallback linker/libffi, so that we can 'flip the switch' and make the linker a required API later in the 21 release cycle without a hitch.

Thanks,
Jorn Vernee

[1]: https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/lang/foreign/Linker.html#nativeLinker()
[2]: https://github.com/openjdk/jdk/pull/13079
[3]: https://github.com/openjdk/jdk/blob/928ad35e570abaac9103989d603e3ef278568354/make/devkit/createLibffiBundle.sh


Reply via email to