Re: [問題] 關於 Position Independent Code 的概念

看板C_and_CPP作者 (あら~)時間15年前 (2010/10/10 09:44), 編輯推噓3(302)
留言5則, 3人參與, 最新討論串4/7 (看更多)
※ 引述《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
好文~ XD
10/10 18:05, 1F
修一下例子看能不能比較清楚... ※ 編輯: coldstars 來自: 114.42.87.44 (10/10 18:32)

10/10 18:37, , 2F
請問 文中image指的是可執行檔? 還是.text和.data? 還是?
10/10 18:37, 2F

10/10 18:44, , 3F
exe/out/dll/so 這些都是image 就是不是o/lib的那些XD
10/10 18:44, 3F

10/10 19:00, , 4F
所以在使用PIC之後 load需要重訂的只有.data 沒有.text?
10/10 19:00, 4F

10/10 19:12, , 5F
對 需要reloc的都會被塞到.data/.got之類的地方
10/10 19:12, 5F
文章代碼(AID): #1CiOi2Xh (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1CiOi2Xh (C_and_CPP)