作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 關於 Position Independent Code 的概念
時間Sun Oct 10 17:18:19 2010
※ 引述《nowar100 (拋磚引玉)》之銘言:
: 遇到的問題: (題意請描述清楚)
: 本人最近在閱讀某本書,看到動態連結這邊看了老半天,查了一堆資料
: 卻還是沒辦法完全參透他的意思
先猜那本書就是「程式設計師的自我修養」XD
: 在介紹動態連結的時候
: 他一開始提出的方案為 load time relocation,也就是把重定推遲到載入時才執行
: 後來書上說
: 這樣會讓多個行程無法共用該 DSO,沒有達到節省記憶體空間的好處
: 因此後來出現了 PIC 的概念
: 這樣可以讓 .text 載入的時候不用重定,而 .data 又可以在不同行程有副本
: 這幾句話我看了老半天看不懂
: 1. 為什麼 load time relocation 會造成 DSO 無法被共用?
假設有一段 code 是這樣:
int x; // global variable
void inc()
{
++x;
}
compile 的時候,因為 x 的位址無法確定
所以 inc 的指令會像這樣
.code
inc:
mov XXXX, %eax
inc %eax
mov %eax, XXXX
其中 XXXX 代表變數 x 的位址,這個位址要交給 linker 決定後再填入
假設有兩支程式 A 和 B 都會用到 inc()
那麼在執行 A 的時候
ld.so 會進行一次 relocation
並且把 XXXX 代換成 x 真正在記憶體中的位址
所以 inc 這段函式載入到記憶體後可能長這樣:
.code
inc:
mov 0x0004, %eax (這邊的意思是把 0x0004 這個位址的內容放進 %eax)
inc %eax (很久沒寫組語了,語法小錯誤請多見諒)
mov %eax, 0x0004
OK,現在 A 還沒跑玩,使用者又執行了 B 程式
ld.so 又進行第二次 relocation
不幸的是 B 這支程式包含了許多其它模組,因此 ld.so 把 x 分配到 0x2000 這個位址
這麼一來 inc() 會變這樣:
.code
inc:
mov 0x2000, %eax
inc %eax
mov %eax, 0x2000
也就是說,如果不使用 Position independent code
那麼 inc 這個函式編譯出來的碼
與不同的程式連結時,其指令的內容也會跟著不同
這麼一來 inc 這個函式勢必在記憶體中要有兩份副本
一份是給 A 用的 (x位址為 0x0004的版本)
另一份是給 B 用的 (x位址為 0x2000的版本)
: 2. .data 裡面的 GOT,書上說在載入的時候 ld.so 會更新裡面欄位的值,
: 這跟多行程能否共用該 DSO,在不同行程有副本又有什麼關係?
GOT 的目的是為了讓這個 DSO 可以存取另一個 DSO 中的 data
考慮一下上面的例子
如果 x 是定義於另一個 DSO 中的資料
同時我們又希望「存取 x 的指令本身是 position independent」
那方法就是繞一圈:先取得 GOT 的位址 (GOT 對於 DSO 來說算是定義於模組內的資料)
然後再從 GOT 的內容 (由ld.so填入) 去取得 x 的位址
: 短短幾頁就讓我無法頓悟,希望對這方面有心得的前輩可以多多幫忙一下
: 謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.80.53
推 nowar100:1. 那個x不是會放在.data嗎,應該可直接算出相對offset吧 10/10 17:39
→ nowar100:如果說該DSO並不會用到其他DSO 那PIC是不是就沒有意義了? 10/10 17:40
→ james732:第一行猜得跟我一樣 XDD 10/10 17:42
推 loveme00835:@_@ 小弟程度不夠, 進度還沒到那 10/10 17:42
推 purpose:回完文才看到這篇 10/10 17:44
→ nowar100:下面好幾篇看起來不錯,等我吃完飯回來研究,先謝謝大家 10/10 17:45
→ manlike:一樓的問題可以看樓下coldstars大大的文章~ XD 10/10 18:07
→ manlike:你用相對的offset 就是使用PIC的技巧了 PIC還是有用的 XD 10/10 18:10
→ yoco315:最近大家都在看這本哩.. XD 10/10 19:13
推 coldstars:不過我一直有疑惑為啥大家都想看這本XD 10/10 19:46
→ coldstars:有時間不是應該要專精自己的領域嗎? 10/10 19:47
→ coldstars:要正確使用的話,其實文件裡都講很清楚了... 10/10 19:48
→ james732:咦 樓上有更好的選擇嗎?我覺得這本值得推薦耶 10/10 19:48
→ coldstars:我的意思是...除非這邊板眾都是走系統的 10/10 19:49
→ coldstars:不然看這個其實很浪費時間...他不會對你的專長有幫助 10/10 19:50
→ coldstars:這些系統眉角的地方都已經被tune到幾乎符合直覺 10/10 19:50
→ coldstars:像...我記得有位板友是做CG的,但是他常常問底層實作 10/10 19:51
→ coldstars:他把時間花在CG上的話價值會更高 (這麼想玩系統快轉行XD 10/10 19:52
→ james732:也是啦,不過想探究底層的話,這本書幫助確實很大 10/10 19:58
→ james732:就算是無助專長 多懂一點點也沒什麼不好囉 XD 10/10 19:58
→ coldstars:書本身的話 在中文書裡的確是近期非常值得推薦的 10/10 20:04
→ yoco315:像我這種沒專精領域的, 就只好什麼都看了 QQ 10/10 21:10
→ coldstars:與其說yoco沒有強項不如說是全般萬能吧XD 10/10 21:55
→ manlike:學習不需劃地自限吧~ 廣泛涉獵各種領域的知識有許多好處~ 10/10 22:24
→ manlike:尤其是這種底層的知識 只要是做OS層級以上的都會用到~ 10/10 22:25
→ manlike:只是用的人知不知道自己用到而已 XD 10/10 22:26
推 purpose:常會想逆向別人的商業程式作手腳,所以這本書還蠻有幫助 10/10 22:26
→ purpose:加密與解密也不錯 10/10 22:27
推 loveme00835:做手腳 0.0 ? 10/10 22:48
推 purpose:破解版權限制.... 10/10 22:58
推 xatier:越獄囉XD 10/11 07:35