[PATCH v2] Add a flag for overriding default JNI library search path
Erik Joelsson
erik.joelsson at oracle.com
Mon Nov 26 21:04:22 UTC 2018
Hello,
It's still not handling the bad yes/no values.
/Erik
On 2018-11-26 12:51, 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.
>
> 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,
>
> Jakub
>
> # HG changeset patch
> # User Jakub Vaněk <linuxtardis at 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=<feature>[,<feature>...]</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=<bits></code> - Create a target binary suitable for running on a <code><bits></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=<path></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=<path></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.
>
More information about the build-dev
mailing list