Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Coredump in Alpine arm64 platform #24875

Closed
abcfy2 opened this issue Apr 23, 2023 · 30 comments · Fixed by #28258
Closed

Coredump in Alpine arm64 platform #24875

abcfy2 opened this issue Apr 23, 2023 · 30 comments · Fixed by #28258
Assignees
Labels
a:feature A new functionality in:internal-native-libraries bindings for various native APIs
Milestone

Comments

@abcfy2
Copy link

abcfy2 commented Apr 23, 2023

Expected Behavior

Gradle should work on Alpine arm64 platform.

Current Behavior

* What went wrong:
Unable to start the daemon process.
This problem might be caused by incorrect configuration of the daemon.
For example, an unrecognized jvm option is used.
Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/8.1.1/userguide/gradle_daemon.html
Process command line: /usr/lib/jvm/java-1.8-openjdk/bin/java -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -cp /opt/gradle-8.1.1/lib/gradle-launcher-8.1.1.jar -javaagent:/opt/gradle-8.1.1/lib/agents/gradle-instrumentation-agent-8.1.1.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.1.1
Please read the following process output to find out more:
-----------------------
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x000000000002b1c0, pid=227, tid=0x000000550368fac8
#
# JRE version: OpenJDK Runtime Environment (8.0_362-b09) (build 1.8.0_362-b09)
# Java VM: OpenJDK 64-Bit Server VM (25.362-b09 mixed mode linux-aarch64 compressed oops)
# Derivative: IcedTea 3.26.0
# Distribution: Custom build (Tue Mar 21 08:39:12 UTC 2023)
# Problematic frame:
# C  0x000000000002b1c0
#
# Core dump written. Default location: /root/.gradle/daemon/8.1.1/core or core.227
#
# An error report file with more information is saved as:
# /root/.gradle/daemon/8.1.1/hs_err_pid227.log
#
# If you would like to submit a bug report, please include
# instructions on how to reproduce the bug and visit:
#   https://icedtea.classpath.org/bugzilla
#


* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Context (optional)

No response

Steps to Reproduce

Setup QEMU for docker and run:

docker run --rm -it --platform linux/arm64 alpine

Then:

apk add openjdk8
wget https://services.gradle.org/distributions/gradle-8.1.1-bin.zip
unzip gradle-8.1.1-bin.zip
touch build.gradle
gradle-8.1.1/bin/gradle wrapper

Then you can see the output as above. And here is the error log /root/.gradle/daemon/8.1.1/hs_err_pid227.log:

hs_err_pid227.log

Gradle version

8.1.1

Build scan URL (optional)

No response

Your Environment (optional)

No response

@jbartok
Copy link
Member

jbartok commented Apr 24, 2023

Does any other version of Gradle work in this scenario?

@abcfy2
Copy link
Author

abcfy2 commented Apr 24, 2023

Does any other version of Gradle work in this scenario?

No. I tried Gradle 7.3 to 8.1.1, all versions crashed.

@ov7a ov7a removed their assignment Apr 24, 2023
@abcfy2
Copy link
Author

abcfy2 commented Apr 26, 2023

Any updates?

@jbartok jbartok added 👋 team-triage Issues that need to be triaged by a specific team a:feature A new functionality in:native-platform c, cpp, swift and other native languages support, etc and removed to-triage a:bug labels Apr 26, 2023
@lptr
Copy link
Member

lptr commented Apr 27, 2023

Managed to reproduce, looks like this is another one caused by musl :/

Stack:

Stack: [0x0000ffffb50c2000,0x0000ffffb52c2ac8],  sp=0x0000ffffb52c05b0,  free space=2041k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  0x000000000002b1c0
C  [ld-musl-aarch64.so.1+0x65b8c]
C  [ld-musl-aarch64.so.1+0x68ad0]  dlopen+0x73c
V  [libjvm.so+0x52e53c]
V  [libjvm.so+0x52e5f8]
V  [libjvm.so+0x42f3d8]  JVM_LoadLibrary+0xa8
C  [libjava.so+0xec1c]  Java_java_lang_ClassLoader_00024NativeLibrary_load+0x278
j  java.lang.ClassLoader$NativeLibrary.load(Ljava/lang/String;Z)V+0
j  java.lang.ClassLoader.loadLibrary0(Ljava/lang/Class;Ljava/io/File;)Z+328
j  java.lang.ClassLoader.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)V+70
j  java.lang.Runtime.load0(Ljava/lang/Class;Ljava/lang/String;)V+57
j  java.lang.System.load(Ljava/lang/String;)V+7
j  net.rubygrapefruit.platform.internal.NativeLibraryLoader.load(Ljava/lang/String;Ljava/util/List;)V+78
j  net.rubygrapefruit.platform.file.FileEvents.init(Ljava/io/File;)V+47
j  org.gradle.internal.nativeintegration.services.NativeServices$NativeFeatures$1.initialize(Ljava/io/File;Z)Z+5
j  org.gradle.internal.nativeintegration.services.NativeServices.initializeFeatures(Ljava/util/EnumSet;)V+50
j  org.gradle.internal.nativeintegration.services.NativeServices.initialize(Ljava/io/File;Ljava/util/EnumSet;)V+19
j  org.gradle.internal.nativeintegration.services.NativeServices.initializeOnDaemon(Ljava/io/File;)V+9
j  org.gradle.launcher.daemon.bootstrap.DaemonMain.doAction([Ljava/lang/String;Lorg/gradle/launcher/bootstrap/ExecutionListener;)V+213
j  org.gradle.launcher.bootstrap.EntryPoint.run([Ljava/lang/String;)V+12
v  ~StubRoutines::call_stub
V  [libjvm.so+0x3e362c]
V  [libjvm.so+0x573c1c]
V  [libjvm.so+0x574088]
V  [libjvm.so+0x4334ac]  JVM_InvokeMethod+0xe0
j  sun.reflect.NativeMethodAccessorImpl.invoke0(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+0
j  sun.reflect.NativeMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+100
j  sun.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+6
j  java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+56
j  org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(Ljava/lang/String;[Ljava/lang/String;)V+155
j  org.gradle.launcher.bootstrap.ProcessBootstrap.run(Ljava/lang/String;[Ljava/lang/String;)V+2
j  org.gradle.launcher.daemon.bootstrap.GradleDaemon.main([Ljava/lang/String;)V+3
v  ~StubRoutines::call_stub
V  [libjvm.so+0x3e362c]
V  [libjvm.so+0x4179fc]
V  [libjvm.so+0x417cb8]
C  [libjli.so+0x3230]
C  [ld-musl-aarch64.so.1+0x5e9a0]
C  [ld-musl-aarch64.so.1+0x5d1e0]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  java.lang.ClassLoader$NativeLibrary.load(Ljava/lang/String;Z)V+0
j  java.lang.ClassLoader.loadLibrary0(Ljava/lang/Class;Ljava/io/File;)Z+328
j  java.lang.ClassLoader.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)V+70
j  java.lang.Runtime.load0(Ljava/lang/Class;Ljava/lang/String;)V+57
j  java.lang.System.load(Ljava/lang/String;)V+7
j  net.rubygrapefruit.platform.internal.NativeLibraryLoader.load(Ljava/lang/String;Ljava/util/List;)V+78
j  net.rubygrapefruit.platform.file.FileEvents.init(Ljava/io/File;)V+47
j  org.gradle.internal.nativeintegration.services.NativeServices$NativeFeatures$1.initialize(Ljava/io/File;Z)Z+5
j  org.gradle.internal.nativeintegration.services.NativeServices.initializeFeatures(Ljava/util/EnumSet;)V+50
j  org.gradle.internal.nativeintegration.services.NativeServices.initialize(Ljava/io/File;Ljava/util/EnumSet;)V+19
j  org.gradle.internal.nativeintegration.services.NativeServices.initializeOnDaemon(Ljava/io/File;)V+9
j  org.gradle.launcher.daemon.bootstrap.DaemonMain.doAction([Ljava/lang/String;Lorg/gradle/launcher/bootstrap/ExecutionListener;)V+213
j  org.gradle.launcher.bootstrap.EntryPoint.run([Ljava/lang/String;)V+12
v  ~StubRoutines::call_stub
j  sun.reflect.NativeMethodAccessorImpl.invoke0(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+0
j  sun.reflect.NativeMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+100
j  sun.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+6
j  java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+56
j  org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(Ljava/lang/String;[Ljava/lang/String;)V+155
j  org.gradle.launcher.bootstrap.ProcessBootstrap.run(Ljava/lang/String;[Ljava/lang/String;)V+2
j  org.gradle.launcher.daemon.bootstrap.GradleDaemon.main([Ljava/lang/String;)V+3
v  ~StubRoutines::call_stub

@lptr
Copy link
Member

lptr commented Apr 27, 2023

We've been disabling file-system watching as that just did not work with musl at all: gradle/native-platform#283

I wonder why we end up loading it anyway...

@lptr
Copy link
Member

lptr commented Apr 27, 2023

Ah, so what we do in that PR is that we still load the native library for file system watching, but if isGlibc0() returns false, then we choose not to use the functionality to prevent issues with musl. However, it seems that on arm64 we can't even load the library itself, and thus we fail even before we get to call isGlibc0().

What I don't understand is why passing -Dorg.gradle.native=false does not fix the problem. That flag should disable loading any kind of native library, yet I get the same failure...

@lptr lptr removed to-triage 👋 team-triage Issues that need to be triaged by a specific team labels Aug 11, 2023
@lptr
Copy link
Member

lptr commented Aug 11, 2023

Let's at least try to figure out why -Dorg.gradle.native=false did not disable native library loading.

@bratkartoffel
Copy link

bratkartoffel commented Sep 20, 2023

Update on this issue:

Using java 17 or later results in a more informative stacktrace. It seems, that the _init from the library fails.
It can be easily reproduced with the gradle example project and a simple ./gradlew clean. Setting the -Dorg.gradle.native=false does not help.

hs_err_pid: https://tpaste.us/xyRo

Ref: https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/50073

@soloturn
Copy link

@bratkartoffel mind trying with gradl-8.3 and jdk-21 ?

@bratkartoffel
Copy link

Issue still persists: https://tpaste.us/ePYV

@gamecss
Copy link

gamecss commented Oct 1, 2023

So how can I completely disable filesystems watching?
--no-watch-fs and org.gradle.unsafe.watch-fs=false takes no effect

@soloturn
Copy link

soloturn commented Oct 16, 2023

@bratkartoffel @lptr i forwarded your info to the jdk developers list, where @theRealAph would love to know how to easiest run it:

what is the easiest way to reproduce it on cloud, something like: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-arm64.html ?

@bratkartoffel
Copy link

I haven't had any luck in reproducing it neither locally (using qemu-binfmt and podman) nor on aws using ami-0bbd3a96d646dbcd4. I'll try to get an example ready within the next days.

Currently it seems that the crash is only stable reproducible on the alpine builders, which run on lxc afaik.

@theRealAph
Copy link

theRealAph commented Oct 17, 2023 via email

@nekopsykose
Copy link

It seems obvious from the stack trace that this is a crash in ld.so, so there's
no need for either OpenJDK or Gradle to investigate, at least for now.

it crashes in ld.so because the thing being dlopen()'d was built against glibc and there is an ABI mismatch, since the host is not glibc. there is no safe way to load this plugin when the libc abi does not match what it was built against. it should just be skipped entirely.

@nekopsykose
Copy link

(that was already the intention with gradle/native-platform#283 , but for some reason it gets loaded even when disabled, so this issue is that the disable doesn't work)

@soloturn
Copy link

It seems obvious from the stack trace that this is a crash in ld.so, so there's
no need for either OpenJDK or Gradle to investigate, at least for now.

it crashes in ld.so because the thing being dlopen()'d was built against glibc and there is an ABI mismatch, since the host is not glibc. there is no safe way to load this plugin when the libc abi does not match what it was built against. it should just be skipped entirely.

would you mind to be a little more verbose for the less intelligent, or less experienced? how can it be that something on alpine is built against glibc, and what is "the thing" ?

@bratkartoffel
Copy link

bratkartoffel commented Oct 28, 2023

@bratkartoffel what exactly is the host and the container when you say you can reproduce it on alpine builders, running on lxc?

I have to ask on IRC how the builders are set up.
But I finally managed to reproduce it locally on my raspi4 in a docker container:

# work in tempdir
cd $(mktemp -d)

# get example project
wget https://docs.gradle.org/current/samples/zips/sample_building_java_applications-groovy-dsl.zip
unzip sample_building_java_applications-groovy-dsl.zip

# create mock APKBUILD file
cat >APKBUILD <<"EOF"
pkgname=test
pkgver=1
pkgrel=0
pkgdesc="none"
url="https://gradle.org"
arch="noarch"
license="Public Domain"
EOF

# fix permissions
chown 1000:1000 . -R

# run the container
docker run --rm -it -v $(pwd):/opt/work -e DABUILD_ARCH=aarch64 --workdir /opt/work --platform linux/arm64/v8 registry.alpinelinux.org/alpine/docker-abuild:edge ash

##### inside the container #####

# install java
abuild-apk add openjdk17-jdk

# reproduce crash
./gradlew clean

Interesting though, when running a simple alpine:edge container without the building stuff, everyhting seems to work fine:

# same script as above until the "docker run" command
docker run --rm -it -v $(pwd):/opt/work --workdir /opt/work --platform linux/arm64/v8 alpine:edge ash

##### inside the container #####

# install java
apk add openjdk17-jdk

# all good
./gradlew clean

It seems obvious from the stack trace that this is a crash in ld.so, so there's
no need for either OpenJDK or Gradle to investigate, at least for now.

it crashes in ld.so because the thing being dlopen()'d was built against glibc and there is an ABI mismatch, since the host is not glibc. there is no safe way to load this plugin when the libc abi does not match what it was built against. it should just be skipped entirely.

would you mind to be a little more verbose for the less intelligent, or less experienced? how can it be that something on alpine is built against glibc, and what is "the thing" ?

I'm not really an c expert, so please correct me if i understood something wrong.

When a C-library depends on another library, it is compiled against the ABI of the latter. When the application is started, the ld (loader) sees all referenced libraries and tries to load them when needed. The main c library in this case is different, from glibc (the most widely deployed one) to musl libc (in alpine). The main libc is repsonsible for the base functionality provided by the c programing language itself. As glibc is pretty heavy, overloaded and bugged (due to legacy / backwards compatiblity), other implementations (like musl and dietlibc) arised, aiming for stricter implementation of the c standard. As for musl libc this means, each "undefined behaviour" is almost always a crash in the application for security reasons. One example is that glibc oftern ignores use-after-free issues, but musl libc almost certainly crashes the application.

So when a library is built against a specific libc implementation, the compiler may use features specific to this library which makes the application to fail loading when run with the other. Common issues which may be seen are "symbol not found" errors.

In this case, it seems that the "_init" function of the libnative-platform-file-events.so is compiled to use an c library function in a way, which is ok for glibc but not for musl libc. So it could also be compiler bug or specific compiler flag in the gcc version used to compile this native library.

So the questions are:
a) why is the library loaded at all. (should be disabled on musl libc, or at least when using the org.gradle.native=false flag)
b) what's wrong with the library _init method to crash with a SIGSEGV

// Edit:
I think one issue is, that the "is glibc" check itself is native c code from the library, so the crash is trigged during the glibc-check: https://github.com/gradle/native-platform/blob/master/file-events/src/file-events/cpp/linux_fsnotifier.cpp#L383

The other difference i found (when comparing the both containers i used for testing, see above):

ok:

/opt/work # ldd /root/.gradle/native/c067742578af261105cb4f569cf0c3c89f3d7b1fecec35dd04571415982c5e48/linux-aarch64/libnative-platform.so
        /lib/ld-musl-aarch64.so.1 (0x7fa83ee000)
Error loading shared library libstdc++.so.6: No such file or directory (needed by /root/.gradle/native/c067742578af261105cb4f569cf0c3c89f3d7b1fecec35dd04571415982c5e48/linux-aarch64/libnative-platform.so)
        libm.so.6 => /lib/ld-musl-aarch64.so.1 (0x7fa83ee000)
Error loading shared library libgcc_s.so.1: No such file or directory (needed by /root/.gradle/native/c067742578af261105cb4f569cf0c3c89f3d7b1fecec35dd04571415982c5e48/linux-aarch64/libnative-platform.so)
        libc.so.6 => /lib/ld-musl-aarch64.so.1 (0x7fa83ee000)

not ok:

/opt/work $ ldd /home/builder/.gradle/native/38dada09dfb8b06ba9b0570ebf7e218e3eb74d4ef43ca46872605cf95ebc2f47/linux-aarch64/libnative-platform-file-events.so
        /lib/ld-musl-aarch64.so.1 (0x7f9b650000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f9b349000)
        libm.so.6 => /lib/ld-musl-aarch64.so.1 (0x7f9b650000)
        libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f9b318000)
        libpthread.so.0 => /lib/ld-musl-aarch64.so.1 (0x7f9b650000)
        libc.so.6 => /lib/ld-musl-aarch64.so.1 (0x7f9b650000)
Error relocating /home/builder/.gradle/native/38dada09dfb8b06ba9b0570ebf7e218e3eb74d4ef43ca46872605cf95ebc2f47/linux-aarch64/libnative-platform-file-events.so: __getauxval: symbol not found

After some testing, I found out:

@bratkartoffel
Copy link

bratkartoffel commented Oct 28, 2023

I haven't had any luck in reproducing it neither locally (using qemu-binfmt and podman) nor on aws using ami-0bbd3a96d646dbcd4. I'll try to get an example ready within the next days.

Currently it seems that the crash is only stable reproducible on the alpine builders, which run on lxc afaik.

@soloturn
The issue can now also be reproduced on aws (ami-0bbd3a96d646dbcd4 on a t4g.micro instance):

# install packages
doas apk add openjdk17-jdk libstdc++

# work in tempdir
cd $(mktemp -d)

# get example project
wget https://docs.gradle.org/current/samples/zips/sample_building_java_applications-groovy-dsl.zip
unzip sample_building_java_applications-groovy-dsl.zip

# reproduce crash
./gradlew clean

After removing the libstdc++ package (doas apk del libstdc++) it works again.

After some searchin, i stumbled accross cloudius-systems/osv#1129 and punitagrawal/osv@63fc92b. Can someone please rebuild the native library with the -mno-outline-atomics compiler option? Should be set somewhere near https://github.com/gradle/native-platform/blob/master/file-events/build.gradle#L40

@danielfariati
Copy link

@jbartok Shouldn't this be tagged as a bug instead of a feature? (tagging you since you changed the issue from bug to feature, sorry if I wasn't supposed to do that)
Especially since there is no way to disable the lib to load, as reported before.

@bratkartoffel
Copy link

bratkartoffel commented Nov 27, 2023

@lptr Although aarch64 is not my primary platform, this issue is still pretty nasty and blocks some stuff on my side. Is there anything I can do to help you fix this?

@Mahoney
Copy link
Contributor

Mahoney commented Dec 4, 2023

As requested on the gradle slack I've created a minimal reproduction project here:
https://github.com/Mahoney-bug-examples/gradle-alpine-arm-bug

@lptr lptr added in:internal-native-libraries bindings for various native APIs and removed in:native-platform c, cpp, swift and other native languages support, etc labels Dec 7, 2023
@andrefaria
Copy link

Hey guys, I hope all is well!
Any plans of merging bratkartoffel PR?

@asodja
Copy link
Member

asodja commented Feb 9, 2024

I took a look at the PR and I was able to build it for all platforms with few modifications. But I need to test if that solution works.

I also looked at fixing the -Dorg.gradle.native=false flag. I now understand why it doesn't work and hopefuly fixing this could provide a workaround for the original issue.

@asodja
Copy link
Member

asodja commented Feb 23, 2024

A fix (#28021) to not load native services with -Dorg.gradle.native=false argument or org.gradle.native=false entry in gradle.properties is now merged to master and available with latest 8.8-20240223101737+0000 nightly. It will be in Gradle 8.8.

I tested the flag with a reproducer from #24875 (comment) and build runs succesfully with -Dorg.gradle.native=false.

There is more work required to fix a problem without manually setting a flag though.

@lptr
Copy link
Member

lptr commented Feb 26, 2024

Here's an idea about a more permanent fix:

  1. As @asodja mentioned above, starting with Gradle 8.8 it will be possible to actually disable loading native support, which will unblock Alpine builds, though at the cost of some inconvenience, plus some loss in performance.

  2. We implement a way to detect Alpine in Gradle, and automatically disable loading native libraries, so we remove the inconvenience. This might also fit into the 8.8 timeframe. See Detect Alpine Linux/Musl and disable loading native libraries #28243.

  3. a) Ship a Musl-specific variant of native-platform binaries using the current C++ code.

or:

  1. b) Rewrite native-platform in Rust, and ship a Musl-specific variant that way.

I don't know when either option of 3) we can do, and I'd much rather invest into using Rust than to keep maintaining the C/C++ code we currently have.

@tkcontiant
Copy link

The workaround for that issue at least in my case is to export that ENV in my container.

export GRADLE_OPTS="--add-opens=java.base/java.util=ALL-UNNAMED \
  --add-opens=java.base/java.lang=ALL-UNNAMED \
  --add-opens=java.base/java.lang.invoke=ALL-UNNAMED \
  --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED \
  --add-opens=java.base/java.nio.charset=ALL-UNNAMED \
  --add-opens=java.base/java.net=ALL-UNNAMED \
  --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED \
  -XX:MaxMetaspaceSize=256m \
  -XX:+HeapDumpOnOutOfMemoryError \
  -Xms256m -Xmx512m -Dfile.encoding=UTF-8 \
  -Duser.country=US -Duser.language=en -Duser.variant"
gradle whatever..

@Mahoney
Copy link
Contributor

Mahoney commented Feb 28, 2024

FWIW my minimal reproduction above (https://github.com/Mahoney-bug-examples/gradle-alpine-arm-bug) builds with gradle 8.8-20240228002527+0000 without the -Dorg.gradle.native=false flag. Of course it does virtually nothing (no plugins, not even a build.gradle) so YMMV.

@lptr
Copy link
Member

lptr commented Mar 4, 2024

Thanks for checking it @Mahoney.

@tkcontiant which issue does this variable fix? I might be missing something, but I don't see anything among those options that would affect native library loading.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
a:feature A new functionality in:internal-native-libraries bindings for various native APIs
Projects
None yet