-fpic与-fPIC
Object文件
我们在Linux开发过程中经常会遇到Object file这个名词,你可以称之为对象文件。常见的对象文件有三种:
可重定位的对象文件(Relocatable file)
这是由汇编器汇编生成的 .o 文件。后面的链接器(link editor)拿一个或一些 Relocatable object files 作为输入,经链接处理后,生成一个可执行的对象文件 (Executable file) 或者一个可被共享的对象文件(Shared object file)。我们可以使用 ar 工具将众多的 .o Relocatable object files 归档(archive)成 .a 静态库文件。如何产生 Relocatable file,你应该很熟悉了,请参见我们相关的基本概念文章和JulWiki。另外,可以预先告诉大家的是我们的内核可加载模块 .ko 文件也是 Relocatable object file。可执行的对象文件(Executable file)
这我们见的多了。文本编辑器vi、调式用的工具gdb、播放mp3歌曲的软件mplayer等等都是Executable object file。你应该已经知道,在我们的 Linux 系统里面,存在两种可执行的东西。除了这里说的 Executable object file,另外一种就是可执行的脚本(如shell脚本)。注意这些脚本不是 Executable object file,它们只是文本文件,但是执行这些脚本所用的解释器就是 Executable object file,比如 bash shell 程序。可被共享的对象文件(Shared object file)
这些就是所谓的动态库文件,也即 .so 文件。如果拿前面的静态库来生成可执行程序,那每个生成的可执行程序中都会有一份库代码的拷贝。如果在磁盘中存储这些可执行程序,那就会占用额外的磁盘空 间;另外如果拿它们放到Linux系统上一起运行,也会浪费掉宝贵的物理内存。如果将静态库换成动态库,那么这些问题都不会出现。
什么是ELF文件?
ELF文件是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。
如何进行反汇编?
编译的过程实际上是把源文件转换成为汇编代码的过程,当我们最终拿到一个二进制之后,如何从中查看汇编代码,这时需要用到反汇编。
反汇编大概有三种方法:
1) 通过编译器直接从源文件生成, 如gcc -S
2) 对目标代码反汇编, 一种是静态反汇编, 就是使用objdump
3) 另外一种就是对运行时的代码反汇编, 一般通过gdb
readelf并不提供反汇编功能.
-fPIC
PIC, Position-Independent Code, 顾名思义,与位置无关的代码。
使用-fPIC,可以使得动态库可以被多个程序共享。
-fpic与-fPIC
相同点:都是为了在动态库中生成位置无关的代码。通过全局偏移表(GOT)访问所有常量地址。程序启动时动态加载程序解析GOT条目。
不同点:如果链接的可执行文件的GOT大小超过计算机特定的最大大小,则会从链接器收到错误消息,指示-fpic不起作用;在这种情况下,请使用-fPIC重新编译。GOT大小根据操作系统的不同而大小不一样,SPARC上为8k,在AArch64上为28k,在m68k和RS / 6000上为32k。x86没有此限制。
总结:为了兼容各个系统,在生成位置无关的代码的时候,应该使用-fPIC参数。
-fpic与-fPIC相关推荐
- gcc -fpic 和 -fPIC 参数问题
gcc -fpic 和 -fPIC 参数问题 目的:生成位置无关的代码. 位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可 ...
- -fpic 与-fPIC的区别
-fpic 与-fPIC的区别 前言 在编译动态库的时候,我们应该需要使用-fpic 或-fPIC参数.如下所示: 然后,使用gcc或g++ 命令生成动态库 pic 与PIC的异同 相同点:都是为了在 ...
- gcc动态库fPIC和fpic编译选项差异介绍
作者以前并没有特别留意fPIC和fpic之间的差别,最近在aarch64服务器上编译遇到的一个问题,让自己好好的查询了一些资料,或许平常的开发人员并不容易遇到它,但愿对有缘的读者有一定帮助. 1)出动 ...
- linux 内核fpic,浅谈-fPIC与-fpic
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意 ...
- arm linux gcc fpic,【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义
[待整理]Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义 -fpic Generate position-independent code (PIC) suit ...
- How can I set ccshared=-fPIC while executing ./configure?
解决方式如下: make clean ./configure CFLAGS=-fPIC CXXFLAGS=-fPIC
- Linux: fPIC与 pie 区别
参考链接: https://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Code-Gen-Options.html#Code-Gen-Options https://st ...
- 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 ...
最新文章
- 项目打包去掉调试时的NSLog、print
- CSS 基础知识(二)
- 软件需求分层处理的多种常见方式
- Visual Studio 2022 预览版2 发布啦
- 来到博客园 就要好好记录 分享技术
- 诗与远方:无题(六十六)- 清明时节雨纷下
- Java后端学习体系(韩顺平)
- 威纶通触摸屏可以解密吗_【实例】西门子PLC变频器和触摸屏综合应用
- 华硕笔记本触摸板失灵
- mysql 空串 0_casewhen遇到空串转成0
- 新浪微博分享图片不改变问题
- [经]信用体系,金融改革
- QQ上接收的文件资料在哪里能打印?
- Windows安全设置-当前的安全设置不允许从该位置下载文件
- CSS实现多余文本隐藏
- 在公众号添加付费链接
- OpenCV—Python 图像加减乘除-逻辑运算
- Android 保持屏幕不熄屏
- NetSpider 网络蜘蛛1.0 的简介
- 如何使用STM32和BLE收集SHT85传感器数据?