2014-11-14 51 views
0

我正在尝试构建我的本机代码以在Android 5.0中定位新的64位ABI。我的32位代码(包括C和汇编语言)可以正确构建和链接。当我尝试添加汇编语言来我x86_64的构建,我得到以下错误:NDK x86_64在尝试链接到x64汇编语言时给出reloc错误

E:/android/FIV_Free//obj/local/x86_64/objs/pil_lib/test.o: requires unsupported dynamic reloc 11; recompile with -fPIC 

我尝试添加“-fPIC”的编译标志,但它没有任何效果。

这里是构建脚本:

ifeq ($(TARGET_ARCH_ABI),x86_64) 
LOCAL_CFLAGS := -Wall -D_GCC_ANDROID=1 
LOCAL_SRC_FILES := \ 
      pqv_jni.c \ 
      pil_io.c \ 
      pil.c \ 
      test.S \ 
endif 

这里是的,编译代码一个简单的例子,但会(在test.S)没有链接:

.intel_syntax noprefix 
.global myfunction 

.data 
myprivatedata: .byte 0,1,2,3,4,5,6,7 

.text 
myfunction: 
    xor rax,rax 
    lea rcx,myprivatedata 
    mov al,[rcx] 
    ret 
.end 

感谢您的任何帮助您可以提供

回答

1

-fPIC当然对手写汇编代码没有影响,它是C编译器指示它生成位置无关代码的标志。在这种情况下,你是编译器,所以你必须自己写PIC。幸运的是,x86-64通过提供一种新的RIP相对寻址模式来帮助你。因此,您只需将lea rcx,myprivatedata替换为lea rcx,[rip+myprivatedata]即可。

+0

你是正确的:)。谢谢;我一直在Windows上做x64 asm代码多年,但从未看到有关将其作为PIC做的信息。 – BitBank