使用 -fPIC 选项,会生成 PIC 代码。.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接。
non-PIC 与 PIC 代码的区别主要在于 access global data, jump label 的不同。
比如一条 access global data 的指令,
non-PIC 的形势是:ld r3, var1
PIC 的形式则是:ld r3, var1-offset@GOT,意思是从 GOT 表的 index 为 var1-offset 的地方处
指示的地址处装载一个值,即 var1-offset@GOT 处的4个 byte 其实就是 var1 的地址。这个地址只有在运行的时候才知道,
是由 dynamic-loader(ld-linux.so) 填进去的。
再比如 jump label 指令
non-PIC 的形势是:jump printf ,意思是调用 printf。
PIC 的形式则是:jump printf-offset@GOT,意思是跳到 GOT 表的 index 为 printf-offset 的地方处
指示的地址去执行,这个地址处的代码摆放在 .plt section,每个外部函数对应一段这样的代码,其功能是呼叫
dynamic-loader(ld-linux.so) 来查找函数的地址(本例中是 printf),然后将其地址写到 GOT 表的 index 为 printf-offset 的地方,
同时执行这个函数。这样,第2次呼叫 printf 的时候,就会直接跳到 printf 的地址,而不必再查找了。
GOT 是 data section, 是一个 table, 除专用的几个 entry,每个 entry 的内容可以再执行的时候修改;
PLT 是 text section, 是一段一段的 code,执行中不需要修改。
每个 target 实现 PIC 的机制不同,但大同小异。比如 MIPS 没有 .plt, 而是叫 .stub,功能和 .plt 一样。
可见,动态链接执行很复杂,比静态链接执行时间长;但是,极大的节省了 size,PIC 和动态链接技术是计算机发展史上非常重要的一个里程碑。

gcc -fPIC选项相关推荐

  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. GCC编译静态库的-fPIC选项

    GCC编译静态库的-fPIC选项 背景 通常在linux下用gcc编译动态库时都会加上一个-fPIC选项来生成位置无关代码,但是从来没有人明确的说过是不是要在编译静态库时也加上-fPIC选项.我在这篇 ...

  3. cmake 增加-fPIC选项 gcc

    cmake生成makefile增加-fPIC选项,命令如下: cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON <path-to-source>

  4. Makefile -fPIC 选项

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

  5. gcc -fpic 和 -fPIC 参数问题

    gcc -fpic 和 -fPIC 参数问题 目的:生成位置无关的代码. 位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可 ...

  6. GCC 编译 C(C++)静态链接库(gcc -L、gcc -l)和动态链接库(gcc -fPIC -shared)的创建和使用

    1. 库文件 所谓库文件,读者可以将其等价为压缩包文件,该文件内部通常包含不止一个目标文件(也就是二进制文件). 值得一提的是,库文件中每个目标文件存储的代码,并非完整的程序,而是一个个实用的功能模块 ...

  7. boost中静态库编译没有-fPIC选项的问题解决方案

    使用libboostpython.so动态链接是没有问题的,但是使用libboostpython.a静态链接,会产生如下错误(图片是线程,道理是一样的): 原因在于boost的编译工具bjam在编译b ...

  8. GCC 编译 C++ 程序分步骤流程(预处理 gcc -E、编译 gcc -S、汇编 gcc -c 和链接 gcc 以及 gcc -o 选项)

    C 或者 C++ 程序从源代码生成可执行程序的过程,需经历 4 个过程,分别是预处理.编译.汇编和链接. 同样,使用 GCC 编译器编译 C 或者 C++ 程序,也必须要经历这 4 个过程.但考虑在实 ...

  9. linux命令gcc常用选项

    linux下调试时gcc用的非常比较,下面看gcc常用选项. E 激活预处理:头文件.宏等展开(.i文件) S 激活预处理.编译:生成汇编代码(.s文件) c 激活预处理.编译.汇编:生成目标文件(. ...

最新文章

  1. 牛客练习赛84:牛客推荐系统开发之标签重复度(点分治+动态开点权值线段树)
  2. 161026、更快速将你的页面展示给用户[前端优化篇]
  3. 如何让类数组也使用数组的方法比如:forEach()
  4. redis中的ziplist
  5. 写博客一定程度上是在刷存在感~
  6. 【OpenStack】OpenStack系列1之OpenStack本地开发环境搭建向社区贡献代码
  7. 关于oracleblob字段的用到
  8. 科普: 中间件底层实现的分布式协议之Raft
  9. c语言 amp amp 逻辑运算符,C++编程中的或||、与amp;amp;、非!逻辑运算符基本用法整理...
  10. 自定义导航--wx.getMenuButtonBoundingClientRect() 万机兼容
  11. 怎么烧录c语言_单的入门1 -- C语言 : 一门和芯片对话的外语
  12. 真的假的?LiFi或将取代WiFi
  13. 服务器查看数据库日志文件,服务器数据库查看日志文件
  14. php post 漏洞_漏洞研究|ThinkPHP request函数远程代码执行
  15. Python简单的小实验输出对应车站的中文简写(主要是为了解决汉字编码问题)
  16. 输出分组_数据科学|pandas教程--分组和聚合
  17. centos7安装mysql客户端
  18. 移动端html富文本编辑器,PC/移动端的富文本编辑器wangEditor的使用
  19. 小米路由器3无线网连接到服务器,小米路由器3怎么连接硬盘
  20. Yunxion资产监测设备中DCDC芯片选择

热门文章

  1. spring里面 @Controller和@RestController注解的区别
  2. leetcode 1207. 独一无二的出现次数(map+set)
  3. ruby nil_Ruby中的数据类型-True,False和Nil用示例解释
  4. fritz 使用手册_Fritz对象检测指南:使用机器学习在Android中构建宠物监控应用
  5. 爱前端2018全栈大前端_启动2018年前端工具调查
  6. 像程序员一样思考_如何像程序员一样思考-解决问题的经验教训
  7. APP应用 HTTP/1.0中keep-alive
  8. Sort HDU5884(二分+多叉哈夫曼树)
  9. [转]那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable
  10. Google Analytics Advanced Configuration - Google Analytics 高级配置