[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-build-dev
Subject:    Re: [PATCH v2] Add a flag for overriding default JNI library search path
From:       David Holmes <david.holmes () oracle ! com>
Date:       2018-11-28 20:54:08
Message-ID: 98e1b36a-19fb-3ea7-9dba-be1f709fe668 () oracle ! com
[Download RAW message or body]

Hi Jakub,

Are you ready to have this pushed? I can sponsor it if so.

David

On 27/11/2018 1:36 pm, David Holmes wrote:
> Hi Jakub,
> 
> I have filed:
> 
> https://bugs.openjdk.java.net/browse/JDK-8214332
> 
> for this issue.
> 
> On 27/11/2018 6:51 am, Jakub Vaněk wrote:
>> Hi all,
>>
>> I updated the original patch to address some issues.
>>
>> * The option is documented to work only on Linux, BSD, AIX.
>> * Autoconf code now checks if this operation is supported on   the 
>> target platform* Autoconf code is moved to jdk-options.m4, where it 
>> mirrors how
>>      --with-cacerts-file option was specified.
>> * The option isn't called --with-hotspot-libpath anymore, but rather
>>      --with-jni-libpath, to indicate the intended usage.
> 
> That all seems fine to me - thanks.
> 
>> I tried using dlinfo() on Ubuntu to get the library path. The results
>> are the following:
>>
>> /lib/x86_64-linux-gnu
>> /usr/lib/x86_64-linux-gnu
>> /lib
>> /usr/lib
>>
>> This way of doing it looks interesting, because if /jni is appended to
>> the path, a Debian-like path can be synthesized and it could be
>> consistent across distributions. However, dlinfo() is not universally
>> supported:
>> https://www.gnu.org/software/gnulib/manual/html_node/dlinfo.html
>>
>> In particular, Android doesn't support it (not counting some BSDs and
>> AIX). This could be avoided by falling back to the old behavior there.
>>
>> Should I try to implement it also that way?
> 
> Thanks for looking at it. We'd probably have to investigate in a lot 
> more detail before we could switch over to try and use this. May be 
> worth persuing in a future RFE (Request for Enhancement).
> 
> Thanks,
> David
> 
>> Thanks,
>>
>> Jakub
>>
>> # HG changeset patch
>> # User Jakub Vaněk <linuxtardis@gmail.com>
>> # Date 1543260470 -3600
>> #           Mon Nov 26 20:27:50 2018 +0100
>> # Node ID 218a4f07e539efade7404093508e94c7ed02b177
>> # Parent   e017d2f176d0119cdc70c9f2ee98e78c0c13f0c7
>> Add an option for overriding default JNI library search path
>>
>> diff --git a/doc/building.html b/doc/building.html
>> --- a/doc/building.html
>> +++ b/doc/building.html
>> @@ -464,6 +464,10 @@
>>   
>> <li><code>--with-jvm-features=&lt;feature&gt;[,&lt;feature&gt;...]</code> 
>> - Use the specified JVM features when building Hotspot. The list of 
>> features will be enabled on top of the default list. For the 
>> <code>custom</code> JVM variant, this default list is empty. A 
>> complete list of available JVM features can be found using <code>bash 
>> configure --help</code>.</li>
>>    <li><code>--with-target-bits=&lt;bits&gt;</code> - Create a target 
>> binary suitable for running on a <code>&lt;bits&gt;</code> platform. 
>> Use this to create 32-bit output on a 64-bit build platform, instead 
>> of doing a full cross-compile. (This is known as a <em>reduced</em> 
>> build.)</li>
>>    </ul>
>> +<p>On Linux, BSD and AIX, it is possible to override where Java by 
>> default searches for runtime/JNI libraries. This can be useful in 
>> situations where there is a special shared directory for system JNI 
>> libraries. This setting can in turn be overriden at runtime by setting 
>> the <code>java.library.path</code> property.</p>
>> +<ul>
>> +<li><code>--with-jni-libpath=&lt;path&gt;</code> - Use the specified 
>> path as a default when searching for runtime libraries.</li>
>> +</ul>
>>    <h4 id="configure-arguments-for-native-compilation">Configure 
>> Arguments for Native Compilation</h4>
>>    <ul>
>>    <li><code>--with-devkit=&lt;path&gt;</code> - Use this devkit for 
>> compilers, tools and resources</li>
>> diff --git a/doc/building.md b/doc/building.md
>> --- a/doc/building.md
>> +++ b/doc/building.md
>> @@ -662,6 +662,14 @@
>>            platform, instead of doing a full cross-compile. (This is known 
>> as a
>>            *reduced* build.)
>> +On Linux, BSD and AIX, it is possible to override where Java by default
>> +searches for runtime/JNI libraries. This can be useful in situations 
>> where
>> +there is a special shared directory for system JNI libraries. This 
>> setting
>> +can in turn be overriden at runtime by setting the 
>> `java.library.path` property.
>> +
>> +   * `--with-jni-libpath=<path>` - Use the specified path as a default
>> +   when searching for runtime libraries.
>> +
>>    #### Configure Arguments for Native Compilation
>>        * `--with-devkit=<path>` - Use this devkit for compilers, tools 
>> and resources
>> diff --git a/make/autoconf/jdk-options.m4 b/make/autoconf/jdk-options.m4
>> --- a/make/autoconf/jdk-options.m4
>> +++ b/make/autoconf/jdk-options.m4
>> @@ -244,6 +244,25 @@
>>            COPYRIGHT_YEAR=`$DATE +'%Y'`
>>        fi
>>        AC_SUBST(COPYRIGHT_YEAR)
>> +
>> +   # Override default library path
>> +   AC_ARG_WITH([jni-libpath], [AS_HELP_STRING([--with-jni-libpath],
>> +           [override default JNI library search path])])
>> +   AC_MSG_CHECKING([for jni library path])
>> +   if test "x${with_jni_libpath}" == "x"; then
>> +       AC_MSG_RESULT([default])
>> +   else
>> +       HOTSPOT_OVERRIDE_LIBPATH=${with_jni_libpath}
>> +       if test "x$OPENJDK_TARGET_OS" != "xlinux" &&
>> +                 test "x$OPENJDK_TARGET_OS" != "xbsd" &&
>> +                 test "x$OPENJDK_TARGET_OS" != "xaix"; then
>> +           AC_MSG_RESULT([fail])
>> +           AC_MSG_ERROR([Overriding JNI library path is supported only on 
>> Linux, BSD and AIX.])
>> +       fi
>> +       AC_MSG_RESULT(${HOTSPOT_OVERRIDE_LIBPATH})
>> +   fi
>> +   AC_SUBST(HOTSPOT_OVERRIDE_LIBPATH)
>> +
>>    ])
>>   
>> ############################################################################### 
>>
>> diff --git a/make/autoconf/spec.gmk.in b/make/autoconf/spec.gmk.in
>> --- a/make/autoconf/spec.gmk.in
>> +++ b/make/autoconf/spec.gmk.in
>> @@ -274,6 +274,9 @@
>>    # Control wether Hotspot builds gtest tests
>>    BUILD_GTEST := @BUILD_GTEST@
>> +# Allow overriding the default hotspot library path
>> +HOTSPOT_OVERRIDE_LIBPATH := @HOTSPOT_OVERRIDE_LIBPATH@
>> +
>>    # Control use of precompiled header in hotspot libjvm build
>>    USE_PRECOMPILED_HEADER := @USE_PRECOMPILED_HEADER@
>> diff --git a/make/hotspot/lib/JvmFlags.gmk 
>> b/make/hotspot/lib/JvmFlags.gmk
>> --- a/make/hotspot/lib/JvmFlags.gmk
>> +++ b/make/hotspot/lib/JvmFlags.gmk
>> @@ -95,3 +95,7 @@
>>    ifeq ($(USE_PRECOMPILED_HEADER), false)
>>        JVM_CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
>>    endif
>> +
>> +ifneq ($(HOTSPOT_OVERRIDE_LIBPATH), )
>> +   JVM_CFLAGS += -DOVERRIDE_LIBPATH='"$(HOTSPOT_OVERRIDE_LIBPATH)"'
>> +endif
>> diff --git a/src/hotspot/os/aix/os_aix.cpp 
>> b/src/hotspot/os/aix/os_aix.cpp
>> --- a/src/hotspot/os/aix/os_aix.cpp
>> +++ b/src/hotspot/os/aix/os_aix.cpp
>> @@ -541,7 +541,11 @@
>>    void os::init_system_properties_values() {
>> -#define DEFAULT_LIBPATH "/lib:/usr/lib"
>> +#ifndef OVERRIDE_LIBPATH
>> +   #define DEFAULT_LIBPATH "/lib:/usr/lib"
>> +#else
>> +   #define DEFAULT_LIBPATH OVERRIDE_LIBPATH
>> +#endif
>>    #define EXTENSIONS_DIR   "/lib/ext"
>>        // Buffer that fits several sprintfs.
>> diff --git a/src/hotspot/os/bsd/os_bsd.cpp 
>> b/src/hotspot/os/bsd/os_bsd.cpp
>> --- a/src/hotspot/os/bsd/os_bsd.cpp
>> +++ b/src/hotspot/os/bsd/os_bsd.cpp
>> @@ -316,7 +316,11 @@
>>        //               ...
>>        //               7: The default directories, normally /lib and /usr/lib.
>>    #ifndef DEFAULT_LIBPATH
>> -   #define DEFAULT_LIBPATH "/lib:/usr/lib"
>> +   #ifndef OVERRIDE_LIBPATH
>> +       #define DEFAULT_LIBPATH "/lib:/usr/lib"
>> +   #else
>> +       #define DEFAULT_LIBPATH OVERRIDE_LIBPATH
>> +   #endif
>>    #endif
>>    // Base path of extensions installed on the system.
>> diff --git a/src/hotspot/os/linux/os_linux.cpp 
>> b/src/hotspot/os/linux/os_linux.cpp
>> --- a/src/hotspot/os/linux/os_linux.cpp
>> +++ b/src/hotspot/os/linux/os_linux.cpp
>> @@ -323,10 +323,14 @@
>>        //               1: ...
>>        //               ...
>>        //               7: The default directories, normally /lib and /usr/lib.
>> -#if defined(AMD64) || (defined(_LP64) && defined(SPARC)) || 
>> defined(PPC64) || defined(S390)
>> -   #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib"
>> +#ifndef OVERRIDE_LIBPATH
>> +   #if defined(AMD64) || (defined(_LP64) && defined(SPARC)) || 
>> defined(PPC64) || defined(S390)
>> +       #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib"
>> +   #else
>> +       #define DEFAULT_LIBPATH "/lib:/usr/lib"
>> +   #endif
>>    #else
>> -   #define DEFAULT_LIBPATH "/lib:/usr/lib"
>> +   #define DEFAULT_LIBPATH OVERRIDE_LIBPATH
>>    #endif
>>    // Base path of extensions installed on the system.
>>
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic