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

2019-04-23 19:47 By "Powerless" 2869 0 1

【文件类型】

    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


评 论

View in WeChat

Others Discussion

  • 程序员年中考试题-段子版
    Posted on 2021-06-23 15:57
  • MySQL事务介绍
    Posted on 2019-06-05 18:14
  • BASE原则
    Posted on 2020-12-17 16:42
  • PHP8.1 性能基准测试
    Posted on 2022-10-08 17:40
  • Mysql联合索引的最左前缀匹配原则
    Posted on 2018-08-25 15:00
  • HTTP和HTTPS的区别
    Posted on 2020-08-10 23:00
  • 2018年云计算热词
    Posted on 2019-06-12 18:19
  • MySQL分组
    Posted on 2019-11-18 14:00