[问题] -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