Я работаю над некоторым программным обеспечением, которое использует libsodium для криптографии ... in Java , Он отлично работает для меня как на macOS 10.11/10.12, так и на Ubuntu Server 16.04. Когда я пытаюсь запустить мою программу на Амазонка EC2 инстанции с Amazon Linux (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 JNI вызывает загрузку libc.so в Linux, пытается загрузить ASCII /usr/lib64/libc.so и обнаруживает, что это действительно не файл ELF
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());
Внутри моего проекта, структура каталогов содержит файлы библиотек в пути, которые Родной класс ЮНА в Понимает:
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), но я нахожусь здесь. Возможно, придется переключиться на другую библиотеку, поскольку для этого проекта важна многоплатформенная совместимость.