2017-08-22 114 views
3

我有以下的C程序重新編譯-fPIC問題

#include <stdio.h> 

int main() 
{ 
    printf("hello'); 
    return 0; 
} 

當我編譯該文件

gcc -c rr2.c 

然後用連接器與共享選項像

/ld-new -shared -o tmpdir/dump rr2.o 

它給出以下錯誤

rr2.o:在創建共享對象時,無法使用針對`.rodata'的R_X86_64_32;用-fPIC重新編譯

我不明白爲什麼會出現這個錯誤。任何人都可以幫助我理解這個錯誤出現的原因嗎?

回答

5

動態共享「對象」沒有固定的地址,它們被加載到內存中。這意味着所有對功能和變量的引用必須是位置獨立的。您必須創建位置獨立代碼(或PIC簡稱)。

> gcc -fPIC -c rr2.c 
+0

我現在重定位和位置無關的代碼混淆:

這是編譯時完成的,由鏈接器的建議,通過增加-fPIC標誌。 – Gaurav

+2

通常這意味着代碼可能會從不同的地址運行,並且它包含特殊的表格,其中包含需要修改代碼才能運行的數據。後者是可以放置在任何地址並運行而不需要任何更改的東西 –

+4

@GauravPathak代碼可以重新定位而不依賴於位置。在位置無關的代碼可能需要修改才能運行。這種修改可能會對虛擬內存使用有一些有趣的(壞)影響,所以更現代的操作系統傾向於要求PIC用於共享對象。請參閱https://en.wikipedia.org/wiki/Position-independent_code –