[問題] -fPIC代表VM共享庫段映射到同一段PM?

作者: ucrxzero (RX-0)   2020-10-12 20:53:56
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
gcc
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
"動態/靜態函式庫"
問題(Question):
除了標題的問題還要問:
編執行檔有沒有fPIC有差嗎?
例如:
gcc -fPIC main.c -lboost_printf
gcc -static -fPIC main.c -lboost_printf
假設boost_printf.so跟.a都存在
這是計組的問題但我不太了解~感謝
作者: Lipraxde (Lipraxde)   2020-10-13 02:32:00
fPIC 是讓 compiler 編譯成 position-independent code的選項,用這個選項編譯的程式碼在執行的時需要做 relocation,為了在不同的位置 (VM) 上執行。Shared library 是不是會共用 PM 應該是 OS 決定的事,PIC 對程式執行主要還是看 VM。
作者: ucrxzero (RX-0)   2020-10-13 09:16:00
可是我記得不加才要relocation ?感謝因為不加是絕對位址會有問題
作者: Lipraxde (Lipraxde)   2020-10-13 09:39:00
啊對,我記錯了。因為是 PIC 的關係可以把 PM 映射到不同的 VM,兩者之間應該是這樣的關係。
作者: ucrxzero (RX-0)   2020-10-13 10:03:00
fPIC的可以同步修改PM而另外一個為private的copy on write這樣理解對嗎看到計組上的對於共享庫段的解釋是不是套用到dPIC上?*fPIC
作者: Lipraxde (Lipraxde)   2020-10-13 10:50:00
PIC 可以不經修改就能在不同位置上執行,因為使用的是相對位置而不是絕對位置。至於計組嘛...很久沒看了,也不太記得相關的描述 QQ
作者: Killercat (殺人貓™)   2020-10-13 11:42:00
「程式設計師的自我修養」我記得前幾章就在講這個...XD
作者: KaryuuIssen (一閃)   2020-10-13 12:24:00
執行檔不要編譯成PIC PIC會繞道存取(got/plt等等)另外PIC旨在程式段共享 資料段還是各自有各自的
作者: Lipraxde (Lipraxde)   2020-10-13 13:23:00
想避免 got/plt 應該是盡量用 static link 吧?
作者: ucrxzero (RX-0)   2020-10-13 15:33:00
繞道存取我查查看 感謝
作者: KaryuuIssen (一閃)   2020-10-13 16:41:00
L大 你回答的是另一個問題: .so跟.a的抉擇 這點讓原PO自己考慮XD 總之fPIC除了編譯Shared library外都不需要加 就算原po選了.so而沒加fPIC 編出來的執行檔存取Shared library的部份依然會是PIC
作者: Lipraxde (Lipraxde)   2020-10-13 18:32:00
恩恩,我誤會您前面的意思了
作者: ucrxzero (RX-0)   2020-10-13 21:07:00
了解了感謝
作者: kingofsdtw (不能閒下來!!)   2020-10-15 02:07:00
感謝,長知識了

Links booklink

Contact Us: admin [ a t ] ucptt.com