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.

5.6 KiB

readelf

说明

readelf命令 用来显示一个或者多个elf格式的目标文件的信息可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示 那些被检查的文件。可以支持32位64位的elf格式文件也支持包含elf文件的文档这里一般指的是使用ar命令将一些elf文件打包之 后生成的例如lib*.a之类的“静态库”文件

这个程序和objdump提供的功能类似但是它显示的信息更为具体并且它不依赖BFD库(BFD库是一个GNU项目它的目标就是希望通过一 种统一的接口来处理不同的目标文件)所以即使BFD库有什么bug存在的话也不会影响到readelf程序

运行readelf的时候除了-v和-H之外其它的选项必须有一个被指定

选项

用法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文件的移植性,使交叉编译成为可能。 
  • 类型相关就是前面说的那个类型。 
  • 加载相关:包括程序头表相关信息。 
  • 链接相关:节头表相关信息。 

实例

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文件的节信息