Object文件

我们在Linux开发过程中经常会遇到Object file这个名词,你可以称之为对象文件。常见的对象文件有三种:

  1. 可重定位的对象文件(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。

  2. 可执行的对象文件(Executable file)
    这我们见的多了。文本编辑器vi、调式用的工具gdb、播放mp3歌曲的软件mplayer等等都是Executable object file。你应该已经知道,在我们的 Linux 系统里面,存在两种可执行的东西。除了这里说的 Executable object file,另外一种就是可执行的脚本(如shell脚本)。注意这些脚本不是 Executable object file,它们只是文本文件,但是执行这些脚本所用的解释器就是 Executable object file,比如 bash shell 程序。

  3. 可被共享的对象文件(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相关推荐

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

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

  2. -fpic 与-fPIC的区别

    -fpic 与-fPIC的区别 前言 在编译动态库的时候,我们应该需要使用-fpic 或-fPIC参数.如下所示: 然后,使用gcc或g++ 命令生成动态库 pic 与PIC的异同 相同点:都是为了在 ...

  3. gcc动态库fPIC和fpic编译选项差异介绍

    作者以前并没有特别留意fPIC和fpic之间的差别,最近在aarch64服务器上编译遇到的一个问题,让自己好好的查询了一些资料,或许平常的开发人员并不容易遇到它,但愿对有缘的读者有一定帮助. 1)出动 ...

  4. linux 内核fpic,浅谈-fPIC与-fpic

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

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

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

  6. How can I set ccshared=-fPIC while executing ./configure?

    解决方式如下: make clean ./configure CFLAGS=-fPIC CXXFLAGS=-fPIC

  7. Linux: fPIC与 pie 区别

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

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

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

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

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

最新文章

  1. 项目打包去掉调试时的NSLog、print
  2. CSS 基础知识(二)
  3. 软件需求分层处理的多种常见方式
  4. Visual Studio 2022 预览版2 发布啦
  5. 来到博客园 就要好好记录 分享技术
  6. 诗与远方:无题(六十六)- 清明时节雨纷下
  7. Java后端学习体系(韩顺平)
  8. 威纶通触摸屏可以解密吗_【实例】西门子PLC变频器和触摸屏综合应用
  9. 华硕笔记本触摸板失灵
  10. mysql 空串 0_casewhen遇到空串转成0
  11. 新浪微博分享图片不改变问题
  12. [经]信用体系,金融改革
  13. QQ上接收的文件资料在哪里能打印?
  14. Windows安全设置-当前的安全设置不允许从该位置下载文件
  15. CSS实现多余文本隐藏
  16. 在公众号添加付费链接
  17. OpenCV—Python 图像加减乘除-逻辑运算
  18. Android 保持屏幕不熄屏
  19. NetSpider 网络蜘蛛1.0 的简介
  20. 如何使用STM32和BLE收集SHT85传感器数据?

热门文章

  1. python什么时候用空格_python编码规范——空格的使用
  2. 系统学习Pytorch笔记七:优化器和学习率调整策略
  3. matlab 产生循环矩阵,matlab循环矩阵
  4. 高质量c++/c编程指南pdf
  5. 手把手教你solidworks中的齿轮配合
  6. smbclient介绍
  7. java 逻辑运算符有哪些_Java逻辑运算符的简单介绍
  8. JQuery 之 事件委托(事件代理)
  9. R16 Dormant BWP
  10. redhawk:Low Power Analysis