在使用Java本机接口时,如何解决"致命:重定位仍然存在于可分配但不可写的部分"?

Cha*_*hna 2 c java java-native-interface solaris native

我正在尝试在Java代码中调用C函数.我有这个hava代码.

public class JavaToC {

    public native void helloC();

    static {
        System.loadLibrary("HelloWorld");
    }

    public static void main(String[] args) {
        new JavaToC().helloC();
    }
}
Run Code Online (Sandbox Code Playgroud)

.我编译它然后创建头文件.然后制作以下HelloWorld.c文件.

#include <stdio.h>
#include <jni.h>
#include "JavaToC.h"
JNIEXPORT void JNICALL Java_JavaToC_helloC(JNIEnv *env, jobject javaobj)
{
  printf("Hello World: From C");
  return;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用"gcc -o libHelloWorld.so -shared -I/usr/java/include -I/usr/java/include/solaris HelloWorld.c -lc"进行编译,但它给出了以下结果.

Text relocation remains                     referenced
    against symbol          offset  in file
.rodata (section)                   0x9         /var/tmp//cc.GaGrd.o
printf                              0xe         /var/tmp//cc.GaGrd.o
ld: fatal: relocations remain against allocatable but non-writable sections
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我正在使用Solaris 11,我该如何解决这个问题?

Mar*_*n R 6

我目前无法在Solaris机器上测试这个,但是来自http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/SPARC-Options.html

-mimpure-text禁止"重定位仍然针对可分配但不可写的部分"链接器错误消息.但是,必要的重定位将触发写入时复制,并且实际上不会跨进程共享共享对象.-mimpure-text您应该使用-fpic或编译所有源代码,而不是使用 -fPIC.

解决方案似乎是添加-fpic选项以生成与位置无关的代码.