From f505421974cfe1681a18fa4a9171363cbc70133e Mon Sep 17 00:00:00 2001 From: Peter Shipton Date: Thu, 21 Sep 2023 09:08:49 -0400 Subject: [PATCH] Look for -XX:[+/-]UseZlibNX on AIX AIX puts zlibNX on the LIBPATH when running on P9 or later, but having this in the environment may cause some things, such as git clone, to fail when exec'ed from Java. For example, `fatal: pack has bad object at offset 3872100: inflate returned -5` Backport of https://github.com/ibmruntimes/openj9-openjdk-jdk/pull/664 Signed-off-by: Peter Shipton --- .../unix/native/libjli/java_md_solinux.c | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/java.base/unix/native/libjli/java_md_solinux.c b/src/java.base/unix/native/libjli/java_md_solinux.c index 80ee2269457..b495cd02278 100644 --- a/src/java.base/unix/native/libjli/java_md_solinux.c +++ b/src/java.base/unix/native/libjli/java_md_solinux.c @@ -25,7 +25,7 @@ /* * =========================================================================== - * (c) Copyright IBM Corp. 2020, 2021 All Rights Reserved + * (c) Copyright IBM Corp. 2020, 2023 All Rights Reserved * =========================================================================== */ @@ -385,12 +385,35 @@ CreateExecutionEnvironment(int *pargc, char ***pargv, * o $JVMPATH (directory portion only) * o $JRE/lib * o $JRE/../lib - * o ZLIBNX_PATH (for AIX P9 or newer systems with NX) + * o ZLIBNX_PATH (for AIX P9 or newer systems with NX, unless -XX:-UseZlibNX is set) * * followed by the user's previous effective LD_LIBRARY_PATH, if * any. */ +#ifdef AIX + int aixargc = *pargc - 1; // skip the launcher name + char **aixargv = *pargv + 1; + const char *aixarg = NULL; + jboolean useZlibNX = JNI_TRUE; + while (aixargc > 0 && *(aixarg = *aixargv) == '-') { + if (JLI_StrCmp(aixarg, "-XX:+UseZlibNX") == 0) { + useZlibNX = JNI_TRUE; + } else if (JLI_StrCmp(aixarg, "-XX:-UseZlibNX") == 0) { + useZlibNX = JNI_FALSE; + } + aixargc--; + aixargv++; + } + useZlibNX = useZlibNX && power_9_andup() && power_nx_gzip(); + if (JLI_IsTraceLauncher()) { + printf("Add " ZLIBNX_PATH " to the LIBPATH: %s P9+ %s NX %s\n", + useZlibNX ? "TRUE" : "FALSE", + power_9_andup() ? "TRUE" : "FALSE", + power_nx_gzip() ? "TRUE" : "FALSE"); + } +#endif + runpath = getenv(LD_LIBRARY_PATH); /* runpath contains current effective LD_LIBRARY_PATH setting */ @@ -400,9 +423,9 @@ CreateExecutionEnvironment(int *pargc, char ***pargv, 2 * JLI_StrLen(jrepath) + #ifdef AIX /* On AIX we additionally need 'jli' in the path because ld doesn't support $ORIGIN. */ - JLI_StrLen(jrepath) + JLI_StrLen("/lib//jli:") + - /* On AIX P9 or newer with NX accelerator enabled, add the accelerated zlibNX to LIBPATH */ - ((power_9_andup() && power_nx_gzip()) ? JLI_StrLen(":" ZLIBNX_PATH) : 0) + + JLI_StrLen(jrepath) + JLI_StrLen("/lib/jli:") + + /* On AIX P9 or newer with NX accelerator enabled, add the accelerated zlibNX to LIBPATH. */ + (useZlibNX ? JLI_StrLen(":" ZLIBNX_PATH) : 0) + #endif JLI_StrLen(new_jvmpath) + 52; new_runpath = JLI_MemAlloc(new_runpath_size); @@ -436,7 +459,7 @@ CreateExecutionEnvironment(int *pargc, char ***pargv, #endif jrepath #ifdef AIX - , ((power_9_andup() && power_nx_gzip()) ? (":" ZLIBNX_PATH) : "") + , (useZlibNX ? (":" ZLIBNX_PATH) : "") #endif );