2012-01-22 6 views
4

AIX 6.1 ppc64では、libm.aをロードするために、アプリケーションでSystem.loadLibrary("m")が使用されます。 それとも、モジュールは32ビットと64ビットのバイナリとの間に不一致がある場合にこの現象が発生することができ、IBMの資料によると、無効なマジックナンバーAIX 6.1でJava System.loadLibrary( "m")が失敗する

を持っているエラーメッセージ

で失敗します。これは、Java6(32ビット)またはJava6_64(64ビット)のJVMを使用する場合でも発生します。 そうではありません。

もう1つの考えられる原因は/usr/lib/libm.aです。共有ライブラリではありません。しかし、私たちは使用するプラットフォーム上で共有モードlibm.aを見つけることができません!

System.loadLibrary( "name")のJavadocに準拠しているため、実際のライブラリへの "name"のマッピングはシステムによって異なります。ほとんどのUnixシステムでは、lib.soにマップされ、AIXではlib.aにマッピングされます。 AIXでは、.aはハイブリッドであることに注意してください。静的オブジェクトと共有オブジェクトの両方、32ビットオブジェクトと64ビットオブジェクトを含むことができます。私の問題は、AIX上で共有モードlibm.aを見つけることです。

System.loadLibrary("m")を使用してlibm.aをロードする方法を知っている人はいますか?

P.S System.loadLibrary("m")は、テスト済みのほとんどのUNIXプラットフォームで問題なく動作します。

+5

Linux/Unix環境では通常はコンパイルされた静的オブジェクトで、バイナリ形式でリンクする必要があるファイルは「.a」で終わるファイルではありませんか? AFAIK、共有オブジェクト(動的ライブラリ)は.soで終わります。 – esaj

+1

共有ライブラリは動的にしかロードできません。 '.a'ライブラリをプログラムにコンパイルする必要があります。 JVMの場合は、JVMをビルドします。 –

+2

Javadocへのアクセス、System.loadLibrary( "name")では、実際のライブラリへの "name"のマッピングはシステムによって異なります。ほとんどのUnixシステムでは、lib .soにマッピングされ、AIXではlib .aにマップされます。 AIXでは、.aはハイブリッドであることに注意してください。静的オブジェクトと共有オブジェクトの両方、32ビットオブジェクトと64ビットオブジェクトを含むことができます。私の問題は、AIX上の共有モードlibm.aを見つけることです... –

答えて

0

libm.aが共有ライブラリであることを確認するには、 'dump -H'(lddのAIXに相当)を使用できます。 'file'コマンドは32ビットと64ビットのライブラリを区別する必要がありますが、AIXはハイブリッド32と64ビットを1つのライブラリでサポートしています。ファイルが正常に表示されたら、アプリが「truss」を使用して適切なlibmをロードしていることを確認します。

+0

さて、私はすでにそれをしています。dump -vo show "Loader Section is not available"であり、libc.aのような "shr.o"はありません。それが私がそれが静的な図書館だと言った理由です。私の質問はどこで "libm.a"またはそれと同等の共有バージョンを見つけることができるかです。 –

+0

libm.aはおそらくAIX数学ライブラリです。このライブラリのバンドル版は時々バグがあります。 GNU数学ライブラリのAIX版を作成するのが最も簡単かもしれません。たとえば、http://sourceware.org/ml/libc-help/2008-06/msg00049.htmlを参照してください。 GNU libcの –

+0

もう1つの考え方 - 既にLinux上でアプリケーションをテストしたことがあるならば、AIX版のGNU libm共有ライブラリをバンドルする必要がある場合でも、GNU libmを使ってJavaコードからの移植性を高めることができます。 –

関連する問題