-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相关推荐

  1. arm linux gcc fpic,【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义

    [待整理]Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义 -fpic Generate position-independent code (PIC) suit ...

  2. C++学习(三九二)-fPIC, -fpic, -fpie, -fPIE

    -fPIC与-fpic都是在编译时加入的选项,用于生成位置无关的代码(Position-Independent-Code),可以使得动态库可以被多个程序共享.这两个选项都是可以使代码在加载到内存时使用 ...

  3. 【Build】关于-fPIC, -fpic, -fpie, -fPIE的一点理解

    最近在编译动态库文件,用到-fPIC编译选项.查了下GNU的手册: -fpic Generate position-independent code (PIC) suitable for use in ...

  4. 关于-fPIC, -fpic, -fpie, -fPIE的一点理解

    最近在编译动态库文件,用到-fPIC编译选项.查了下GNU的手册: -fpic Generate position-independent code (PIC) suitable for use in ...

  5. 关于-fPIC, -fPIE的一点理解

    查了下GNU的手册 -fpic Generate position-independent code (PIC) suitable for use in a shared library, if su ...

  6. Linux: fPIC与 pie 区别

    参考链接: https://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Code-Gen-Options.html#Code-Gen-Options https://st ...

  7. gcc 编译参数 -fPIC 的详解和一些问题

    ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent C ...

  8. Makefile -fPIC 选项

    -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意 ...

  9. 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 作用于编译阶段,告诉编译器产生与位置 ...

最新文章

  1. 重新定义Wi-Fi功能,Wi-Fi 6为什么要分两步?
  2. python能在生活中做什么-Python可以解决哪些生活中的小问题
  3. AnkhSVN使用手册
  4. 读书笔记 Effective C++: 02 构造析构赋值运算
  5. 在Junit上使用Kafka
  6. 3天内构建Facebook Web应用的经验之谈
  7. 【Alpha】“北航社团帮”小程序v1.0发布声明
  8. 九个编写Dockerfiles的常见错误
  9. 2005年7月19日
  10. DEA for mac 热部署
  11. 【Java 判断素数的几个方法】简单理解
  12. 快播5.0永不升级版 孤雨定制骨头版
  13. 富士施乐3065扫描教程_富士施乐怎么设置扫描到PC
  14. 金山毒霸喜新厌旧 推荐QQ电脑管家抛弃金山卫士?
  15. autocad2014点击保存闪退_autocad2014启动闪退 AutoCAD启动时闪退怎么办
  16. python企业微信登录_python 微信企业号
  17. NFT平台Chair.finance获得Polygon Grant及生态支持
  18. 购买计算机网络设备的会计分录,企业购买设备的会计分录怎么写?
  19. 将RGB值转换为灰度值的简单算法
  20. 【已解决】打开游戏或者游戏引擎耳机出现滋滋滋的电流声

热门文章

  1. IIS应用程序池启用32位导致服务不可用的503错误
  2. 播报卡顿,破音 问题总结
  3. 手机丢了怎么办 如何冻结手机号码
  4. Ada 语言在军工行业的应用
  5. 周末可以学习的8种基本技能
  6. oracle 按每天,每月,每日,年查询数据量
  7. win10 实现多用户同时远程访问
  8. Linux insmod指令原理
  9. Grafana+Prometheus+Windows_exporter+Mysql_exporter
  10. rviz ros可视化工具