可执行文件的格式
目前主流的可执行文件格式主要分为两种:
- windows下的PE格式
- linux下的ELF格式
两种格式都是COFF格式的变种
下面接下来主要介绍ELF文件的文件结构
将使用下面两个工具查看文件结构:
- objdump(通用查看格式工具,具有反汇编功能)
- readelf (只能查看ELF文件格式,信息较为详细)
ELF文件结构
ELF文件类型:可重定位、可执行、共享目标文件、核心转储文件
- 可重定位文件:.o目标文件,.a静态库
- 可执行文件:.out可执行文件
- 共享目标文件:.so二进制文件
- 核心转储文件:一般程序崩溃的时候报错就是核心转储文件,典型的是Linux下的core dump
linux下可使用命令查看文件格式:file 文件
file demo.o
demo.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked,interpreter /lib64/l, for GNU/Linux2.6.32,
BuildID[sha1]=3a49c2dfa1a516767e95146b666d6d444d6403b9, not stripped
file libopencv_hdf.so.3.3.1
libopencv_hdf.so.3.3.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked,
BuildID[sha1]=8a273151900f0f70dca804faae8be408848fefd8, not stripped
linux下可以命令查看段表头对比
readelf -S -W 源文件.o
readelf -S -W 源文件.out
ELF文件的主要组成部分
- ELF文件头:描述文件的基本属性,如ELF文件版本、目标机器型号、程序入口地址等。
- 段表:描述包含的所有段的信息,包括段名、段的长度、在文件中的偏移、读写权限等。
- 辅助结构:重定位表(重定位文件特有)、字符串表、符号表等。
目标文件以代码段的形式存储信息
常用的结构,常用的几个段大致为:
- ELF文件头 在linux环境下,命令行输入readelf -h 目标文件 ,得到ELF文件头的信息
- .text 存储函数代码段
- .data 存储初始化