You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
5.6 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# readelf
## 说明
**readelf命令** 用来显示一个或者多个elf格式的目标文件的信息可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示
那些被检查的文件。可以支持32位64位的elf格式文件也支持包含elf文件的文档这里一般指的是使用ar命令将一些elf文件打包之
后生成的例如lib*.a之类的“静态库”文件
这个程序和objdump提供的功能类似但是它显示的信息更为具体并且它不依赖BFD库(BFD库是一个GNU项目它的目标就是希望通过一
种统一的接口来处理不同的目标文件)所以即使BFD库有什么bug存在的话也不会影响到readelf程序
运行readelf的时候除了-v和-H之外其它的选项必须有一个被指定
## 选项
```markdown
用法readelf <选项> elf-文件
显示关于 ELF 格式文件内容的信息
Options are:
-a --all 显示全部信息,等价于: -h -l -S -s -r -d -V -A -I
-h --file-header 显示elf文件开始的文件头信息
-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
-g --section-groups Display the section groups
-t --section-details Display the section details
-e --headers 显示全部头信息,等价于: -h -l -S
-s --syms Display the symbol table
--symbols An alias for --syms
--dyn-syms Display the dynamic symbol table
-n --notes Display the core notes (if present)
-r --relocs 显示可重定位段的信息 (if present)
-u --unwind 显示unwind段信息。当前只支持IA64 ELF的unwind段信息 (if present)
-d --dynamic Display the dynamic section (if present)
-V --version-info Display the version sections (if present)
-A --arch-specific Display architecture specific information (if any)
-c --archive-index Display the symbol/file index in an archive
-D --use-dynamic Use the dynamic section info when displaying symbols
-x --hex-dump=<number|name>
Dump the contents of section <number|name> as bytes
-p --string-dump=<number|name>
Dump the contents of section <number|name> as strings
-R --relocated-dump=<number|name>
Dump the contents of section <number|name> as relocated bytes
-z --decompress Decompress section before dumping it
-w[lLiaprmfFsoRt] or
--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,
=frames-interp,=str,=loc,=Ranges,=pubtypes,
=gdb_index,=trace_info,=trace_abbrev,=trace_aranges,
=addr,=cu_index]
Display the contents of DWARF2 debug sections
--dwarf-depth=N Do not display DIEs at depth N or greater
--dwarf-start=N Display DIEs starting with N, at the same depth
or deeper
-I --histogram Display histogram of bucket list lengths
-W --wide Allow output width to exceed 80 characters
@<file> Read options from <file>
```
### ELF文件类型
**种类型的ELF文件**
1. 可重定位文件:用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。 
2. 可执行文件:用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。 
3. 共享目标文件用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像例如lib*.so文件。 
**ELF文件作用**
ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序)所以可以从不同的角度来看待elf格式的文件 
1. 如果用于编译和链接可重定位文件则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。 
2. 如果用于加载执行可执行文件则加载器则将把elf文件看作是程序头表描述的段的集合一个段可能包含多个节节头表可选。 
3. 如果是共享文件,则两者都含有。 
**ELF文件总体组成**  
elf文件头描述elf文件的总体信息。包括系统相关类型相关加载相关链接相关。 
* 系统相关表示elf文件标识的魔术数以及硬件和平台等相关信息增加了elf文件的移植性,使交叉编译成为可能。 
* 类型相关就是前面说的那个类型。 
* 加载相关:包括程序头表相关信息。 
* 链接相关:节头表相关信息。 
## 实例
```bash
readelf -h main # 读取可执行文件main的elf文件头信息
readelf -h myfile.o # 读取目标文件形式的elf文件头信息
readelf -h libmy.a # 读取静态库文件形式的elf文件头信息
readelf -h libmy.so # 读取动态库文件形式的elf文件头信息
readelf -l main # 查看可执行的elf文件程序头表信息
readelf -l myfile.o # 查看目标文件的elf文件程序头表信息
readelf -l libmy.a # 查看静态库文件的elf文件程序头表信息
readelf -l libmy.so # 查看动态库文件的elf文件程序头表信息
readelf -S main # 查看一个可执行的elf文件的节信息
readelf -S main.debug # 查看一个包含调试信息的可执行的elf文件的节信息
readelf -S myfile.o # 查看一个目标文件的elf文件的节信息
readelf -S libmy.a # 查看一个静态库文件的elf文件的节信息
```