尝试使用x64汇编语言进行链接时,NDK x86_64会出现reloc错误

时间:2014-11-14 11:42:24

标签: assembly android-ndk x86-64

我正在尝试构建我的本机代码,以便在Android 5.0中定位新的64位ABI。我的32位代码(包括C和汇编语言)正确构建和链接。当我尝试将汇编语言添加到我的x86_64版本时,我收到以下错误:

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 个答案:

答案 0 :(得分:1)

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