【问题标题】:dlopen failing on Rhel 7.2, 64 bit for libjvm.sodlopen 在 Rhel 7.2 上失败,libjvm.so 的 64 位
【发布时间】:2017-02-02 19:46:52
【问题描述】:

我在 64 位 Java 进程中在 RHEL 64 上调用 dlopen ("libjvm.so", RTLD_NOLOAD)。它失败并出现错误:

 libjvm.so: invalid mode for dlopen(): Invalid argument

我做了lsof -p <pid of java process>,它显示 libjvm.so 作为加载的模块。 libjvm.so 从路径jre1.8.0_121/lib/amd64/server/libjvm.so 加载。 无法找到有关该错误的更多信息。使用 32 位版本的 java 时,同样的事情工作正常。从 lib/i386/client 目录加载 libjvm.so 的位置。感谢有关在哪里查找原因或此错误的真正含义的任何指示。谢谢。

【问题讨论】:

    标签: c++ dlopen rhel7


    【解决方案1】:

    invalid mode for dlopen()

    这是正确的错误:您使用无效模式调用了dlopen

    来自dlopen man page

    One of the following two values must be included in flags:
       RTLD_LAZY ...
       RTLD_NOW  ...            
    

    【讨论】:

    • 感谢您的回复。让我试一试.. 但是在使用 32 位 Java 进程时,同样的事情也能正常工作......我不想加载那个库..我只想处理已经加载的那个。
    • 感谢您的回复.. RTLD_LAZY | RTLD_NOLOAD 正在工作.. 我不知道为什么 64x 需要这样做 .. 在 32 上它只适用于 RTLD_NOLOAD..
    • 我刚刚检查了 GLIBC 来源,并在 1998 年添加了对“必须设置 RTLD_{NOW,LAZY} 之一”的检查。我无法解释为什么这在 32 位模式下对您有效;它不应该。在我的系统上尝试dlopen("libc.so.6", RTLD_NOLOAD) 的简单测试在 32 位和 64 位模式下均失败。
    • 感谢@Employed 俄语。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多