我正在开发一些使用libsodium进行加密的软件... in 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),但是我在这里碰壁。可能必须切换到其他库,因为多平台兼容性对该项目很重要。

最佳答案

我设法解决了我的问题。

概括地说,我遵循的步骤是:
1.在相关计算机上使用libsodiumjni.so / libsodiumjni.jnilib重新编译JNI库填充程序。
2.在计算机上编译并安装相应版本的libsodium,并将其放置在/usr/local/lib/libsodium.so.18
3.通过添加新行/usr/local/lib更新/etc/ld.so.conf。
4.运行sudo ldconfig

现在我的工具开始工作了!

10-08 20:16