gcc生成执行文件过程为:源文件(*.c文件)编译成对象文件(*.o文件);

链接程序ld,把对象文件(*.o文件)链接成可执行程序。

因此要透彻链接的过程, 需要先了解对象文件(*.o文件)是怎样构成的?

下面用个简单的例子来说明:

#includeint global_var=5;extern int other_file_var;int main(){ int a=1;

int b=a other_file_var; return 0;

}gcc -c test.c -o test.o 生成test.o;

查看test.o内容(vim test.o):

图1

看到的是一堆乱码,因为查看方式不对, 就像mp3格式的文件需要用音乐播放器才能播放一样,对象文件(*.o)是elf格式的, 需要用objdump, readelf 工具来查看。

从elf格式的官方文档,可以了解到elf格式文件的结构如下图所示:

图2

下面将一个个部分来分析。

1. ELF文件头(Header)分析

readelf -h test.o查看elf文件头部信息

主要字段的含义已在图中标识;

由Size of this headers可知,头部占用了64字节;

用hexdump -n 64 test.o 查看头部64字节数据内容(16进制格式);图中红框里的数据就是test.o文件的前64字节,也就是elf头部,对比上面两图,(图1)中的魔数7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 刚好与(图2)中的前16字节(小段编码)对应,后面每个字段的含义也是一一对应的;

头部信息结构可以参考/usr/include/elf.h 里ELf64_Ehdr, 32位的可以参考ELf32_Ehdr结构typedef struct{

unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */

Elf64_Half    e_type;                 /* Object file type */

Elf64_Half    e_machine;              /* Architecture */

Elf64_Word    e_version;              /* Object file version */

Elf64_Addr    e_entry;                /* Entry point virtual address */

Elf64_Off     e_phoff;                /* Program header table file offset */

Elf64_Off     e_shoff;                /* Section header table file offset */

Elf64_Word    e_flags;                /* Processor-specific flags */

Elf64_Half    e_ehsize;               /* ELF header size in bytes */

Elf64_Half    e_phentsize;            /* Program header table entry size */

Elf64_Half    e_phnum;                /* Program header table entry count */

Elf64_Half    e_shentsize;            /* Section header table entry size */

Elf64_Half    e_shnum;                /* Section header table entry count */

Elf64_Half    e_shstrndx;             /* Section header string table index */} Elf64_Ehdr;由字段Start Of Section Header可知,在test.o文件的656字节处有一个'段的头部表'。

2. ELF段头部表(Section Header)分析

用readelf -S test.o查看'段的头部表',在这个表里保存了文件里所有段的属性信息,如段的名字,段在文件的开始位置, 段的长度等:

图4

由图可知主要字段的含义已从图中标识;

段表的数据在偏离文件开始的0x290处,跟ELF Header Start Of Section Header字段保持一致;

这个段表里总共有12项,不同的项描述了不同段的属性;

2.1 text段

text段在偏离test.o文件开头0x40字节处,长度为0x20字节,用hexdump -s 0x40 -n 0x20 test.o,查看text段的16进制内容。

图5

然后objdump -d test.o 打印出程序的反汇编代码,

图6

由上面两图可知,text部分的数据恰好是main函数的机器码,也就是text段里保存的是代码段。

2.2 data段

data段在偏离test.o文件开头0x60字节处,长度为0x4字节,用hexdump -s 0x60 -n 0x4 test.o,查看data段的16进制内容,

图7

4个字节刚好是个int的长度,里面保存的数值是5,也就是全局变量global_var的值,验证了已初始化的全局变量保存在data段。

2.3 bss段

2.4 .rela.text (text的重定位段)

main函数里的global_var定义在别的文件,后面链接需要根据别的文件来确定它的虚拟内存地址,由于text中有需要重定位的变量,所以就有了.rela.text段。readelf -r test.o

图8

offset列表示需要重定位的符号在该段中的偏移,这里表示偏离text段0xd处;

info列高4个字节是该符号在.symtab中的索引,见下图;

图9

2.5 .symtab 符号表

图9

ndx列是该符号在段表中的索引:(1)比如global_var的索引为3,图4中索引3表示data段,

也就是说global_var这个符号在data段;(2)如果是“UND“则表示该符号定义在别的文件,需要重定位,重定位信息见“2.4 .rela.text”。

图10

elf文件反编译C语言,图文并茂,讲透C语言静态链接,ELF文件篇相关推荐

  1. 对Android APK文件反编译查看其源码

    概述 作为android的开发者,相信你会有那么一刻,比如,对于手机中某一款App,有一项功能或者效果你蛮喜欢的,想学习一下它具体是怎么实现的.追求高一点的话,我想深究它这个App的项目架构,本着一探 ...

  2. Android APK+Dex文件反编译及回编译工具(APKDB)v.1.9.2 正式版

    http://idoog.me/?p=1913 [Android APK+Dex文件反编译及回编译工具 (APKDB)v.1.9.2 正式版] <APK+Dex文件反编译及回编译工具> 简 ...

  3. 什么是pyc文件,把python的py文件编译成pyc文件,把pyc文件反编译成py文件。以及python编译的如何设置不生成pyc文件

    文章目录 1 什么是pyc文件 1.1 什么是pyc文件 1.2 pyc文件是怎么生成的,有什么好处 2 把python的py文件编译成pyc文件 2.1 使用python内置库py_compile把 ...

  4. java在控制台中的反编译指令,反编译class-class文件反编译工具 v0.3.7免费版

    反编译class class文件反编译工具是一款class文件反向编译的java工具,它能够将class文件逆向编译为java语言.此款软件比较小巧,特别适合初学者使用,感兴趣的赶紧下载啊! clas ...

  5. pyc文件反编译为py文件

    近期时不时需要把工程里的 pyc 文件反编译出来,查看接口函数的逻辑.此前有师兄安利了uncompyle6工具,我使用了几次,发现反编译出来的代码逻辑很清晰,此处我也不能打包票 uncompyle6 ...

  6. 请教大家:如何把.DCU文件反编译回源代码?谢谢。

    请教大家:如何把.DCU文件反编译回源代码?谢谢. Delphi / Windows SDK/API http://www.delphi2007.net/DelphiAPI/html/delphi_2 ...

  7. 关于APK文件反编译方法(图文详解)

    今天晚上利用个把小时,终于把apk反编译彻底弄明白了,现在详细讲解一下apk反编译的具体过程. 1.下载三个工具 APK Multi-Tool    作用:获取apk的配置资源文件 dex2jar-0 ...

  8. Android-apk文件反编译

    一:工具介绍及下载 1:apktool         作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 2:dex2jar       作用:将apk反编译成java源码(classes ...

  9. 【python】pyc文件反编译为py文件

    需求:把项目里的 pyc 文件反编译出来,查看接口函数的逻辑 解决方案:uncompyle6可将python字节码转换回等效的python源代码,它接受python 1.3版到3.8版的字节码 具体实 ...

  10. java的class文件反编译工具jad的应用

    java的class文件反编译工具jad的应用 JAD用法具体用法: http://www.kpdus.com/jad.html  官方最新版本,支持jdk1.6 Java下的一个简单易用的反编译工具 ...

最新文章

  1. 600余名外出务工者免费乘高铁“返乡专列”回云南过春节
  2. WPF DispatcherTimer(定时器应用) 无人触摸60s自动关闭窗口
  3. 四十九、微信小程序开发页面样式WXSS和页面交互JS
  4. CentOS 初体验三: Yum 安装、卸载软件
  5. gearhost php,Gearhost 免费主机的申请
  6. 在centos7环境下建立MariaDB多实例
  7. 【转】 linux的网络接口之扫盲
  8. Linux与shell编程之一: Linux基础知识总结
  9. linux下DNS配置详解
  10. python用时间戳给文件命名-在Python中每小时将时间戳记写入文件
  11. 深度解读 | 102万行代码,1270个问题,Flink 1.10 发布了什么?
  12. myelicpes2019初次使用设置_实况足球2019球员数据编辑器怎么使用
  13. Ingenuous Cubrency UVA - 11137(完全背包)
  14. android nfc 启动流程,android-NFC-如何使用NDEF_DISCOVERED启动应用程序
  15. 网络编程(6)--------javaweb(TCP协议)
  16. java 拼图游戏_Java 拼图游戏
  17. 高等数学 武忠祥强化班
  18. 狄克斯特拉算法(Dijkstra)——算法思想及代码实现
  19. java happen-before_java 内存模型中的happen-before 是什么?
  20. 修复树莓派鼠标移动缓慢迟滞问题

热门文章

  1. 【Top 30+案例评选】CSDN“2019 优秀AI、IoT应用案例TOP 30+”正式发布
  2. wps字体颜色怎么改
  3. fudge函数C语言,C语言程序设计-中国大学mooc-题库零氪
  4. 深度学习入门笔记(十八):卷积神经网络(一)
  5. 理想服务员 --励志动漫
  6. AndroidQ与腾讯tbs的兼容问题
  7. NUC972在linux下的KSZ8851-16 mll网卡驱动开发
  8. 一文读懂5G智慧教育:42个应用场景如何改变教育
  9. 香港大学的计算机专业,香港大学计算机专业研究方向介绍(英文)
  10. 写给想加入淘宝的在校同学--广州实习生招聘感想