我很困惑。我嘗試在x86上的Linux。爲什麼從非pic對象創建的共享庫可以工作?
1
A
回答
1
x86 ABI類型支持共享庫中的非PIC代碼。正如之前指出的那樣,這意味着通常共享的頁面將不會被共享(因爲ld.so需要在代碼而非特殊位置(GOT)修補引用)。
但是建立這種方式的庫可能會快一點,因爲PIC代碼通常比較慢。
amd64 ABI不支持。
2
PIC只是使加載器更簡單,因爲它只需修改代碼中的幾個全局地址。非PIC代碼只包含更多這些地址,因此需要重定位的地址表更大。但是,在任何一種情況下,加載器都必須能夠重新定位代碼(例如,解析靜態/全局變量和全部函數指針的地址)。
相關問題
- 1. 在共享庫中混合PIC和非PIC對象
- 2. 爲什麼gcc強制PIC爲x64共享庫?
- 3. 爲什麼python可以將共享庫作爲模塊導入?
- 4. GCC,PIE,PIC,檔案和共享對象 - 什麼適用於什麼?
- 5. 如何從對象或靜態庫創建共享庫
- 6. 從C++創建共享庫
- 7. 創建將共享指針作爲參數的對象的共享指針
- 8. 可以從共享點URL工作WKWebView?
- 9. 爲什麼從引用中創建共享指針會複製對象?
- 10. 創建虛擬共享對象(.so),以依賴於其他共享對象
- 11. 從共享對象中的位置創建類對象
- 12. 如何從靜態庫創建共享對象文件
- 13. 是否可以創建多個工作簿共享的Excel VBA代碼庫?
- 14. 可以從沒有PIC選項編譯的目標文件的存檔中構建共享對象嗎?
- 15. cmake的創建共享對象
- 16. 什麼是共享工作者?工人與共享工人有什麼不同?
- 17. C++:創建一個共享的對象,而不是共享的對象指針
- 18. 從共享對象
- 19. VBA共享工作簿和非共享工作簿
- 20. 爲什麼在構建共享庫後無法重命名共享庫?
- 21. 爲什麼不使用apply方法可以創建Map對象?
- 22. 創建爲共享庫而非可執行文件的新組件項目
- 23. 什麼是共享對象文件?
- 24. 是否可以在共享對象文件中更改共享庫引用?
- 25. 什麼是庫版本的共享對象文件的意義
- 26. 不能從工廠共享對象
- 27. 共享對象庫和MPI
- 28. 創建Grails共享庫
- 29. 創建Oozie共享庫
- 30. 吉斯:創建共享庫
必須?通常這根本不起作用 – 2009-11-12 10:02:06
您總是會有一些符號可以通過它們的全局地址進行訪問。這些地址必須始終重新定位。過去,這樣的代碼通常映射到一個固定的地址,但隨着緩衝區溢出的出現,操作系統會將應用程序映射到不斷變化的地址,從而使這些類型的攻擊變得更加困難。 – 2009-11-12 11:20:45