[問題] 產生shared library時,有用-fPIC參數和沒用的差別是什麼

看板LinuxDev作者 (tortoise)時間14年前 (2011/04/23 18:35), 編輯推噓1(103)
留言4則, 2人參與, 最新討論串1/1
通常在產生shared library時,會加-fPIC的參數, 目的是為了產生與位址無關的machine code。 這樣可以達到同一份library讓多份process共用的目的。 如果沒有加-fPIC,其實library還是可以產生, 程式一樣可以動態連結這個library, 一樣可以執行無誤。 那麼,有沒有加-fPIC的差別到底是什麼? 是說如果沒有加的話, 每一個process都會在實體記憶體都載入一份library嗎? 所以就不能達到共用的目的嗎? 如果查看memory map, 看到的是library在process的virtual memory的位置, 要怎樣可以知道library是在實體記憶體的哪個位置? 要如何知道library是不是真的只載入一份呢? $ cat /proc/2351/maps ... 0092c000-0092d000 r-xp 00000000 08:06 1330092 /test/pic/foo.so 0092d000-0092e000 r--p 00000000 08:06 1330092 /test/pic/foo.so 0092e000-0092f000 rw-p 00001000 08:06 1330092 /test/pic/foo.so ... $ cat /proc/2356/maps ... 00d42000-00d43000 r-xp 00000000 08:06 1330092 /test/pic/foo.so 00d43000-00d44000 r--p 00000000 08:06 1330092 /test/pic/foo.so 00d44000-00d45000 rw-p 00001000 08:06 1330092 /test/pic/foo.so ... 謝謝回答。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.104.128.131


04/24 00:30, , 2F
上面有解釋有沒有使用PIC的差異 參考看看
04/24 00:30, 2F

04/24 00:32, , 3F
關鍵字GOT(GlobalOffsetTable)、none self-modifying code
04/24 00:32, 3F

04/24 12:33, , 4F
大感謝。
04/24 12:33, 4F
文章代碼(AID): #1Digk69n (LinuxDev)