2017-06-28 56 views
0

我正在編譯一個靜態庫,它利用了一些內聯彙編代碼。重新定位R_X86_64_32S針對`.text'在製作共享對象時無法使用

我注意到,當我使用標籤爲jmp指令:

int foo(){ 

asm volatile 
(
    "mov 0x60(%r8),%r11d\n\t" 
    "jmp *S_401a70\n\t" 
    ... 
    "S_401a70: xor %rax, %rax\n\t" 
    ... 
) 
} 

和編譯代碼到一個靜態庫具有以下標誌:

-Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfiles -L$(SOME_LIBRARY_PATH) \ 
-Wl,--whole-archive -l$(SOME_Library_Name) -Wl,--no-whole-archive \ 
-Wl,-Bstatic -Wl,-Bsymbolic -Wl,--no-undefined \ 
-Wl,-pie,-eenclave_entry -Wl,--export-dynamic \ 
-Wl,--defsym,__ImageBase=0 

我會得到一些錯誤,如:

/usr/bin/ld: Enclave/libtest.o: relocation R_X86_64_32S against `.text' can not be used when making a shared object; recompile with -fPIC 

但是,由於我正在編譯成一個sta抽象圖書館,我不認爲-fPIC是有道理的。我試過了,但它根本不起作用。

這看起來像是gcc assembly extension的問題,但我不確定。任何人都可以點亮這個燈光嗎?謝謝!

+1

你是否嘗試從'jmp'指令中刪除間接('*')?這應該是一個相對跳躍,而這看起來像你想要的。 – owacoder

回答

1

這不是一個工具問題。首先-fPIC隻影響C代碼。並且以這樣的方式影響它:生成的代碼將不包含被引用的數據/代碼的絕對地址,並且不會依賴它在內存中的自己的地址(這是一個稍微簡單的解釋)。接下來 - 它與組裝內聯無關。由於這裏的代碼是由程序員生成的。如果它是以一種引入絕對地址或引入對其內存位置的依賴性的方式編寫的,那麼編譯器就無法提供幫助。

P.S.即使使用依賴於位置的代碼,您也可以構建靜態庫,但如果有人嘗試將其鏈接到共享庫中,它將不會被鏈接器接受,因爲結果共享庫應該與位置無關。

+0

大多數我認爲這是由於'label'。原因是當我註釋掉''jmp * S_401a70 \ n \ t「'時,構建過程就變得正確了。 – computereasy

相關問題