回答
鏈接問題中接受的答案是非常簡單的,只會引出PIC和非PIC代碼之間不同的一個事物,即生成相對而非絕對的跳轉。
製作PIC代碼時,不僅是位置獨立的代碼,也是數據。並不是所有的代碼或數據都可以簡單地通過使用相對偏移量來尋址,它必須在加載時(庫/程序加載到內存中)或甚至在運行時解決。另外,使用相對尋址意味着CPU必須將相對偏移量轉換爲絕對地址,而不是由編譯器完成。
在帶虛擬內存的系統上,編譯器可以一勞永逸地完成這些相對地址分辨率時,通常不需要花費負載或運行時間。
在某些體系結構上,包括x86,-fPIC
生成很多加載/存儲數據的較差代碼(即函數調用)。雖然這對圖書館來說是可以忍受的,但對於可執行文件來說這是不可取的
amd64指令集(以及最近的gnu-x32 ABI)的主要賣點之一是增加了「PC相對加載/存儲」指令,從而解決了效率問題。
注意,硬化系統通常做使-fPIE
所有可執行文件,因爲它允許地址空間佈局隨機。
這與函數調用沒有可比性,但它佔用一個寄存器。 – DevSolar
@DevSolar uh,它絕對需要一個函數調用(儘管它可能會在第一次顯然後將其緩存在寄存器中)。它出現在反彙編中,使用'__x86.get_pc_thunk.cx'這樣的名字,顯然這個寄存器取決於當前使用的內容。 – o11c
啊......我們的意思是一樣的。 「函數調用」是將偏移表的地址存入寄存器的技巧。保持緩存需要一個寄存器(如我所說),而不是緩存它使數據訪問需要一個函數調用(如你所說)。應該指出的是,這是x86體系結構的典型「醜陋點」之一;大多數(如果不是所有其他的CPU系列的話)在20世紀80年代允許適當的PC相對尋址... – DevSolar
- 1. PIC(位置獨立代碼)
- 2. 使用gas生成與位置無關的代碼(-fPIC)
- 3. 靜態庫中的fPIC代碼:爲什麼?怎麼了?
- 4. 爲什麼我的Django的代碼不能是「獨立的Django的腳本」
- 5. 爲什麼fPIC絕對需要64位而不是32位平臺?
- 6. api獨立頂點處理的好代碼結構是什麼?
- 7. 「獨立」是什麼意思?
- 8. 爲什麼編碼不總是工作?
- 9. 爲什麼我不能在此代碼中設置位置(AS3)?
- 10. 從獨立代碼
- 11. 什麼是獨立應用程序或獨立服務器?
- 12. 應該是獨立的子查詢不是。爲什麼?
- 13. 爲什麼這段代碼總是打印「不匹配」?
- 14. Java中的單獨代碼是什麼?
- 15. 爲什麼獨立應用程序?
- 16. 爲什麼CDN總是使用單獨的主機而不是子域?
- 17. 爲什麼不能使用此代碼?
- 18. 位置獨立可執行文件的正確Xcode設置是什麼
- 19. 爲什麼css轉換屬性不是獨立的css屬性?
- 20. 爲什麼我的佈局不是密度獨立的?
- 21. 爲什麼IsDebugEnabled在我的代碼中總是爲True?
- 22. 爲什麼不是PHP代碼呼應
- 23. Java獨立代碼塊
- 24. 觸摸即使我的代碼總是在右側的位置
- 25. 爲什麼程序與-fpic和-pie編譯有重定位表?
- 26. 什麼是與CSS的dp(密度獨立像素)單位?
- 27. 爲什麼此代碼更改位置,因爲我需要它
- 28. 爲什麼總是使用object = null?
- 29. 爲什麼getLocationOnScreen(位置)總是返回0?
- 30. 爲什麼我的uialeartview總是在旋轉時改變位置
PIC通常不能在Windows中使用,因爲在加載期間DLL地址是固定的。而且在x86 PIC中效率不如x86_64 –