1、readelf
我们通常理解的程序软件都是运行在操作系统之上的,但是有的程序不能在不同的操作系统之上运行。
这是因为:
我们最终编译出来的可执行程序分两部分:真正的程序文件以及头信息 不同操作系统的头的格式是不同的,Windows上称为PE头,Linux上称为ELF头。
这个头部信息是专门给操作系统识别的。
开发裸机的时候需要使用objcopy这个命令将头部信息取出来,留下真正的程序文件。
因为带有头文件的程序刚开始不是可执行代码,裸机状态下无法执行,会导致程序一开始就卡死。
所以我们在裸机开发的时候在得到二进制文件以后再处理一下就是可以理解的了(说实话,这一点我当时非常疑惑)
readelf是读取可执行程序的头部信息
objcopy是抽取头部信息然后丢弃掉
使用方法: read -h 可执行程序名
入口地址表示程序的运行地址,所以一些病毒程序可能就是修改了这个入口地址,相当于我们双击一个原来的程序的时候,直接跳转到了病毒程序。
综上所述,在可执行文件的头部有一个头信息可以被操作系统识别,进行解析 。
在Linux上使用file命令可以查看可执行文件的相关信息,比如运行平台架构 。
2. size
读取可执行程序的大小 包含代码段,数据段,bss段等等
当改变全局变量或者其他的时候,可以看到代码信息的改变 关于程序的各种
段
也是一块比较大的知识点,有机会补一篇文章(狗头)3.nm
符号列表的概念,最精简,最好用的工具。
可以查看可执行程序的符号表,比如程序中的全局标签
T
表示全局函数
D
表示全局变量区
d
表示 static 修饰的变量
t
表示被 static 修饰的函数4.strip
剔除符号表。
相当于将刚才说的符号表进行剔除。
因为程序运行的时候不需要符号表 使用
file
命令可以查看是否剔除符号表剔除符号表以后文件大小会变得更小一点
一般情况下,生产过程最后将最后的程序进行剔除符号表 只能自己架构的工具剔除自己架构的程序的符号表
5.strings
查看可执行程序的常量字符串
6.objcopy
表示将头部信息拷出来,不然无法识别相应程序
7.objdump
反汇编程序
objdump -d <name> 或者 -D
表示反汇编文件8.addr2line
调试过程中将出错的结果及行号标志出来 但一般用不到