我正在开发一些使用 libsodium 进行加密的软件……<a href="https://github.com/joshjdevl/libsodium-jni" rel="nofollow">在 Java 中。它在 macOS 10.11/10.12 和 Ubuntu Server 16.04 上都运行良好。当我尝试在带有 Amazon Linux 的 Amazon EC2 实例上运行我的软件时(uname -a
返回Linux ip-$IPADDR 4.4.19-29.55.amzn1.x86_64 #1 SMP Mon Aug 29 23:29:40 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
),我收到此错误:
java.lang.UnsatisfiedLinkError: /home/ec2-user/myproject/target/classes/linux-x86-64/libsodiumjni.so: /usr/lib64/libc.so: invalid ELF header
原来libc.so
是这台机器上的一个 ASCII 文件:
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )
我尝试使用参数运行我的代码,-Djava.library.path=/lib64/:…:$NORMALLIBRARYPATH
希望让加载程序尝试/lib64/libc.so.6
,但它没有工作。
导致 libsodiumjni.so 被加载的代码部分是:
import com.sun.jna.Native;
…
File libraryFile = Native.extractFromResourcePath(libraryName);
System.load(libraryFile.getAbsolutePath());
在我的项目中,目录结构包括 JNA 的 Native 类可以理解的路径中的库文件:
src/main/resources
├── darwin
│ └── libsodiumjni.dylib
└── linux-x86-64
└── libsodiumjni.so
在云雀中,我删除了 ASCII libc.so 并将其替换为 /lib64/libc-2.17.so 的符号链接,并得到了一个稍微不同的错误:
java.lang.UnsatisfiedLinkError: /home/ec2-user/myproject/target/classes/linux-x86-64/libsodiumjni.so: /lib64/libc.so.6: version `LIBC' not found (required by /home/ec2-user/myproject/target/classes/linux-x86-64/libsodiumjni.so
我真的不确定该怎么做。我真的很想继续使用 libsodium(通过libsodium-jni),但我在这里碰壁了。可能必须切换到不同的库,因为多平台兼容性对于这个项目很重要。