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

看板C_and_CPP作者 (我要加入劍道社!)時間15年前 (2010/10/10 16:24), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串6/7 (看更多)
※ 引述《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
文章代碼(AID): #1CiUZ4tG (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1CiUZ4tG (C_and_CPP)