java 17 libsvml.so conflict with user app

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Wed Oct 27 11:09:43 UTC 2021


On 2021-10-26 16:20, Vitaly Davidovich wrote:
> Hi Magnus,
>
> On Tue, Oct 26, 2021 at 6:44 AM Magnus Ihse Bursie 
> <magnus.ihse.bursie at oracle.com> wrote:
>
>     On 2021-10-26 01:43, Vitaly Davidovich wrote:
>     > Hi all,
>     >
>     > We're testing some of our code on Java 17 (17.0.1)/linux and hit
>     an issue
>     > related to libsvml.so.  It seems this library is now part of 17
>     to support
>     > the (incubating) Vector API.  We have a java library backed (via
>     JNI) by
>     > NAG, which itself links against libsvml.so.  The issue arises due to
>     > java.lang.UnsatisfiedLinkError when our java library is trying
>     to call into
>     > a NAG function which in turn is looking for a certain symbol
>     from libsvml
>     > (__svml_exp2_ha_mask in particular).
>     >
>     > It looks like the JDK is eagerly loading symbols from its
>     packaged libsvml
>     > (is there a way to disable that for now?).  That version of the
>     library is
>     > also in conflict with the one we want to load, as witnessed by
>     the missing
>     > symbol (there're probably others but we stopped testing at this
>     point).
>     >
>     > Is this a known issue/compatibility hazard? Happy to hear
>     thoughts/opinions
>     > on this and provide further info, if needed.
>     It sounds like there are two completely different libsvml.so around,
>     muddying the waters. The libsvml.so shipped with the JDK is a core
>     part
>     of the vector functionality in the JDK. This is highly unlikely to be
>     installed as a system library (basically, if anyone has ever
>     managed to
>     do that, they've worked hard to do the wrong thing).
>
>     A quick googling indicates that there is a separate libsvml.so
>     shipped
>     by IBM as part of their compiler. My guess is that your JNI
>     library is
>     using this.
>
> It's using libsvml from a NAG (vendor, 
> https://www.nag.com/content/nag-library) library; the NAG library 
> itself ships a version of Intel's MKL library, which is where libsvml 
> comes from.  It looks like the JDK has its own subset of libsvml: 
> https://github.com/openjdk/jdk/tree/master/src/jdk.incubator.vector/linux/native/libsvml. 
> These all have Intel copyrights, so I assume they're based on the same 
> product.  However, JDK's libsvml is a subset (in terms of total # of 
> symbols) from MKL's libsvml.

Okay, maybe I'm mistaken here. I helped to create libsvml in the JDK by 
moving files out from src/hotspot, so I just assumed that these were 
independent products just happening to share the same name.

I've cc:ed Sandhya who were involved in getting libsvml into the JDK to 
shed some light on this.

>
>     We've run into similar issues in the past. Unfortunately, there is no
>     really good way of resolving this. :(
>
> Sigh :(
>
>
>     One long term solution to minimize this kind of problems would be to
>     rename our library "libjsvml.so", in the hope that this is less
>     likely
>     to clash with another library. This is a similar solution to what
>     we've
>     been taking in the past with other name-clashing JDK libraries.
>
> This would need to be coupled with JDK dlopen()'ing this "private" lib 
> with RTLD_LOCAL, right? Otherwise, it seems like one may end up with a 
> hybrid situation, where some symbols would be resolved from libjsvm.so 
> and others from libsvm.so.

If this is the case, then we might need to rename the symbols in 
libjsvml as well. Normally, if we export symbols, they are given a 
unique (or hopefully unique...) prefix, like JVM_ or 
Java_<class>_<method>. This consideration was apparently not done for 
the SVML lib, and if the code was copied with function names unchanged, 
this went from "unlikely to collide" to "destined to collide". :-(

>
> In the short term (say for a 17.0.2 release), could there be a JVM 
> flag added that could skip loading libsvm.so? I understand that 
> effectively would disable the Vector API, but that's ok for us - we're 
> not currently experimenting with that API.  Just trying to get 17 
> working with existing "stock" code :).
Hm...

Actually, from looking at the code, I think you can just delete the 
libsvml.so from the JDK installation. It is already dlload:ed, and if 
that fails, I think it just silently ignores this.

/Magnus


More information about the hotspot-runtime-dev mailing list