【问题标题】:Java JNI issues loading libc.so on Linux, tries to load an ASCII /usr/lib64/libc.so and finds that it is indeed not an ELF fileJava JNI 在 Linux 上加载 libc.so 时出现问题,尝试加载 ASCII /usr/lib64/libc.so 并发现它确实不是 ELF 文件
【发布时间】:2016-09-30 22:51:00
【问题描述】:

我正在开发一些使用 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),但我在这里碰壁了。可能必须切换到不同的库,因为多平台兼容性对于这个项目很重要。

【问题讨论】:

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


    【解决方案1】:

    我设法解决了我的问题。

    概括地说,我遵循的步骤是:
    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

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

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 2015-07-21
      • 2015-06-02
      • 2012-11-27
      • 1970-01-01
      • 2019-07-19
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多