Re: [問題] 關於 Position Independent Code 的概念
※ 引述《nowar100 (拋磚引玉)》之銘言:
: 遇到的問題: (題意請描述清楚)
: 本人最近在閱讀某本書,看到動態連結這邊看了老半天,查了一堆資料
: 卻還是沒辦法完全參透他的意思
: 在介紹動態連結的時候
: 他一開始提出的方案為 load time relocation,也就是把重定推遲到載入時才執行
: 後來書上說
: 這樣會讓多個行程無法共用該 DSO,沒有達到節省記憶體空間的好處
: 因此後來出現了 PIC 的概念
: 這樣可以讓 .text 載入的時候不用重定,而 .data 又可以在不同行程有副本
: 這幾句話我看了老半天看不懂
: 1. 為什麼 load time relocation 會造成 DSO 無法被共用?
我覺得他寫錯了,或是你看錯...
即使是PIC的image,也是load的時候才做relocation XD
甚至有些東西還是第一次call到的時候才做
能不能省記憶體主要是靠PIC (gcc是用-fpic/-fPIC的option)
reloc是要解決有些address在執行時才知道的問題
通常都是其他module的位址,所以編譯時當然不知道了...
而每個process載入一個DSO的位址未必相同
例如說今天有libz.so需要libc.so好了
libz裡的reloc,會指向libc.so的某個function
然後我們同時跑起兩隻程式: tar和unzip
這兩隻程式都會需要libz.so (假設啦...我也不知道實際上是怎樣XD)
所以libz.so會同時被load到兩個process裡面去
雖然兩個process都包含了libz.so,裡面又包含了指向libc.so的reloc
但他們實際數字可能不太一樣
如果你的reloc遍佈整個DSO的image,
那即使有多process使用這個DSO,OS也不能把同一份DSO image讓所有process共用
因為DSO image裡有太多page都各自copy-on-write而不能直接mmap
-fpic的作用是讓程式裡access external address的部分
通通移到.text外面,這樣至少.text只佔一份空間
因此其實是對OS來說省記憶體,對process來說沒什麼影響
至於那些.got的section就讓他不停duplicate也無所謂XD
大部分DSO這些section都不會很大,所以還好啦
: 2. .data 裡面的 GOT,書上說在載入的時候 ld.so 會更新裡面欄位的值,
: 這跟多行程能否共用該 DSO,在不同行程有副本又有什麼關係?
被改過以後OS就要幫他copy-on-write,不能讓多process共用
.data/.got這些section本來就沒辦法共用
但如果沒有下-fpic的option,那些需要改的地方就會遍佈整個.text
變成連.text都不能共用了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.42.87.44
推
10/10 18:05, , 1F
10/10 18:05, 1F
修一下例子看能不能比較清楚...
※ 編輯: coldstars 來自: 114.42.87.44 (10/10 18:32)
推
10/10 18:37, , 2F
10/10 18:37, 2F
→
10/10 18:44, , 3F
10/10 18:44, 3F
推
10/10 19:00, , 4F
10/10 19:00, 4F
→
10/10 19:12, , 5F
10/10 19:12, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 7 篇):