汇编中的位置独立代码构成共享对象

时间:2019-01-23 14:04:28

标签: linux assembly 64-bit nasm

基本上,我正在编写一个基准测试来测试各种语言的速度,而我要测试的语言之一是使用汇编语言的Java w / JNI,以避免重写代码,我使所有本机语言都使用一种通用语言库(benchlib.h),它由程序集,clang和gcc编译对象(例如benchlib.c.clang.o或benchlib.asm.o)代替,要使用CI加载这些对象,只需将它们链接进去,但是使用JNI您必须使用共享库,这样我才能像这样编译C代码。但是,当尝试将程序集链接到JNI共享库时,会出现我的问题。

这是编译过程:

#Assembly
nasm -f elf64 benchlib.asm -o benchlib.asm.o
#Clang and GCC
gcc -c benchlib.c -o benchlib.c.gcc.o -O3 -fpic
clang -c benchlib.c -o benchlib.c.clang.o -O3 -fpic
# Stuff happens here that im not showing, because its unrelated
javac bench_jni.java
javah bench_jni
echo "Compiling JNI bullshit"
dojni(){
        gcc -c benchlibjni.c -o benchlibjni.o -O3 -fpic $jni_include
        gcc benchlibjni.o $1 -shared -o $2 -O3
        rm -v benchlibjni.o
}
dojni benchlib.c.gcc.o   libbenchjni_gcc.so
dojni benchlib.c.clang.o libbenchjni_clang.so
dojni benchlib.asm.o     libbenchjni_asm.so

这是头文件:

#ifndef __benchlib_h
#define __benchlib_h

extern int prime(int n); //Checks if a number is prime
extern void primes(int n, int* buf); // Fills the buffer with prime numbers
extern char* getName(); // Returns the name of the language and compiler used

#endif

这是从JNI到本机的转换:

JNIEXPORT void JNICALL Java_bench_1jni_primes(JNIEnv* env, jclass c,     jint num, jintArray buf){
        jsize len = (*env)->GetArrayLength(env, buf);
        jint* dat = (*env)->GetIntArrayElements(env, buf, 0);
        if(sizeof(jint) != sizeof(int)){
                printf("Sizes not the same, end of world\n");
                exit(-1);
        }
        primes(num, (int*) dat);
        return;
}
JNIEXPORT jboolean JNICALL Java_bench_1jni_prime(JNIEnv* env, jclass c, jint num){
        return prime((int) num);
}
JNIEXPORT jstring JNICALL Java_bench_1jni_getName(JNIEnv* env, jclass c){
        return (*env)->NewStringUTF(env, getName());
}

如果您还有其他需要,可以在这里找到: http://github.com/abc123me/benchmarking/

GCC和Clang编译的C制作了一个快乐的共享对象文件,但是,当将汇编对象文件与已编译的JNI GCC本机-JNI链接器链接时(我知道已获得专利的技术说明),我收到一条错误消息,告诉我不允许使用.data节? (我还应该如何获得数据!):

/usr/bin/ld: benchlib.asm.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC

benchlib.asm.o:添加符号时出错:错误的值 collect2:错误:ld返回1退出状态

我的.data节包含它(汇编语言)所用语言的名称。我无法使用-fPIC进行编译,因为NASM不支持

执行此命令时出现此错误:

 gcc benchlibjni.o $1 -shared -o $2 -O3

其中1和2分别为benchlib.asm.o libbenchjni_asm.so

0 个答案:

没有答案