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

看板C_and_CPP作者 (我要加入劍道社!)時間13年前 (2010/10/10 17:18), 編輯推噓8(8023)
留言31則, 8人參與, 最新討論串2/7 (看更多)
※ 引述《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

10/10 17:39, , 1F
1. 那個x不是會放在.data嗎,應該可直接算出相對offset吧
10/10 17:39, 1F

10/10 17:40, , 2F
如果說該DSO並不會用到其他DSO 那PIC是不是就沒有意義了?
10/10 17:40, 2F

10/10 17:42, , 3F
第一行猜得跟我一樣 XDD
10/10 17:42, 3F

10/10 17:42, , 4F
@_@ 小弟程度不夠, 進度還沒到那
10/10 17:42, 4F

10/10 17:44, , 5F
回完文才看到這篇
10/10 17:44, 5F

10/10 17:45, , 6F
下面好幾篇看起來不錯,等我吃完飯回來研究,先謝謝大家
10/10 17:45, 6F

10/10 18:07, , 7F
一樓的問題可以看樓下coldstars大大的文章~ XD
10/10 18:07, 7F

10/10 18:10, , 8F
你用相對的offset 就是使用PIC的技巧了 PIC還是有用的 XD
10/10 18:10, 8F

10/10 19:13, , 9F
最近大家都在看這本哩.. XD
10/10 19:13, 9F

10/10 19:46, , 10F
不過我一直有疑惑為啥大家都想看這本XD
10/10 19:46, 10F

10/10 19:47, , 11F
有時間不是應該要專精自己的領域嗎?
10/10 19:47, 11F

10/10 19:48, , 12F
要正確使用的話,其實文件裡都講很清楚了...
10/10 19:48, 12F

10/10 19:48, , 13F
咦 樓上有更好的選擇嗎?我覺得這本值得推薦耶
10/10 19:48, 13F

10/10 19:49, , 14F
我的意思是...除非這邊板眾都是走系統的
10/10 19:49, 14F

10/10 19:50, , 15F
不然看這個其實很浪費時間...他不會對你的專長有幫助
10/10 19:50, 15F

10/10 19:50, , 16F
這些系統眉角的地方都已經被tune到幾乎符合直覺
10/10 19:50, 16F

10/10 19:51, , 17F
像...我記得有位板友是做CG的,但是他常常問底層實作
10/10 19:51, 17F

10/10 19:52, , 18F
他把時間花在CG上的話價值會更高 (這麼想玩系統快轉行XD
10/10 19:52, 18F

10/10 19:58, , 19F
也是啦,不過想探究底層的話,這本書幫助確實很大
10/10 19:58, 19F

10/10 19:58, , 20F
就算是無助專長 多懂一點點也沒什麼不好囉 XD
10/10 19:58, 20F

10/10 20:04, , 21F
書本身的話 在中文書裡的確是近期非常值得推薦的
10/10 20:04, 21F

10/10 21:10, , 22F
像我這種沒專精領域的, 就只好什麼都看了 QQ
10/10 21:10, 22F

10/10 21:55, , 23F
與其說yoco沒有強項不如說是全般萬能吧XD
10/10 21:55, 23F

10/10 22:24, , 24F
學習不需劃地自限吧~ 廣泛涉獵各種領域的知識有許多好處~
10/10 22:24, 24F

10/10 22:25, , 25F
尤其是這種底層的知識 只要是做OS層級以上的都會用到~
10/10 22:25, 25F

10/10 22:26, , 26F
只是用的人知不知道自己用到而已 XD
10/10 22:26, 26F

10/10 22:26, , 27F
常會想逆向別人的商業程式作手腳,所以這本書還蠻有幫助
10/10 22:26, 27F

10/10 22:27, , 28F
加密與解密也不錯
10/10 22:27, 28F

10/10 22:48, , 29F
做手腳 0.0 ?
10/10 22:48, 29F

10/10 22:58, , 30F
破解版權限制....
10/10 22:58, 30F

10/11 07:35, , 31F
越獄囉XD
10/11 07:35, 31F
文章代碼(AID): #1CiOJUl3 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1CiOJUl3 (C_and_CPP)