2014-11-14 26 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