Re: [問題] 關於 Position Independent Code 的概念
※ 引述《nowar100 (拋磚引玉)》之銘言:
: 其實我對於您提出的例子,沒辦法理解,以下是我的謬論(?)
: 假設 libfoo.so 的 Code 如您所說
: int x;
: void inc() { ++x; }
: 那麼在編譯及連結之後, x 應該是長在該 DSO 自己的 .data 區
: 也就是我推文所講的,應該是可以直接從 .data 的 offset 算出要填入的位址
: 這應該跟 PIC 無關才對吧,照這樣看,還沒載入之前,位址就應該都是固定的吧
: 這樣即使 A, B 兩行程同時使用 libfoo.so,該 DSO 的 .text 應該也是固定的阿
: 我以為,只有在 libfoo.so 參考其他 libbar.so 這種情況下
: PIC 才會對 load time relocation 有差別吧
: 感覺還是似懂非懂,麻煩前輩們請多再指教
如果你有看過 x86 的 machine code 格式
大概不會有這樣的疑問
比如說 ++x 的命令
在不使用 PIC 的情況下編成 machine code 後會長這樣:
(以下是我編出 .exe 後再用 dumpbin 進行反組譯後的結果)
00401003: A1 C0 BD 40 00 mov eax,dword ptr ds:[0040BDC0h]
00401008: 83 C0 01 add eax,1
0040100B: A3 C0 BD 40 00 mov dword ptr ds:[0040BDC0h],eax
其中 0x0040BDC0 就是 x 的位址
根據 x86 指令集的規格
這個位址必需是絕對位置
也就是 x 真正在 virtual memory space 中的位置
而不是「相對於某個地方的 offset」
所以
只要 libfoo.so 被 ld.so 載入到記憶體中的不同位置
x 的絕對位址就會隨之變動
導致上面的 machine code 必需改寫
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.80.53
推
10/11 00:52, , 1F
10/11 00:52, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 7 篇):