2016-09-29 1 views
0

Я работаю над некоторым программным обеспечением, которое использует 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), но я нахожусь здесь. Возможно, придется переключиться на другую библиотеку, поскольку для этого проекта важна многоплатформенная совместимость.

ответ

0

Мне удалось исправить мою проблему.

Put широко, шаги, которые я затем были:
1. Рекомпилированные библиотека прокладок JNI с помощью libsodiumjni.so/libsodiumjni.jnilib на машине в вопросе.
2. Обобщение и установить соответствующую версию libsodium на машине, поместив его в /usr/local/lib/libsodium.so.18
3. Обновление /etc/ld.so.conf путем добавления новой строки /usr/local/lib
4. Запустите sudo ldconfig

сейчас мой инструмент работает!