2013-07-16 37 views
1

我對ELF文件的內部有點好奇。我有這個問題:爲什麼Linux中的共享庫(.so)需要使用-fPIC標誌進行編譯?

爲什麼我們需要編譯共享庫(.so)與國旗-fPIC

雖然從理論上說,我們可以動態與靜態鏈接elf文件鏈接的可執行文件。 這是因爲可執行文件中的GOTPLT表需要更新,而動態鏈接可執行文件可以保持不變。

+0

據我所知,共享庫應該被多個進程共享,以節省物理內存和磁盤空間。但我仍然不明白爲什麼我們需要使用-fPIC編譯共享庫(.so)文件。 – Boehm

回答

2

共享庫的思想是相同的代碼可以通過在存儲器中的幾個程序共享。但是,不能確保兩個正在運行的程序期望該庫處於其內存佈局的相同地址(如果程序使用不同的共享庫,請考慮衝突)。因此,共享庫只在物理內存中存儲一​​次,但是由於內存管理單元,兩個程序將同一物理內存視爲兩個不同的地址。當然,爲了這個工作,你需要代碼獨立於它的實際地址(例如參見http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/以獲得更準確的解釋)

此外,您還可以隨機分配有利於安全原因的共享內存地址(http://fr.wikipedia.org/wiki/Return-to-libc_attack

+0

當你說「共享庫只在物理內存中存儲一​​次」時,我在這裏有一些問題。共享庫存儲在phy mem中的位置?內核如何找出共享庫的地址? – badmad

+0

首先,如果您有另一個問題,您應該打開另一個問題。其次,我很想問「你爲什麼在意?」。下面是我的簡短答案:內核不知道。它只是在第一次使用庫時選擇一些隨機的自由物理內存來存儲共享庫,然後,由於MMU的原因,它將這個內存映射到每個進程應該在的地方。 – hivert

相關問題