汽车电子开发过程中,代码完成后,程序编译完成 会生成 elf文件 或 hex文件,可以烧录到MCU中调试,那么究竟什么是 elf文件呢? elf 文件中又包含哪些信息? 如何解析 elf文件呢?
1. What is elf file
ELF(Executable and Linking Format),elf文件是 Linux下定义的一种文件格式。
elf Bible,Linux Standard Base 定义如下 。文末放链接。
1.1 elf type
广义上 elf文件 不止包含后缀为elf的 *.elf 文件
ELF文件有三种类型:
- 可重定位的对象文件(Relocatable file)
.o文件是 由汇编器汇编生成的对象文件,里面包含的内容就是01这样的机器可执行的指令,当程序要执行时还需要进行链接(link).链接就是把多个.o文件链成一个可执行文件。
.a 文件,.a文件是多个.o文件的组合。
- 可执行的对象文件(Executable file)可执行应用程序
嵌入式中 .elf文件, 后缀为elf的文件
Windows 下的 .exe
- 可被共享的对象文件(Shared object file)动态库文件,也即 .so 文件
1.2 how generate elf file
编译过程:
>预编译 >
>编译 >
>汇编 >
>link -生成 elf
1.3 elf 结构
ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且它们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。
- ELF头部(ELF_Header): 每个ELF文件都必须存在一个ELF_Header,这里存放了很多重要的信息用来描述整个文件的组织,如: 版本信息,入口信息,偏移信息等。程序执行也必须依靠其提供的信息。
- 程序头部表(Program_Header_Table): 可选的一个表,用于告诉系统如何在内存中创建映像,在图中也可以看出来,有程序头部表才有段,有段就必须有程序头部表。其中存放各个段的基本信息(包括地址指针)。
- 节区头部表(Section_Header_Table): 类似与Program_Header_Table,但与其相对应的是节区(Section)。
- 节区(Section): 将文件分成一个个节区,每个节区都有其对应的功能,如符号表,哈希表等。
- 段(Segment): 嗯…就是将文件分成一段一段映射到内存中。段中通常包括一个或多个节区
2. readelf
- readelf命令是gcc中的分析ELF文件的命令,安装MINGW后,会在其目录中发现 readelf.exe
- In cmd window,>> readelf -h Enter,then command windown echo all usage
- Usage: readelf <option(s)> elf-file(s)
- readelf --a file.elf >Info.txt
- Show all info, it is equivalent to: -h -l -S -s -r -d -V -A -I
- >Info.txt can help user print information to txt file in current directory
- 用该命令可以读出 elf 中所有信息
- readelf --a file.elf >Info.txt
Refernce:
Linux Standard Base Linux标准库中 elf 官方文档
https://refspecs.linuxbase.org/elf/elf.pdfrefspecs.linuxbase.org声明: 文章源于作者个人兴趣研究,只包含领域内公共信息,不包含任何商业信息。