readelf

readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件。

语法:readelf (选项)(参数:文件),除了-v和-H之外,其它的选项必须有一个被指定参数



1、选项 -h(elf header),显示elf文件开始的文件头信息。
2、选项 -l(program headers),segments 显示程序头(段头)信息(如果有数据的话)。
3、选项 -S(section headers),sections 显示节头信息(如果有数据的话)。
4、选项 -g(section groups),显示节组信息(如果有数据的话)。
5、选项 -t,section-details 显示节的详细信息(-S的)。
6、选项 -s,symbols 显示符号表段中的项(如果有数据的话)。
7、选项 -e,headers 显示全部头信息,等价于: -h -l -S 。
8、选项 -n,notes 显示note段(内核注释)的信息 。
9、选项 -r,relocs 显示可重定位段的信息。
10、选项 -u,unwind 显示unwind段信息。当前只支持IA64 ELF的unwind段信息。
11、选项 -d,dynamic 显示动态段的信息。
12、选项 -V,version-info 显示版本段的信息。
13、选项 -A,arch-specific 显示CPU构架信息。
14、选项 -I,histogram 显示符号的时候,显示bucket list长度的柱状图。
15、选项 -x,hex-dump= 以16进制方式显示指定段内内容。number指定段表中段的索引,或字符串指定文件中的段名
16、选项 -D,use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段 。
17、选项 -a,all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I。
18、选项 -v,version 显示readelf的版本信息。
19、选项 -H,help 显示readelf所支持的命令行选项。



readelf elf文件格式分析
这个工具和objdump命令提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件);



ELF文件类型
ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF是构成众多xNIX系统的基础之一。
ELF文件有三种类型:



可重定位的对象文件(Relocatable file)
由汇编器汇编生成的 .o 文件
可执行的对象文件(Executable file)
可执行应用程序
可被共享的对象文件(Shared object file)
动态库文件,也即 .so 文件
.text section 里装载了可执行代码;
.data section 里面装载了被初始化的数据;
.bss section 里面装载了未被初始化的数据;
以 .rec 打头的 sections 里面装载了重定位条目;
.symtab 或者 .dynsym section 里面装载了符号信息;
.strtab 或者 .dynstr section 里面装载了字符串信息;
13.1. 参数说明
-a –all 全部 Equivalent to: -h -l -S -s -r -d -V -A -I



-h –file-header 文件头 Display the ELF file header



-l –program-headers 程序 Display the program headers



–segments An alias for –program-headers



-S –section-headers 段头 Display the sections’ header



–sections
An alias for –section-headers



-e –headers 全部头 Equivalent to: -h -l -S



-s –syms 符号表 Display the symbol table



–symbols
An alias for –syms



-n –notes 内核注释 Display the core notes (if present)



-r –relocs 重定位 Display the relocations (if present)



-u –unwind Display the unwind info (if present)



-d –dynamic 动态段 Display the dynamic segment (if present)



-V –version-info 版本 Display the version sections (if present)



-A –arch-specific CPU构架 Display architecture specific information (if any).



-D –use-dynamic 动态段 Use the dynamic section info when displaying symbols



-x –hex-dump= 显示 段内内容Dump the contents of section



-w[liaprmfFso] or



-I –histogram Display histogram of bucket list lengths



-W –wide 宽行输出 Allow output width to exceed 80 characters



-H –help Display this information



-v –version Display the version number of readelf



13.2. 示例
想知道一个应用程序的可运行的架构平台:



$readelf -h main| grep Machine
-h选项将显示文件头的概要信息,从里面可以看到,有很多有用的信息:



$readelf -h main
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: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x400790
Start of program headers: 64 (bytes into file)
Start of section headers: 5224 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 8
Size of section headers: 64 (bytes)
Number of section headers: 29
Section header string table index: 26
一个编译好的应用程序,想知道其编译时是否使用了-g选项(加入调试信息):



$readelf -S main| grep debug
用-S选项是显示所有段信息;如果编译时使用了-g选项,则会有debug段;



查看.o文件是否编入了调试信息(编译的时候是否加了-g):










$readelf -S Shpos.o grep debug


https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/objdump.html



目标文件只是ELF文件的可重定位文件(Relocatable file),ELF文件一共有4种类型:Relocatable file、Executable file、Shared object file和Core Dump file



http://sourceware.org/binutils/docs/binutils/readelf.html



https://hustcat.github.io/getting-into-core-dump-file/




  1. objdump 二进制文件分析
    objdump工具用来显示二进制文件的信息,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。



14.1. 常用参数说明
-f 显示文件头信息
-D 反汇编所有section (-d反汇编特定section)
-h 显示目标文件各个section的头部摘要信息
-x 显示所有可用的头信息,包括符号表、重定位入口。-x 等价于 -a -f -h -r -t 同时指定。
-i 显示对于 -b 或者 -m 选项可用的架构和目标格式列表。
-r 显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。
-R 显示文件的动态重定位入口,仅仅对于动态目标文件有意义,比如某些共享库。
-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。
-t 显示文件的符号表入口。类似于nm -s提供的信息
14.2. 示例
查看本机目标结构(使用大端还是小端存储):



$objdump -i
反汇编程序:



$objdump -d main.o
显示符号表入口:



$objdump -t main.o
希望显示可用的简洁帮助信息,直接输入objdump即可;(objdump -H)


Category linux