快乐Linux —— 5. ElF 文件浅析

参考:

《程序员自我修养》

https://blog.csdn.net/Vince_/article/details/89076338 

http://www.skyfree.org/linux/references/ELF_Format.pdf 

0. 简述

ElF (Executable Linkable Format 可执行可连接格式),属于 COFF (Common file format) 通用文件格式 的变种。

因为目标文件( .o) 与可执行文件内容结构相似,所以一般与可执行文件格式采取同一种存储格式。我们将其统称为ELF文件。

file filename 可以使用 file 命令查看文件类型。

常见ELF文件类型

两种不同理解ELF文件的视角 (本文选择链接视角进行解析,即第一种视角)

1. ELF中重要的section

readelf -S xxx.o 查看文件中的各个段

objdump -s -d xxx.o 查看各个段的内容

ELF 文件中需要关注的一般就下图的几个段,下面对每个段进行简单解析。

  1. ELF Header ELF文件头

    readelf -h xxx.o

  1. .text 代码段

    存放程序的指令。

  2. .data 和 .rodata

    .data 存放已初始化的全局变量和局部静态变量。

    .rodata 存放只读数据和字符串常量。(有时字符串常量在.data区,不同编译器选择不同)

  3. .bss

    存放未初始化的全局变量和局部静态变量。

  4. .strtab 和 .shstrtab

    .strtab 保存普通的字符串,比如符号名称。注意这块存放的是ELF文件中的字符串,而不是代码中的字符串。

    .shstrtab 常用于保存段名。

  5. Section Header Table 段表

    保存各个段的信息包括 段名,段长,文件中的偏移,读写权限等等。

    编译器,连接器和装载器都是依靠段表访问各个段的。

  6. .symtab 符号表

    记录ELF文件中用到的所有符号,每个符号有符号值对变量和函数来说,符号值就是它们的地址。关于符号的更多信息: https://blog.csdn.net/baidu_41667019/article/details/84789564

  7. . rel.text 重定位表

猜你喜欢

转载自www.cnblogs.com/starrys/p/11911064.html