【问题标题】:Java System.loadLibrary("m") fails on AIX 6.1Java System.loadLibrary("m") 在 AIX 6.1 上失败
【发布时间】:2012-02-16 04:49:17
【问题描述】:

在 AIX 6.1 ppc64 上,为了加载 libm.a,我们的应用程序使用 System.loadLibrary("m")。 或者它失败并显示错误消息

模块的幻数无效

根据 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吗?

附言 System.loadLibrary("m") 在我们测试过的大多数 UNIX 平台上都能正常工作。

【问题讨论】:

  • 可能是错的,但在 Linux/Unix 环境中以“.a”结尾的文件不是通常编译的静态对象,需要链接以形成二进制文件吗? AFAIK,共享对象(动态库)以 .so 结尾。
  • 只能动态加载共享库。 .a 库需要编译到程序中。对于 JVM,在构建 JVM 时。
  • 根据 Javadoc,在 System.loadLibrary("name") 中,“name”到真实库的映射取决于系统。在大多数 Unix 系统上,它被映射到 lib.so,而在 AIX 上,它被映射到 lib.a ;请注意,在 AIX 上,.a 可以是混合的,即。它可以包含静态和共享对象,32 位和 64 位对象。我的问题是在 AIX 上找到一个共享模式 libm.a...
  • @esaj:AIX 在这方面有点奇怪。引用手册:“AIX 上共享对象的命名约定是 name.o”和“AIX 上共享库的命名约定格式为 libname.a”publib.boulder.ibm.com/infocenter/comphelp/v7v91/…
  • 您能解释一下为什么需要从 Java 加载 libm 吗?

标签: java native aix loadlibrary


【解决方案1】:

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

【讨论】:

  • 好吧,我已经这样做了。 dump -vo 显示“Loader Section is not available”,并且没有像 libc.a 中的“shr.o”。这就是为什么我说它是一个静态库。我的问题是在哪里可以找到“libm.a”或同等版本的共享版本。
  • libm.a 可能是 AIX 数学库。这个库的捆绑版本有时是错误的;您可能会发现构建 GNU 数学库的 AIX 版本是最容易的,例如,请参阅 sourceware.org/ml/libc-help/2008-06/msg00049.html 以获取一些可以帮助您独立于 GNU libc 构建它的说明。
  • 另一个想法 - 如果您已经在 Linux 上测试过您的应用程序,您可能会发现使用 GNU libm 可以为您的 Java 代码提供更好的可移植性,即使您必须捆绑 GNU您的 AIX 版本的 libm 共享库。
  • 谢谢。那可能是一个解决方案。但奇怪的是 IBM 没有为用户提供可加载的共享模式 libm.a,就像他们为 libc.a 所做的那样
  • 对于 aix 上的 MATH lib,使用 AIX 的 GCC 版本:libmpc.q(shr.o) 或 libmpc.so.2。它们都是共享模式库。
【解决方案2】:

在 AIX 上,分发时附带的共享对象放在ar-archives 中,例如在 32 位中,它是:

System.load("/usr/lib/libbsd.a(shr.o)")

在 64 位中:

System.load("/usr/lib/libbsd.a(shr_64.o)")

遗憾的是,libm.a 不包含任何共享对象(只有普通的.o 对象模块),因此无法进行动态链接。

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 2011-10-14
    • 2013-03-11
    • 1970-01-01
    • 2014-01-26
    • 2012-12-21
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多