Java JNI在Linux上加载libc.so时出现问题,尝试加载ASCII/usr/lib64/libc.so,发现它确实不是ELF文件

标签 java amazon-ec2 java-native-interface libc libsodium

我正在开发一些使用 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是 native 上的 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 的符号链接(symbolic link),并得到了略有不同的错误:

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 库 shim。
2、在机器上编译安装对应版本的libsodium,放置在/usr/local/lib/libsodium.so.18
3. 通过添加新行来更新/etc/ld.so.conf /usr/local/lib
4. 运行sudo ldconfig

现在我的工具可以工作了!

关于Java JNI在Linux上加载libc.so时出现问题,尝试加载ASCII/usr/lib64/libc.so,发现它确实不是ELF文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39781496/

相关文章:

java - Play Framework : JDBC connection vs JDBC datasource

amazon-web-services - 如何使用云模板添加存储?

amazon-web-services - AWS CloudFormation,堆栈更新不会修改我的 EC2 配置

java - 不满意的链接错误帮助 Java JNI Eclipse

java - RESTful 服务 - 避免堆栈跟踪到客户端

java - 共享变量的测试方法

java - Android客户端套接字无法连接到服务器

amazon-ec2 - 无法连接到AWS机器: operation timed out

java - 创建时调用的 JNI 方法对象

Java 到 C 对象传递