ELF是linux下的一种文件格式,类似WIN下的PE格式,包含有 .o 文件,.a 文件,.so 文件和可执行文件,还有core dump file(核心转储文件)
前面有文件头,内容以段划分,主要可分为test段,data段,rodata段,bss段,堆栈段
额外:WIN下动态库为 .dll ,静态库为 .lib
调试工具:
objdump:跨平台的查看段的工具,在GCC编译工具里有
objdump -h :查看主要的段
objdump -x:查看更多的段
objdump -size :查看各个段的长度
objdump -s -d:s以十六进制查看各个段,d以反汇编查看各个段
objcopy:跨平台工具,可以将文件转换为段数据。可以做为目标文件的一个段
readelf :linux下查看文件格式的工具,内容最详细
readelf -h 可以看文件头
readelf -S可以看段结构
一,文件头:
包含了ELF魔数(说明这是ELF格式的文件,WIN的PE也有自己的魔数),文件的机器位数,数据存储方式,版本,运行平台,ABI版本,ELF重定位位置类型,硬件平台,硬件平台版本,入口地址,程序头入口和长度,段表的位置和长度,段的数量
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 1048 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 64 (bytes)
Number of section headers: 13
Section header string table index: 10
二,段介绍:
段的标志:可用readelf -S查看
自定义段:
在程序中 __attribute__((section("name"))) 变量或函数
就可以指定对象放在自定义名字为 name 的段中
标准段:
1. 代码段
2. 数据段 data和只读数据段 rodata:存储初始化了的全局静态和局部静态变量,只读存储常量和字符串常量等
3. bss段:存储未被初始化的全局静态和局部静态变量,和初始化为0的上述,因为未被初始化的皆为0.bss段存储时空间一般是长度为0,只有在程序运行时才有空间
4. 重定位表:rela.data
5. 字符串表strtab:保存普通字符串
6. 段表字符串表shstrtab :保存段表中用到的字符串
7. common块:声明临时使用空间的大小,描述弱符号的参数空间大小等