Linux工具 - READELF ELF文件格式分析


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

【文件类型】

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

ELF文件有三种类型:

    1、可重定位的对象文件(Relocatable file)

        由汇编器汇编生成的 .o 文件

    2、可执行的对象文件(Executable file)

        可执行应用程序

    3、可被共享的对象文件(Shared object file)

        动态库文件,也即 .so 文件

    ·    .text section 里装载了可执行代码;

    ·    .data section 里面装载了被初始化的数据;

    ·    .bss section 里面装载了未被初始化的数据;

    ·    以 .rec 打头的 sections 里面装载了重定位条目;

    ·    .symtab 或者 .dynsym section 里面装载了符号信息;

    ·    .strtab 或者 .dynstr section 里面装载了字符串信息;


【参数说明】

    ·    -a -all 全部相当于:-h -l -S -s -r -d -V -A -I

    ·    -h -file-header文件头显示ELF文件头

    ·    -l -program-headers程序显示程序头

    ·    -segments -program-headers的别名

    ·    -S -section-headers段头显示部分的标题

--sections-section-headers的别名

    ·    -e -headers全部头相当于:-h -l -S

    ·    -s -syms符号表显示符号表

--symbols-syms的别名

    ·    -n -notes内核注释显示核心注释(如果有)

    ·    -r -relocs重定位显示重定位(如果存在)

    ·    -u -unwind显示展开信息(如果存在)

    ·    -d -dynamic动态段显示动态段(如果存在)

    ·    -V -version-info版本显示版本部分(如果有)

    ·    -A -arch-specific CPU构架显示特定于架构的信息(如果有)。

    ·    -D -use-dynamic动态段在显示符号时使用动态部分信息

    ·    -x -hex-dump = <number>显示段内内容转储<number>部分的内容

    ·    -w [liaprmfFso]或

    ·    -I -histogram显示铲斗列表长度的直方图

    ·    -W-wide宽行输出允许输出宽度超过80个字符

    ·    -H -help显示此信息

    ·    -v -version显示readelf的版本号


【示例】

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

[root@wzxaini9 ~]# readelf -h main| grep Machine

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

[root@wzxaini9 ~]# 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选项(加入调试信息):

[root@wzxaini9 ~]# readelf -S main| grep debug

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

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

[root@wzxaini9 ~]# readelf -S Shpos.o | grep debug


上一篇 下一篇

评论

登录后可发表评论