【问题标题】:relocation truncated to fit error : R_X86_64_32 against symbol重定位被截断以适应错误:针对符号的 R_X86_64_32
【发布时间】:2014-08-13 16:45:07
【问题描述】:

我正在通过在 c++ main 中调用 java 函数来测试一个简单的 jni 示例(在 Windows 7 上)。

我读到“重定位被截断以适应”错误是由于一个大型项目(不是这种情况:只是一个名为 Sample 的 main 和一个编译的 java 类,带有一个静态方法 intMethod(int)),链接不同的目标文件订单(我只有一个目标文件),或扩展映射方案...stack overflow thread

我使用以下编译命令行: g++ -D __int64="long long" -I"C:\Program Files\Java\jdk1.7.0_55\include" -I"C:\Program Files\Java\jdk1.7.0_55\include\win32" -L"C:\Program Files\Java\jdk1.7.0_55\lib" -o sample sample.cpp -ljvm

和我的主要功能:

#include <jni.h>
#include <cstring>
#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif

int main()
{
   JavaVMOption options[1];
   JNIEnv *env;
   JavaVM *jvm;
   JavaVMInitArgs vm_args;
   long status;
   jclass cls;
   jmethodID mid;
   jint square;
   jboolean no;
   options[0].optionString ="-Djava.class.path=.";

   //memset(&vm_args, 0, sizeof(vm_args));
   vm_args.version = JNI_VERSION_1_6;
   vm_args.nOptions = 1;
   vm_args.options = options;

   status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
   cls = env->FindClass("Sample");
   mid = env->GetStaticMethodID(cls, "intMethod", "(I)I");
   if(mid !=0)
    {  square = env->CallStaticIntMethod(cls, mid);
       printf("Result of intMethod: %d\n", square);
    }
   jvm->DestroyJavaVM();
   return 0;
}

错误如下:

C:\Program Files\Java\jdk1.7.0_55\lib/jvm.lib(jvm.dll.b):(.text+0x2):重定位被截断以适应:R_X86_64_32 对 .idata 节中定义的符号 __imp_JNI_CreateJavaVM $5 在 C:\Program Files\Java\jdk1.7.0_55\lib/jvm.lib(jvm.dll.b)

错误:collect2:ld 返回 1 个退出状态

似乎在任何地方都找不到关于如何有条不紊地处理此错误的好答案!


-> 解决方法: 在编译中添加-L"C:\Program Files\Java\jdk1.7.0_55\jre\bin\server"

【问题讨论】:

标签: compiler-errors jvm java-native-interface g++


【解决方案1】:

为了澄清编辑到问题中的解决方案,链接器命令行应包含-L/path/to/jre/bin/server(其中包含jvm.dll)。它不应包含-L/path/to/jdk/lib(其中包含jvm.lib)。

我不熟悉传统的 Windows 开发,所以我无法解释这里发生了什么。我假设提问者和我一样在 Cygwin 上工作。

请注意,您运行的程序 /path/to/jre/bin/server 也必须在您的 PATH 上(与 Linux 上的 LD_LIBRARY_PATH 提供相同的功能)。

【讨论】:

    【解决方案2】:

    截断是指存储的重定位偏移量,而不是符号的标签。我相信您的解决方案可能会在here 找到。

    【讨论】:

    • 如果您认为链接问题的答案可以回答此问题,请将其标记为重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多