我對ELF
文件的內部有點好奇。我有這個問題:爲什麼Linux中的共享庫(.so)需要使用-fPIC標誌進行編譯?
爲什麼我們需要編譯共享庫(.so)
與國旗-fPIC
?
雖然從理論上說,我們可以動態與靜態鏈接elf
文件鏈接的可執行文件。 這是因爲可執行文件中的GOT
和PLT
表需要更新,而動態鏈接可執行文件可以保持不變。
我對ELF
文件的內部有點好奇。我有這個問題:爲什麼Linux中的共享庫(.so)需要使用-fPIC標誌進行編譯?
爲什麼我們需要編譯共享庫(.so)
與國旗-fPIC
?
雖然從理論上說,我們可以動態與靜態鏈接elf
文件鏈接的可執行文件。 這是因爲可執行文件中的GOT
和PLT
表需要更新,而動態鏈接可執行文件可以保持不變。
共享庫的思想是相同的代碼可以通過在存儲器中的幾個程序共享。但是,不能確保兩個正在運行的程序期望該庫處於其內存佈局的相同地址(如果程序使用不同的共享庫,請考慮衝突)。因此,共享庫只在物理內存中存儲一次,但是由於內存管理單元,兩個程序將同一物理內存視爲兩個不同的地址。當然,爲了這個工作,你需要代碼獨立於它的實際地址(例如參見http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/以獲得更準確的解釋)
此外,您還可以隨機分配有利於安全原因的共享內存地址(http://fr.wikipedia.org/wiki/Return-to-libc_attack )
PIC簡單地表示位置無關的代碼。考慮一下代碼中的跳轉地址,這些跳轉地址需要與共享庫代碼在內存中的位置相關。
也看看:
據我所知,共享庫應該被多個進程共享,以節省物理內存和磁盤空間。但我仍然不明白爲什麼我們需要使用-fPIC編譯共享庫(.so)文件。 – Boehm