RFR: Force setting LD_LIBRARY_PATH in launcher

Kumar Srinivasan kumar.x.srinivasan at oracle.com
Wed Apr 12 14:20:37 UTC 2017


I don't like all the conditionals in that launcher code, and I don't 
have a good
answer to solve this either. If we have to, go for it, but maybe group 
all those
platforms which need LLP under one conditional ? and make that code more
readable.

Kumar

> On 12/04/2017 3:23 PM, Mikael Vidstedt wrote:
>>
>>> On Apr 11, 2017, at 8:55 PM, David Holmes <david.holmes at oracle.com> 
>>> wrote:
>>>
>>> On 12/04/2017 12:35 PM, Mikael Vidstedt wrote:
>>>>
>>>> This one is a big tricky:
>>>>
>>>> http://cr.openjdk.java.net/~mikael/webrevs/portola/launcherfix/webrev.00/webrev/ 
>>>>
>>>> http://cr.openjdk.java.net/~mikael/webrevs/portola/launcherfix/webrev.00/jdk/webrev/ 
>>>>
>>>>
>>>> The end goal is to get the launcher (java_md_solinux.c) to add the 
>>>> path to libjvm.so to LD_LIBRARY_PATH, but to only do so if 
>>>> running/building for musl. Here’s the comment I added to 
>>>> java_md_solinux.c, which hopefully explains why this is needed:
>>>>
>>>>      /*
>>>>       * The musl library loader requires LD_LIBRARY_PATH to be set in
>>>>       * order to correctly resolve the dependency libjava.so has on 
>>>> libjvm.so.
>>>
>>> I had not realized that the dynamic loader was part of libc. I had 
>>> assumed it was part of the OS proper.
>>>
>>>>       *
>>>>       * Specifically, it differs from glibc in the sense that even if
>>>>       * libjvm.so has already been loaded it will not be considered a
>>>>       * candidate for resolving the dependency unless the *full* path
>>>>       * of the already loaded library matches the dependency being 
>>>> loaded.
>>>>       *
>>>>       * libjvm.so is being loaded by the launcher using a long path to
>>>>       * dlopen, not just the basename of the library. Typically this
>>>>       * is something like "../lib/server/libjvm.so". However, if/when
>>>>       * libjvm.so later tries to dlopen libjava.so (which it does in
>>>>       * order to get access to a few functions implemented in
>>>>       * libjava.so) the musl loader will, as part of loading
>>>>       * dependent libraries, try to load libjvm.so using only its
>>>>       * basename "libjvm.so". Since this does not match the longer
>>>>       * path path it was first loaded with, the already loaded
>>>>       * library is not considered a candidate, and the loader will
>>>>       * instead look for libjvm.so elsewhere. If it's not in
>>>>       * LD_LIBRARY_PATH the dependency load will fail, and libjava.so
>>>>       * will therefore fail as well.
>>>>       */
>>>> Since there is no way to know at runtime that musl is being used, 
>>>> and there is no “system” compile time define to base the decision 
>>>> on, this change adds support to the JDK build system to set up a 
>>>> OPENJDK_{BUILD,TARGET}_CLIB variables based on the autoconf tuple, 
>>>> passing in the value to java_md_solinux.c as a compiler define 
>>>> -DCLIB=“…”, using that define to check for musl in RequiresSetenv, 
>>>> and returning true to force the setting of LD_LIBRARY_PATH if 
>>>> there’s a match.
>>>
>>> But we can infer we are using musl if we don't get any glibc version 
>>> information.
>>
>>
>> We could. I’m not a fan of having !glibc imply musl though. Like, at 
>> all. Not saying you can’t change my mind, but you’ll have to work on 
>> it :)
>
> Until we support some other non-glibc library it seems like a pretty 
> safe bet!
>
> But as discussed on IM the VM knowing it is on musl doesn't help. The 
> problem is that the launcher loaded a specific libjvm by path (client, 
> server, minimal) and libjava has a dependency on libjvm but with no 
> location info. libjvm is not in any of the ld search locations, hence 
> the musl loader won't find it, as it doesn't consider the already 
> loaded libjvm to be a candidate.
>
> Short term solution - hack LD_LIBRARY_PATH in launcher.
>
> BTW is what we are seeing with musl the same as what happens on AIX:
>
> /* We always have to set the LIBPATH on AIX because ld doesn't support 
> $ORIGIN. */
>
> ??
>
> Long term solution ... use a single unified DSO for java and the jvm 
> (and jli?) and dispense with JREs that contain multiple VMs.
>
> Cheers,
> David
>
>> Cheers,
>> Mikael
>>



More information about the portola-dev mailing list