2

暗号化に libsodium を使用するソフトウェアの開発に取り組んでいます...<a href="https://github.com/joshjdevl/libsodium-jni" rel="nofollow">Java で。macOS 10.11/10.12 と Ubuntu Server 16.04 の両方で問題なく動作しました。Amazon Linux を使用して Amazon EC2 インスタンスでソフトウェアを実行しようとすると ( return )、次のエラーが発生しますuname -aLinux 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

このマシンのASCIIlibc.soファイルは次のとおりです。

/* 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 のネイティブ クラスが理解できるパスにライブラリ ファイルが含まれています。

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を介して) 引き続き使用したいのですが、ここで壁にぶつかっています。このプロジェクトでは多くのプラットフォームの互換性が重要であるため、別のライブラリに切り替える必要がある場合があります。

4

1 に答える 1

1

私は自分の問題を解決することができました。

1.問題のマシンで/を
使用して JNI ライブラリ shim を再コンパイルします。 2. 対応するバージョンの libsodium をコンパイルしてマシンにインストールし、次の場所に置き ます。 3. 新しい行を追加して /etc/ld.so.conf を更新します 。 4. 実行します。libsodiumjni.solibsodiumjni.jnilib
/usr/local/lib/libsodium.so.18
/usr/local/lib
sudo ldconfig

今私のツールが動作します!

于 2016-09-30T14:51:00.333 に答える