ELF 是Executable and Linking Format的缩写,即可执行和可链接的格式,是Unix/Linux系统ABI (Application Binary Interface)规范的一部分。

Unix/Linux下的可执行二进制文件、目标代码文件、共享库文件和core dump文件都属于ELF文件。

左边是ELF的链接视图,可以理解为是目标代码文件的内容布局。右边是ELF的执行视图,可以理解为可执行文件的内容布局。

注意目标代码文件的内容是由section组成的,而可执行文件的内容是由segment组成的。

要注意区分段(segment)和节(section)的概念,这两个概念在后面会经常提到。

我们写汇编程序时,用.text,.bss,.data这些指示,都指的是section,比如.text,告诉汇编器后面的代码放入.text section中。

目标代码文件中的section和section header table中的条目是一一对应的。section的信息用于链接器对代码重定位。

而文件载入内存执行时,是以segment组织的,每个segment对应ELF文件中program header table中的一个条目,用来建立可执行文件的进程映像。

比如我们通常说的,代码段、数据段是segment,目标代码中的section会被链接器组织到可执行文件的各个segment中。

.text section的内容会组装到代码段中,.data, .bss等节的内容会包含在数据段中。

在目标文件中,program header不是必须的,我们用gcc生成的目标文件也不包含program header。

一个好用的解析ELF文件的工具是readelf。对我本机上的一个目标代码文件sleep.o执行readelf -S sleep.o,输出如下:

There are 12 section headers, starting at offset 0x270:

Section Headers:

[Nr] Name Type Address Offset

Size EntSize Flags Link Info Align

[ 0] NULL 0000000000000000 00000000

0000000000000000 0000000000000000 0 0 0

[ 1] .text PROGBITS 0000000000000000 00000040

0000000000000015 0000000000000000 AX 0 0 1

[ 2] .rela.text RELA 0000000000000000 000001e0

0000000000000018 0000000000000018 I 9 1 8

[ 3] .data PROGBITS 0000000000000000 00000055

0000000000000000 0000000000000000 WA 0 0 1

[ 4] .bss NOBITS 0000000000000000 00000055

0000000000000000 0000000000000000 WA 0 0 1

... ... ... ...

[11] .shstrtab STRTAB 0000000000000000 00000210

0000000000000059 0000000000000000 0 0 1

Key to Flags:

W (write), A (alloc), X (execute), M (merge), S (strings), I (info),

L (link order), O (extra OS processing required), G (group), T (TLS),

C (compressed), x (unknown), o (OS specific), E (exclude),

l (large), p (processor specific)

readelf -S是显示文件中的Section信息,sleep.o中共有12个section, 我们省略了其中一些Section的信息。

可以看到,除了我们熟悉的.text, .data, .bss,还有其它Section,这等我们以后展开讲Section的时候还会专门讲到。

看每个Section的Flags我们也可以得到一些信息,比如.text section的Flags是AX,表示要分配内存,并且是可执行的,这一节是代码无疑了。

.data 和 .bss的Flags的Flags都是WA,表示可写,需分配内存,这都是数据段的特征。

使用readelf -l可以显示文件的program header信息。我们对sleep.o执行readelf -l sleep.o。会输出There are no program headers in this file.。

program header和文件中的segment一一对应,因为目标代码文件中没有segment,program header也就没有必要了。

可执行文件的内容组织成segment,因此program header table是必须的。

section header不是必须的,但没有strip过的二进制文件中都含有此信息。

对本地可执行文件sleep执行readelf -l sleep,输出如下:

Elf file type is DYN (Shared object file)

Entry point 0x1040

There are 11 program headers, starting at offset 64

Program Headers:

Type Offset VirtAddr PhysAddr

FileSiz MemSiz Flags Align

PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040

0x0000000000000268 0x0000000000000268 R 0x8

INTERP 0x00000000000002a8 0x00000000000002a8 0x00000000000002a8

0x000000000000001c 0x000000000000001c R 0x1

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000

0x0000000000000560 0x0000000000000560 R 0x1000

LOAD 0x0000000000001000 0x0000000000001000 0x0000000000001000

0x00000000000001d5 0x00000000000001d5 R E 0x1000

LOAD 0x0000000000002000 0x0000000000002000 0x0000000000002000

0x0000000000000110 0x0000000000000110 R 0x1000

LOAD 0x0000000000002de8 0x0000000000003de8 0x0000000000003de8

0x0000000000000248 0x0000000000000250 RW 0x1000

DYNAMIC 0x0000000000002df8 0x0000000000003df8 0x0000000000003df8

0x00000000000001e0 0x00000000000001e0 RW 0x8

NOTE 0x00000000000002c4 0x00000000000002c4 0x00000000000002c4

0x0000000000000044 0x0000000000000044 R 0x4

GNU_EH_FRAME 0x0000000000002004 0x0000000000002004 0x0000000000002004

0x0000000000000034 0x0000000000000034 R 0x4

GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000

0x0000000000000000 0x0000000000000000 RW 0x10

GNU_RELRO 0x0000000000002de8 0x0000000000003de8 0x0000000000003de8

0x0000000000000218 0x0000000000000218 R 0x1

Section to Segment mapping:

Segment Sections...

00

01 .interp

02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt

03 .init .plt .text .fini

04 .rodata .eh_frame_hdr .eh_frame

05 .init_array .fini_array .dynamic .got .got.plt .data .bss

06 .dynamic

07 .note.ABI-tag .note.gnu.build-id

08 .eh_frame_hdr

09

10 .init_array .fini_array .dynamic .got

如输出所示,文件中共有11个segment。只有类型为LOAD的段是运行时真正需要的。

除了段信息,还输出了每个段包含了哪些section。比如第二个LOAD段标志为R(只读)E(可执行)的,它的编号是03,表示它包含哪些section的那一行内容为:

03 .init .plt .text .fini。

可以发现.text包含在其中,这一段就是代码段。

再比如第三个LOAD段,索引是04,标志为R(只读),但没有可执行的属性,它包含的section有.rodata .eh_frame_hdr .eh_frame,其中rodata表示只读的数据,也就是程序中用到的字符串常量等。

最后一个LOAD段,索引05,标志RW(可读写),它包含的节是.init_array .fini_array .dynamic .got .got.plt .data .bss,可以看到.data和.bss都包含其中,这段是数据段无疑。

今天先讲到这里,后面的内容这样组织:

首先讲一下Elf文件的header,因为文件一开始几十个字节就是Elf header的数据,这个数据结构包含了很多信息,还能告诉我们program header table, section header table在文件中什么位置。

接下来会讲一下如何解读section header table,以及section的数据如何组织的。

然后会讲program header table,以及segment的数据组织。section是如何组织成段的,这一点我们也要弄请求。

最后我们会讲程序如果被loader加载到内存中,生成进程映像的。

欢迎继续关注。

elf section类型_ELF文件解析(一):Segment和Section相关推荐

  1. elf section类型_ELF格式解析库之基本数据类型

    ELF格式简介 ELF是现代linux/unix流行的程序可执行链接格式,它有官方定义文档,具体的资料在Tool Interface Standard Executable and Linking F ...

  2. elf section类型_ELF文件格式解析

    ELF文件格式解析 ELF(Executable and Linking Format) 1) 可重定位的对象文件(Relocatable file) 2) 可执行的对象文件(Executable f ...

  3. elf section类型_ELF结构(主要是符号表)

    1.1.1   整体结构 ELF对象格式用于目标文件(.o扩展名)和执行文件. 有些信息只出现在目标文件或执行文件中. ELF文件由下列部件构成. ELF header必须放在文件的开始;其他部件可以 ...

  4. elf section类型_ELF文件格式分析(示例代码)

    要求: 1.分析文件头. 2.通过文件头找到section header table,理解其内容. 3.通过section header table找到各section. 4.理解常见的.text . ...

  5. 记:ELF文件解析初定义——Section段相关讲解

    0x00 概论 因为TI的DSP输出文件与传统的ELF文件不符,所以本人就顺道研究了一下现在的ELF的文件格式. 会将其陆续完成在文章中. 承接上文,上文书说到,解析文件头格式,数据段的分配定义,与数 ...

  6. awx文件解析_Android so(ELF)文件解析

    一.前言 so文件是啥?so文件是elf文件,elf文件后缀名是.so,所以也被chang常称之为so文件,elf文件是linux底下二进制文件,可以理解为windows下的PE文件,在Android ...

  7. elf文件格式_Android so(ELF) 文件解析

    Android so(ELF) 文件解析 Android so(ELF) 文件解析 前言 生成 so 文件 相关工具 objdump readelf 整体结构图 头部结构 段表结构 字符串表结构 程序 ...

  8. Android so(ELF) 文件解析

    文章目录 前言 生成 so 文件 相关工具 objdump readelf 整体结构图 头部结构 段表结构 字符串表结构 程序表结构 符号表结构 重定位表结构 其他结构 解析代码 打开 ELF 文件 ...

  9. ELF文件解析 ELF File Parsing

    ELF File Parsing ​ Executable and Linkable Format 实验材料:010editor readelf objdump linux_ls文件(x86-64) ...

最新文章

  1. Nutch的安装和配置
  2. leetcode算法题--从上到下打印二叉树 II
  3. 接上,优化滚动的效率
  4. 浏览器的一个请求从发送到返回都经历了什么?
  5. Shell 命令大全Xhell入门
  6. Mysql设置binlog过期时间并自动删除
  7. 使用flash在IPAD2上播放FLV效率不高
  8. 开源的东西,只是用来参考学习,要商用路途遥远
  9. python win32api键盘_python基于win32api实现键盘输入
  10. webstorm破解码
  11. cfa英语不好的怎么学_英语不好能考CFA吗?看看他是怎么做到的
  12. 用友 U8 word模板修改
  13. 远程过程调用(RPC)详解
  14. 清华大学计算机学院张远,计算机系2019-2020学年度学生代表大会顺利召开
  15. 传感器自学笔记第八章——DHT11温湿度传感器(附带自己写的很好用的51单片机DHT11代码模板,参数列表只有一个字符数组指针)
  16. php slim get,php – 在Slim上获取请求参数
  17. android:很抱歉,XXX已停止运行
  18. CS61A Lab 7
  19. 常见数据结构-栈-队列-数组-链表-哈希表
  20. win10无线网卡驱动怎么安装【系统天地】

热门文章

  1. tfjob的一篇文章,跟公司内使用方式类似
  2. windows 下xampp集成环境安装mongodb扩展
  3. Otter-入门篇4(单向同步实践)
  4. (匹配 二维建图) Antenna Placement --POJ --3020
  5. 技术的那些事儿_3_西方技术管理的精髓
  6. 关于Silverlight安装问题之二
  7. HTML有几种发音模式,html – 使用lang属性和拼音发音的正确方法是什么(如果有的话)?...
  8. linux不识别ntfs分区,WinUbuntu下linux无法挂载NTFS格式分区问题的解决
  9. linux删除目录所有内容,如何从Linux上的目录中删除所有内容
  10. 【web前端】可筛选[输入搜索]的select(重写)