Originally posted on 2020-10-23
I was recently running a Java application on an aarch64 system with Alpine Linux that needed to load a native library. Unfortunately for me the system is using musl libc and the library requires glibc.
I installed gcompat thinking it would magically fix it but it didn't. I dug deeper and figured out that my Java needed a quick mod to get it to use the gcompat layer.
scanelf says Java is using musl and therefore gcompat won't be able to intercept it:
$ scanelf -i /usr/bin/java
TYPE INTERP FILE
ET_DYN /lib/ld-musl-aarch64.so.1 /usr/bin/javagcompat's site says we need to use PatchELF in this case. So here's what we do...
Get some packages to build PatchELF:
apk add git autoconf automake gcc g++ makeGet PatchELF:
git clone https://github.com/NixOS/patchelf.gitBuild and install it (NOTE: --disable-dependency-tracking may not be necessary on all platforms):
cd patchelf
./bootstrap.sh
./configure --disable-dependency-tracking
make
make check
make installPatch Java:
patchelf --set-interpreter /lib/ld-linux-aarch64.so.1 /usr/bin/javascanelf shows it was updated:
$ scanelf -i /usr/bin/java
TYPE INTERP FILE
ET_DYN /lib/ld-linux-aarch64.so.1 /usr/bin/javaAnd now Java works with the native library. Great!