-fPIC, -fpic, -fpie, -fPIE
-fPIC与-fpic都是在编译时加入的选项,用于生成位置无关的代码(Position-Independent-Code)。这两个选项都是可以使代码在加载到内存时使用相对地址,所有对固定地址的访问都通过全局偏移表(GOT)来实现。-fPIC和-fpic最大的区别在于是否对GOT的大小有限制。-fPIC对GOT表大小无限制,所以如果在不确定的情况下,使用-fPIC是更好的选择。
-fPIE与-fpie是等价的。这个选项与-fPIC/-fpic大致相同,不同点在于:-fPIC用于生成动态库,-fPIE用与生成可执行文件。-fPIE用来生成位置无关的可执行代码。
PIC实现原理:
(1)GOT:在动态库的数据段增加GOT(Global Offset Table),该表的每一项是符号到地址的绝对映射。由于代码段到数据段的偏移是固定的,因此可以在编译时确定代码段中的某个符号到GOT特定项之间的偏移。这样,代码段中的符号偏移就可以在编译时确定了,在加载时也无需修改代码段的内容,只需要填写位于数据段的GOT的所有项的符号的绝对地址就完成了。因为数据段本来就是进程间不共享,每个进程独立的一份,因此GOT的设计完全解决了以上两个问题,从而达到两个目的:1,代码段可以在多进程间共享;2,代码段是只读的。
(2)PLT:PLT是 Program Linkage Table 的缩写,即程序链接表,PLT的出现是为了延时定位的目的。一个动态库中的函数往往要远多于全局变量,并且被调用的函数往往少于定义的函数。GOT中包含了该动态库中的所有的全局变量的映射,并且在连接器加载时解析所有的全局变量的地址。如果用同样的方式去处理函数调用符号,则开销会非常大。因此在代码段设计了一个PLT表,每一项其实是个代码段,用于执行如下逻辑:首次访问时,解析参数和向GOT填写函数地址,后续访问直接访问GOT中的函数地址。如此达到了延时定位的目的。
因此,一个PIC的动态库中,对全局变量使用GOT来映射,对函数调用使用PLT+GOT来映射,从而达到共享库代码段复用,代码段安全访问的目的。而这些就是 PIC 的意义。
-fPIC, -fpic, -fpie, -fPIE相关推荐
- arm linux gcc fpic,【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义
[待整理]Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义 -fpic Generate position-independent code (PIC) suit ...
- C++学习(三九二)-fPIC, -fpic, -fpie, -fPIE
-fPIC与-fpic都是在编译时加入的选项,用于生成位置无关的代码(Position-Independent-Code),可以使得动态库可以被多个程序共享.这两个选项都是可以使代码在加载到内存时使用 ...
- 【Build】关于-fPIC, -fpic, -fpie, -fPIE的一点理解
最近在编译动态库文件,用到-fPIC编译选项.查了下GNU的手册: -fpic Generate position-independent code (PIC) suitable for use in ...
- 关于-fPIC, -fpic, -fpie, -fPIE的一点理解
最近在编译动态库文件,用到-fPIC编译选项.查了下GNU的手册: -fpic Generate position-independent code (PIC) suitable for use in ...
- 关于-fPIC, -fPIE的一点理解
查了下GNU的手册 -fpic Generate position-independent code (PIC) suitable for use in a shared library, if su ...
- Linux: fPIC与 pie 区别
参考链接: https://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Code-Gen-Options.html#Code-Gen-Options https://st ...
- gcc 编译参数 -fPIC 的详解和一些问题
ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent C ...
- Makefile -fPIC 选项
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意 ...
- gcc报错 can not be used when making a shared object; recompile with -fPIC
问题1:gcc报错 can not be used when making a shared object: recompile with -fPIC -fPIC 作用于编译阶段,告诉编译器产生与位置 ...
最新文章
- 重新定义Wi-Fi功能,Wi-Fi 6为什么要分两步?
- python能在生活中做什么-Python可以解决哪些生活中的小问题
- AnkhSVN使用手册
- 读书笔记 Effective C++: 02 构造析构赋值运算
- 在Junit上使用Kafka
- 3天内构建Facebook Web应用的经验之谈
- 【Alpha】“北航社团帮”小程序v1.0发布声明
- 九个编写Dockerfiles的常见错误
- 2005年7月19日
- DEA for mac 热部署
- 【Java 判断素数的几个方法】简单理解
- 快播5.0永不升级版 孤雨定制骨头版
- 富士施乐3065扫描教程_富士施乐怎么设置扫描到PC
- 金山毒霸喜新厌旧 推荐QQ电脑管家抛弃金山卫士?
- autocad2014点击保存闪退_autocad2014启动闪退 AutoCAD启动时闪退怎么办
- python企业微信登录_python 微信企业号
- NFT平台Chair.finance获得Polygon Grant及生态支持
- 购买计算机网络设备的会计分录,企业购买设备的会计分录怎么写?
- 将RGB值转换为灰度值的简单算法
- 【已解决】打开游戏或者游戏引擎耳机出现滋滋滋的电流声