可执行文件:在windows中为PE文件,在linux中为ELF文件
在linux下使用file命令查看相应的文件格式:
file foobar.o
file /bin/bash
file /lib/ld-2.5.1.so
分析:
一般C 语言的编译后执行语句都编译成机器代码,保存在.text段;
已经初始化的全局变量和局部静态变量都保存在.data段;
未初始化的全局变量和局部静态变量放在.bss段。
只读数据段.rodata
注释信息段.comment
堆栈提示段.note.GNU-stack
.plt和.got:动态链接的跳转表和全局入口表
objdump -h 查看目标文件的结构和内容 或readelf
ELF中结构:
objdump -s将所有段的内容以十六进制的方式打印出来
objdump -d将所有包含指令的段反汇编
objdump -x将文件内容更详细打印出来
ELF文件结构描述:
readelf -h查看文件头
ELF文件类型:
查看ELF段表:
objdump -h 或readelf -S
查看ELF文件的符号表:
objdump -t/readelf
objdump/readelf/nm
如:nm a.o
举例分析各个符号在符号表中状态:
第一列Num表示符号表数组的下标,第二列value就是符号值;第三列SIZE为符号大小,第四列和第五列分别为符号类型和绑定信息
,第七列表示该符号所属的段,最后一列是符号名称。
第一个符号永远是个未定义的符号。
特殊符号:
_executable_start:该符号为程序起始地址,不是入口地址,是程序的最开始的地址。
_etext或__etext\etext:代码段结束地址,即代码段最末尾的地址。
_edata或edata:该符号为数据段结束地址,即数据段最末尾的地址。
_end或end:为程序结束地址。