Java System.loadLibrary("m") 在 AIX 6.1 上失败

6
在AIX 6.1 ppc64上,为了加载libm.a,我们的应用程序使用System.loadLibrary("m")。否则会出现以下错误信息:
the module has invalid magic number 根据IBM文档,当32位和64位二进制文件不匹配时,可能会发生这种情况。但是,无论我们使用Java6(32位)还是Java6_64(64位)JVM,都不是这种情况。
另一个可能的原因是/usr/lib/libm.a不是共享库。但是我们找不到平台上可用的共享模式libm.a!
根据Javadoc,在System.loadLibrary("name")中,“name”的映射到实际库的方式取决于系统。在大多数Unix系统上,它被映射到lib.so,而在AIX上,它被映射到lib.a;请注意,在AIX上,.a可以是混合型的,即它既可以包含静态对象和共享对象,也可以包含32位和64位对象。我的问题是如何在AIX上找到共享模式的libm.a。
有人知道如何使用System.loadLibrary("m")来加载libm.a吗?
P.S 在我们测试过的大多数UNIX平台上,System.loadLibrary("m")都能正常工作。

5
可能有误,但是在Linux/Unix环境中以“.a”结尾的文件通常是编译静态对象,需要链接才能形成二进制文件。据我所知,共享对象(动态库)以“.so”结尾。 - esaj
1
你只能动态加载共享库。.a 库需要编译到程序中。在 JVM 的情况下,当你构建 JVM 时。 - Peter Lawrey
2
根据Javadoc,在System.loadLibrary("name")中,“name”的映射到实际库的方式取决于系统。在大多数Unix系统上,它被映射到lib<name>.so,而在AIX上,则被映射到lib<name>.a;请注意,在AIX上,.a可以是混合的,即它可以包含静态和共享对象,32位以及64位对象。我的问题是在AIX上找到一个共享模式的libm.a... - Chen Nam Sit
1
你能解释一下为什么需要从Java加载libm吗? - Mat
事实上,我正在使用JNA访问本地库。虽然我已经将JNA移植到aix-ppc和aix-ppc64,并通过了94%的JUNIT测试,但我仍然在使用JNA的Native.loadLibrary("m")时遇到一些问题。它失败并显示相同的错误消息:该模块具有无效的幻数。因此,我想通过尝试查看纯Java System.loadLibrary()的行为来简化问题。不幸的是,它的行为也是相同的。如果我能找到AIX上的共享模式libm.a,那就太好了。我也在谷歌上搜索过这个问题,但总是没有成功。 - Chen Nam Sit
显示剩余2条评论
2个回答

1
在AIX上,随着发行版提供的共享对象被放置到ar档案中,例如在32位系统中:
System.load("/usr/lib/libbsd.a(shr.o)")

在64位系统中:
System.load("/usr/lib/libbsd.a(shr_64.o)")

可悲的是,libm.a 没有包含任何共享对象(只有普通的 .o 对象模块),因此动态链接不可能。


1
您可以使用'dump -H'(AIX的ldd等效物)来验证libm.a是共享库。 'file'命令应该可以区分32位和64位库,但AIX还支持在一个库中混合32位和64位。如果文件看起来正常,请使用'truss'检查您的应用程序是否正在加载正确的libm。

好的,我已经完成了。dump -vo show “Loader Section is not available”,并且没有像libc.a中的“shr.o”那样的文件。这就是为什么我说它是一个静态库。我的问题是在哪里可以找到"libm.a"或等效的共享版本。 - Chen Nam Sit
libm.a 可能是 AIX 数学库。这个库的捆绑版本有时会出现错误;你可能会发现最简单的方法是构建 GNU 数学库的 AIX 版本,例如请参见 http://sourceware.org/ml/libc-help/2008-06/msg00049.html,其中提供了一些可能帮助你独立构建它的指令。 - Colm Smyth
另一个想法 - 如果您已经在Linux上测试了您的应用程序,您可能会发现使用GNU libm从您的Java代码提供更好的可移植性,即使您不得不为您的AIX版本捆绑GNU libm共享库。 - Colm Smyth
谢谢。那可能是一个解决方案。但是IBM没有像为libc.a做的那样为用户提供可加载的共享模式libm.a,这很奇怪。 - Chen Nam Sit
在AIX上使用MATH库时,请使用AIX的GCC版本:libmpc.q(shr.o)或libmpc.so.2。它们都是共享模式库。 - Chen Nam Sit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接