Integrated: 7903654: Jextract should use library lookup
Rémy Maucherat
remm at apache.org
Tue Feb 13 19:08:03 UTC 2024
On Thu, Feb 8, 2024 at 4:00 PM Maurizio Cimadamore
<mcimadamore at openjdk.org> wrote:
>
> On Wed, 7 Feb 2024 16:18:45 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:
>
> > Historically, jextract has always used `System::loadLibrary` and `System::load` to load libraries specified via the `-l` option. This is suboptimal, as in the most common case, such libraries will be installed using e.g. `apt`, in which case `System::load/loadLibrary` is of little use, as it cannot find libraries in path known to the dynamic linker.
> >
> > This patch changes the default for library loading to use `SymbolLookup::libraryLookup` instead. That is, in absence of any other options, each library provided via `-l` will create a new `SymbolLookup::loaderLookup`, associated with the library arena.
> >
> > The `-l` option also supports a new disambiguation mechanism, borrowed from the gcc linker options - that is, if the library name starts with `:`, what follows is parsed as a path. Otherwise, we assume it's a library name, and we add prefix/suffix, using `System::mapLibraryName` before creating the lookup.
> >
> > In cases where the old behavior is preferred (e.g. if libraries to be loaded sit in `java.library.path`) a fallback option has been provided, namely `--use-system-load-library`.
> >
> > Regardless of the options used, the header class will feature a composite lookup. Inside this lookup we find:
> >
> > 1. one or more library lookup (one for each `-l` option)
> > 2. the loader lookup
> > 3. the native linker's default lookup
> >
> > When `--use-system-load-library` is used, (1) is empty, and a static initializer block with the corresponding calls to `System::load`, `System::loadLibrary` is added instead.
>
> This pull request has now been integrated.
>
> Changeset: 456632df
> Author: Maurizio Cimadamore <mcimadamore at openjdk.org>
> URL: https://git.openjdk.org/jextract/commit/456632df2e0b00a3f0fd5714b020d00f90c41804
> Stats: 176 lines in 32 files changed: 91 ins; 18 del; 67 mod
>
> 7903654: Jextract should use library lookup
With that change in place, the code to load OpenSSL now looks like:
static final SymbolLookup SYMBOL_LOOKUP =
SymbolLookup.libraryLookup(System.mapLibraryName("ssl"),
LIBRARY_ARENA)
.or(SymbolLookup.loaderLookup())
.or(Linker.nativeLinker().defaultLookup());
This works very well on Linux, where it improves things in some setups
(like the Tomcat CI runs which are now able to load OpenSSL).
However, on MacOS this seems to fail with:
"WARNING: <path to java executable> is loading libcrypto in an unsafe way"
And the JVM exits.
Given this: https://github.com/cl-plus-ssl/cl-plus-ssl/issues/114#issuecomment-770370592
It would seem it is trying to load the wrong "library" on that platform.
Rémy
> Reviewed-by: jvernee
>
> -------------
>
> PR: https://git.openjdk.org/jextract/pull/201
More information about the jextract-dev
mailing list