在gcc目標機器上,當需要編譯共享庫時,需要指定-fpic或-fPIC來使事情正確工作。這是因爲默認情況下使用了絕對地址,它適用於完全控制自己地址空間的可執行文件,而不是共享庫,可以在可執行文件的地址空間中的任何位置加載。然而,現代內核現在正在實現地址空間隨機化,許多現代體系結構都支持PC相對尋址。這似乎使絕對尋址不可用(地址空間隨機化)或不需要(PC相對尋址)。編譯GCC時還需要用-fPIC嗎?
我也注意到叮噹沒有-fPIC選項,這使得我不再需要它。
那麼-fpic現在是多餘的,還是需要生成單獨的.o文件,一個用於靜態庫,另一個用於共享庫?
在大多數情況下,PIC代碼速度較慢,因爲通過PLT的額外跳轉需要在許多函數調用中使用額外的間接方向。建立沒有PIC的靜態庫是個好主意。 – Art
@藝術:可能會變慢,但不會太多。我不同意沒有,建立靜態庫是有用的。靜態庫不僅被鏈接到可執行文件中,而且被鏈接到共享庫中。而且,正如所提到的問題,ASLR可執行文件還需要與位置無關。所以最安全的是總是指定'-fPIC'。 –
@Art Intel上的問題不是函數調用或跳轉(無論哪種方式都是PC相關),而是訪問全局數據。 (在其他處理器上,問題會有所不同。) –