精华内容
下载资源
问答
  • readelf
    2020-03-07 23:02:01

    下面是readelf的基本参数:

    用法:readelf <选项> elf文件
      显示有关ELF格式文件内容的信息
      选项有:
       -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的别名
       -g --section-groups显示部分组
       -t --section-details显示节详细信息
       -e --headers等效于:-h -l -S
       -s --syms显示符号表
          --symbols --syms的别名
       --dyn-syms显示动态符号表
       -n --notes显示核心注释(如果存在)
       -r --relocs显示重定位(如果存在)
       -u --unwind显示展开信息(如果存在)
       -d --dynamic显示动态部分(如果存在)
       -V --version-info显示版本部分(如果有)
       -A --arch特定于Display体系结构的特定信息(如果有)
       -c --archive-index显示档案中的符号/文件索引
       -D --use-dynamic显示符号时使用动态部分信息
       -x --hex-dump = <数字|名称><number | name>节的内容作为字节转储
       -p --string-dump = <数字|名称><number | name>节的内容作为字符串转储
       -R --relocated-dump = <数字|名称>
                              将部分<number | name>的内容转储为重定位字节
       -z --decompress在转储节之前解压缩节
       -w [lLiaprmfFsoRtUuTgAckK]或
       --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,=链接,=关注链接]
                              显示DWARF调试部分的内容
       --dwarf-depth = N不显示深度N或更大的DIE
       --dwarf-start = N以相同的深度显示以N开头的DIE
                              或更深
       -I --histogram显示存储段列表长度的直方图
       -W --wide允许输出宽度超过80个字符
       @ <文件><文件>读取选项
       -H --help显示此信息
       -v --version显示readelf的版本号
    
    更多相关内容
  • windows系统下的nm、readelf等工具
  • readelf.zip

    2021-05-13 10:26:29
    使用C语言代码实现 readelf 工具的基本功能。程序使用 cmake 进行构建和编译。环境使用linux环境。使用方式如下: $ cd readelf/ $ mkdir build $ cd build $ cmake .. $ cmake build . 编译完成后,就可以使用: ...
  • linux的readelf命令行工具的源码
  • ReadELF, ELF格式分析程序源码 ReadELF, ELF格式分析程序源码 ReadELF, ELF格式分析程序源码 ReadELF, ELF格式分析程序源码 ReadELF, ELF格式分析程序源码
  • readelf工具

    2015-04-03 22:21:54
    eadelf是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用
  • readELF 无聊练习熟悉ELF和汇编指令
  • elf文件readelf打印日志

    2019-03-03 19:06:50
    elf文件readelf打印日志,便于没有linux环境的朋友学习对elf文件的查看
  • Linux readelf命令

    2021-04-21 10:49:31
    readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。 背景 目标文件 首先...

    概述

    readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。

    背景

    目标文件

    首先需要介绍的概念是**目标文件(Object file)**的概念。目标文件是计算机科学中编译器或汇编器处理源代码后所生成的代码(目标代码,Object code)的计算机文件,它常被称作二进制文件(binaries)。这个文件类型主要是区别于你看得懂的用人话写的代码文件(.c、.cpp etc.)、中间文件(.i)、汇编文件(.s)。常见的.exe、.dll、.so啥的都算目标文件。

    目标文件有三种类型: - 可重定位的对象文件(Relocatable file) 由汇编器汇编生成的 .o 文件(下面会详细讲到) - 可执行的对象文件(Executable file) 可执行应用程序 - 可被共享的对象文件(Shared object file) 动态库文件

    编译过程

    编译的过程如下图所示
    在这里插入图片描述
    代码文件经过语言预处理器、编译器、汇编器和链接器处理,最终生成可执行目标文件。

    下面以一个简单的c语言文件为例:

    sum.c源文件内容如下:

    int sum(int *a, int n)
    {
      int i, s = 0;
    
      for (i = 0; i < n; ++i) {
        s += a[i];
      }
      return s;
    }
    

    通过运行C预处理器(cpp)可以生成sum.i中间文件:

    # 1 "sum.c"
    # 1 "<built-in>"
    # 1 "<command-line>"
    # 1 "/usr/include/stdc-predef.h" 1 3 4
    # 1 "<command-line>" 2
    # 1 "sum.c"
    int sum(int *a, int n)
    {
      int i, s = 0;
    
      for (i = 0; i < n; ++i) {
        s += a[i];
      }
      return s;
    }
    

    通过运行C编译器(cc1),将中间文件生成为sum.s汇编文件:

    .file›"sum.i"
      .text
      .globl  sum
      .type›sum, @function
    sum:
    .LFB0:
      .cfi_startproc
      movl  $0, %eax
      movl  $0, %edx
      jmp›.L2
    .L3:
      movslq  %edx, %rcx
      addl  (%rdi,%rcx,4), %eax
      addl  $1, %edx
    .L2:
      cmpl  %esi, %edx
      jl  .L3
      rep ret
      .cfi_endproc
    .LFE0:
      .size›sum, .-sum
      .ident  "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-36)"
      .section  .note.GNU-stack,"",@progbits
    

    最终生成通过汇编器(as)生成一个可重定位目标文件(reloacatable object file)。

    什么是ELF

    系统里的目标文件是按照特定的目标文件格式来组织的,各个系统的目标文件格式都不相同。

    从贝尔实验室诞生的第一个Unix系统使用的是a.out格式(直到今天,可执行文件仍然称为a.out文件)。Windows使用可移植可执行(PortableExecutable,PE)格式。Mac OS-X使用Mach-O格式。现代x86-64Linux和Unix系统使用可执行可链接格式(Executable and Linkable Format,ELF)。

    ELF格式的文件在Linux系统下有.axf、 .bin、 .elf、 .o、 .prx、 .puff、 .ko、 .mod和.so等等

    readelf指令

    前面介绍了这么多ELF的背景知识,下面回来来说说readelf这个指令。这个指令正是用来查看目标文件的内容的。

    ELF可重定位目标文件的格式

    典型格式

    典型的ELF可重定位目标文件的格式如下图:
    在这里插入图片描述
    其中:

    • .text 节里装载了程序的可执行机器码
    • .rodata 节里装载了只读数据
    • .data 节里面装载了被初始化的数据,包括全局和静态C变量
    • .bss 节里面装载了未被初始化的全局和静态C变量(在目标文件中只是占位符,不占空间)
    • .symtab 或者 .dynsym 节里面装载了符号信息 - 以
    • .rel 打头的 节里面装载了重定位条目
    • .debug 一个调试符号表,只有使用了-g参数编译时才会有,用于debug
    • .line 用于记录C源程序的行号和.text节中机器指令之间的映射,也是只有使用了-g参数编译时才会有
    • .strtab 或者 .dynstr 节里面装载了字符串信息(以null结尾的字符串信息)

    符号表部分解析

    符号表每节定义如下:

    typedef struct { 
        int   name;      /* String table offset */ 
        char  type:4,    /* Function or data (4 bits) */ 
          binding:4; /* Local or global (4 bits) */ 
        char  reserved;  /* Unused */  
        short section;   /* Section header index */
        long  value;     /* Section offset or absolute address */ 
        long  size;      /* Object size in bytes */ 
    } Elf64_Symbol;
    

    具体解释如下:
    在这里插入图片描述

    举个例子

    以上面的sum.c生成的sum.o为例,我们选取readelf的-all参数输出全部内容:

    $readelf -all sum.o
    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:                              REL (Relocatable file)
      Machine:                           Advanced Micro Devices X86-64
      Version:                           0x1
      Entry point address:               0x0
      Start of program headers:          0 (bytes into file)
      Start of section headers:          536 (bytes into file)
      Flags:                             0x0
      Size of this header:               64 (bytes)
      Size of program headers:           0 (bytes)
      Number of program headers:         0
      Size of section headers:           64 (bytes)
      Number of section headers:         11
      Section header string table index: 10
    
    Section Headers:
      [Nr] Name              Type             Address           Offset
           Size              EntSize          Flags  Link  Info  Align
      [ 0]                   NULL             0000000000000000  00000000
           0000000000000000  0000000000000000           0     0     0
      [ 1] .text             PROGBITS         0000000000000000  00000040
           000000000000001b  0000000000000000  AX       0     0     1
      [ 2] .data             PROGBITS         0000000000000000  0000005b
           0000000000000000  0000000000000000  WA       0     0     1
      [ 3] .bss              NOBITS           0000000000000000  0000005b
           0000000000000000  0000000000000000  WA       0     0     1
      1 int sum(int *a, int n)
      2 {
      [ 4] .comment          PROGBITS         0000000000000000  0000005b
           000000000000002e  0000000000000001  MS       0     0     1
      [ 5] .note.GNU-stack   PROGBITS         0000000000000000  00000089
           0000000000000000  0000000000000000           0     0     1
      [ 6] .eh_frame         PROGBITS         0000000000000000  00000090
           0000000000000030  0000000000000000   A       0     0     8
      [ 7] .rela.eh_frame    RELA             0000000000000000  000001a8
           0000000000000018  0000000000000018   I       8     6     8
      [ 8] .symtab           SYMTAB           0000000000000000  000000c0
           00000000000000d8  0000000000000018           9     8     8
      [ 9] .strtab           STRTAB           0000000000000000  00000198
           000000000000000b  0000000000000000           0     0     1
      [10] .shstrtab         STRTAB           0000000000000000  000001c0
           0000000000000054  0000000000000000           0     0     1
    Key to Flags:
      W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
      L (link order), O (extra OS processing required), G (group), T (TLS),
      C (compressed), x (unknown), o (OS specific), E (exclude),
      l (large), p (processor specific)
    
    There are no section groups in this file.
    
    There are no program headers in this file.
    
    Relocation section '.rela.eh_frame' at offset 0x1a8 contains 1 entries:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    000000000020  000200000002 R_X86_64_PC32     0000000000000000 .text + 0
    
    The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported.
    
    Symbol table '.symtab' contains 9 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
         1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS sum.i
         2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1
         3: 0000000000000000     0 SECTION LOCAL  DEFAULT    2
         4: 0000000000000000     0 SECTION LOCAL  DEFAULT    3
         5: 0000000000000000     0 SECTION LOCAL  DEFAULT    5
         6: 0000000000000000     0 SECTION LOCAL  DEFAULT    6
         7: 0000000000000000     0 SECTION LOCAL  DEFAULT    4
         8: 0000000000000000    27 FUNC    GLOBAL DEFAULT    1 sum
    
    No version information found in this file.
    

    其中第一部分是ELF头(ELF header)中的描述信息。(用-h参数可以单独得到)。

    最后一部分是符号表部分(用-s参数可以单独得到该部分),前面八个条目是链接器内部使用的局部符号,最后一行是全局符号sum定义的条目。可以通过最后一行看出,它是一个位于.text节中偏移量为0处的27字节函数。(Ndx部分表示在哪个节中,1表示.text节,3表示.data节,对应上面输出的Section Headers部分)

    参数

    查看帮助文档

    readelf -h 
    man readelf
    

    参数选项:

    Usage: readelf <option(s)> elf-file(s)
     Display information about the contents of ELF format files
     Options are:
      -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I
      						 //all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I。
      -h --file-header       Display the ELF 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
      						 //显示节的详细信息(-S的)。
      -e --headers           Equivalent to: -h -l -S
      						 //显示全部头信息,等价于: -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)
      						 //显示note段(内核注释)的信息 。
      -r --relocs            Display the relocations (if present)
      						 //显示可重定位段的信息。
      -u --unwind            Display the unwind info (if present)
      						 //显示unwind段信息。当前只支持IA64 ELF的unwind段信息。
      -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).
      						 //显示CPU构架信息。
      -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
      -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]
                             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>
      -H --help              Display this information
      						 //显示readelf所支持的命令行选项。
      -v --version           Display the version number of readelf
      						 //显示readelf的版本信息。
    
    

    实例

    # 查看静态库定义的函数
    readelf -c xxx.a
    
    # 查看静态库定义的函数
    readelf -A xxx.so 
    

    bss,data,text,rodata,堆,栈,常量段

    https://blog.csdn.net/OUYANG_LINUX007/article/details/7448814

    参考

    ELF文件格式与readelf命令使用
    https://zhuanlan.zhihu.com/p/62039158

    readelf用法小记
    https://www.cnblogs.com/yinghao-liu/p/6399201.html

    readelf命令使用说明
    https://blog.csdn.net/yfldyxl/article/details/81566279

    ELF格式文件符号表全解析及readelf命令使用方法
    https://blog.csdn.net/edonlii/article/details/8779075

    ELF文件详解—初步认识
    https://blog.csdn.net/daide2012/article/details/73065204

    展开全文
  • readelf从ELF 格式的目标文件显示信息。 readelf和objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件) 2、ELF...

    1、介绍

    readelf从ELF 格式的目标文件显示信息。

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

    2、ELF格式的文件

    ELF(Executable and Linking Format)是一个定义了目标文件内部信息如何组成和组织的文件格式。内核会根据这些信息加载可执行文件,内核根据这些信息可以知道从文件哪里获取代码,从哪里获取初始化数据,在哪里应该加载共享库,等信息。

    2.1 ELF格式文件的分类

    ELF格式的文件可以分为三类:

    1)可重定位的对象文件(Relocatable file) 由汇编器汇编生成的 .o 文件
    2)可执行的对象文件(Executable file) 可执行应用程序
    3)可被共享的对象文件(Shared object file) 动态库文件,也即 .so 文件

    2.2 ELF格式文件的组成

    ELF文件由4部分组成

    1)ELF头(ELF header)

    2)程序头表(Program header table)

    3)节(Section)

    4)节头表(Section header table)

    实际上,一个文件中不一定包含全部内容,而且它们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。

    2.2.1 从汇编器和链接器的视角看

    1)开头的ELF Header描述了体系结构和操作系统等基本信息,并指出Section Header Table和Program Header Table在文件中的什么位置
    2)Program Header Table在汇编和链接过程中没有用到,所以是可有可无的
    3)Section Header Table中保存了所有Section的描述信息

    2.2.2 从程序执行的视角看

    1)开头是ELF Header,Program Header Table中保存了所有Segment的描述信息
    2)Section Header Table在加载过程中没有用到,所以是可有可无的

     2.2.3 从各种类型的ELF文件来看

    我们再回到那三类ELF文件来看:

    1)目标文件需要链接器做进一步处理,所以一定有Section Header Table。
    2)可执行文件需要加载运行,所以一定有Program Header Table。
    3)共享库既要加载运行,又要在加载时做动态链接,所以既有Section Header Table又有Program Header Table。

    3、readelf的选项说明

    了解了以上背景知识,我们就可以用readelf工具来查看具体的内容了。

    选项

    描述

    -a

    --all 显示全部信息,等价于 -h -l -S-s -r -d -V -A -I.

    -h

    --file-header 显示elf文件开始的文件头信息.

    -l

    --program-headers --segments 显示程序头(段头)信息(如果有的话)。

    -S

    --section-headers --sections 显示节头信息(如果有的话)。

    -g

    --section-groups 显示节组信息(如果有的话)。

    -t

    --section-details 显示节的详细信息(-S 的)。

    -s

    --syms --symbols 显示符号表段中的项(如果有的话)。

    -e

    --headers 显示全部头信息,等价于: -h -l -S

    -n

    --notes 显示note段(内核注释)的信息。

    -r

    --relocs 显示可重定位段的信息。

    -u

    --unwind 显示unwind段信息。当前只支持 IA64ELF 的 unwind 段信息。

    -d

    --dynamic 显示动态段的信息。

    -V

    --version-info 显示版本段的信息。

    -A

    --arch-specific 显示CPU构架信息。

    -D

    --use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段。

    -x <number or name>

    --hex-dump=<number or name> 以16进制方式显示指定段内内容。number 指定段表中段的索引,或字符串指定文件中的段名。

    -w[liaprmfFsoR]

    --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。

    -I

    --histogram 显示符号的时候,显示 bucketlist 长度的柱状图。

    -v

    --version 显示 readelf 的版本信息。

    -H

    --help 显示 readelf 所支持的命令行选项。

    -W

    --wide 宽行输出。

    @file

    可以将选项集中到一个文件中,然后使用这个 @file 选项载入。

    4、例子

    我们写一个最简单的helloword程序:

    #include <stdio.h>

    int main()
    {
            printf("aaa\n");
            return 0;
    }

    gcc main.c -o main

    我们就得到了可执行的目标文件main。

    4.1 查看ELF头

    $ 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:               0x400430
      Start of program headers:          64 (bytes into file)
      Start of section headers:          6616 (bytes into file)
      Flags:                             0x0
      Size of this header:               64 (bytes)
      Size of program headers:           56 (bytes)
      Number of program headers:         9
      Size of section headers:           64 (bytes)
      Number of section headers:         31
      Section header string table index: 28

    4.2 查看符号表

    $ readelf -s main

    Symbol table '.dynsym' contains 4 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
         1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@GLIBC_2.2.5 (2)
         2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)
         3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__

    Symbol table '.symtab' contains 67 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
         1: 0000000000400238     0 SECTION LOCAL  DEFAULT    1 
         2: 0000000000400254     0 SECTION LOCAL  DEFAULT    2 
         3: 0000000000400274     0 SECTION LOCAL  DEFAULT    3 
         4: 0000000000400298     0 SECTION LOCAL  DEFAULT    4 
         5: 00000000004002b8     0 SECTION LOCAL  DEFAULT    5 
         6: 0000000000400318     0 SECTION LOCAL  DEFAULT    6 
         7: 0000000000400356     0 SECTION LOCAL  DEFAULT    7 
         8: 0000000000400360     0 SECTION LOCAL  DEFAULT    8 
         9: 0000000000400380     0 SECTION LOCAL  DEFAULT    9 
        10: 0000000000400398     0 SECTION LOCAL  DEFAULT   10 
        11: 00000000004003c8     0 SECTION LOCAL  DEFAULT   11 
        12: 00000000004003f0     0 SECTION LOCAL  DEFAULT   12 
        13: 0000000000400420     0 SECTION LOCAL  DEFAULT   13 
        14: 0000000000400430     0 SECTION LOCAL  DEFAULT   14 
        15: 00000000004005b4     0 SECTION LOCAL  DEFAULT   15 
        16: 00000000004005c0     0 SECTION LOCAL  DEFAULT   16 
        17: 00000000004005c8     0 SECTION LOCAL  DEFAULT   17 
        18: 0000000000400600     0 SECTION LOCAL  DEFAULT   18 
        19: 0000000000600e10     0 SECTION LOCAL  DEFAULT   19 
        20: 0000000000600e18     0 SECTION LOCAL  DEFAULT   20 
        21: 0000000000600e20     0 SECTION LOCAL  DEFAULT   21 
        22: 0000000000600e28     0 SECTION LOCAL  DEFAULT   22 
        23: 0000000000600ff8     0 SECTION LOCAL  DEFAULT   23 
        24: 0000000000601000     0 SECTION LOCAL  DEFAULT   24 
        25: 0000000000601028     0 SECTION LOCAL  DEFAULT   25 
        26: 0000000000601038     0 SECTION LOCAL  DEFAULT   26 
        27: 0000000000000000     0 SECTION LOCAL  DEFAULT   27 
        28: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
        29: 0000000000600e20     0 OBJECT  LOCAL  DEFAULT   21 __JCR_LIST__
        30: 0000000000400460     0 FUNC    LOCAL  DEFAULT   14 deregister_tm_clones
        31: 00000000004004a0     0 FUNC    LOCAL  DEFAULT   14 register_tm_clones
        32: 00000000004004e0     0 FUNC    LOCAL  DEFAULT   14 __do_global_dtors_aux
        33: 0000000000601038     1 OBJECT  LOCAL  DEFAULT   26 completed.7594
        34: 0000000000600e18     0 OBJECT  LOCAL  DEFAULT   20 __do_global_dtors_aux_fin
        35: 0000000000400500     0 FUNC    LOCAL  DEFAULT   14 frame_dummy
        36: 0000000000600e10     0 OBJECT  LOCAL  DEFAULT   19 __frame_dummy_init_array_
        37: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS main.c
        38: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
        39: 00000000004006f0     0 OBJECT  LOCAL  DEFAULT   18 __FRAME_END__
        40: 0000000000600e20     0 OBJECT  LOCAL  DEFAULT   21 __JCR_END__
        41: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
        42: 0000000000600e18     0 NOTYPE  LOCAL  DEFAULT   19 __init_array_end
        43: 0000000000600e28     0 OBJECT  LOCAL  DEFAULT   22 _DYNAMIC
        44: 0000000000600e10     0 NOTYPE  LOCAL  DEFAULT   19 __init_array_start
        45: 00000000004005c8     0 NOTYPE  LOCAL  DEFAULT   17 __GNU_EH_FRAME_HDR
        46: 0000000000601000     0 OBJECT  LOCAL  DEFAULT   24 _GLOBAL_OFFSET_TABLE_
        47: 00000000004005b0     2 FUNC    GLOBAL DEFAULT   14 __libc_csu_fini
        48: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTab
        49: 0000000000601028     0 NOTYPE  WEAK   DEFAULT   25 data_start
        50: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@@GLIBC_2.2.5
        51: 0000000000601038     0 NOTYPE  GLOBAL DEFAULT   25 _edata
        52: 00000000004005b4     0 FUNC    GLOBAL DEFAULT   15 _fini
        53: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
        54: 0000000000601028     0 NOTYPE  GLOBAL DEFAULT   25 __data_start
        55: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
        56: 0000000000601030     0 OBJECT  GLOBAL HIDDEN    25 __dso_handle
        57: 00000000004005c0     4 OBJECT  GLOBAL DEFAULT   16 _IO_stdin_used
        58: 0000000000400540   101 FUNC    GLOBAL DEFAULT   14 __libc_csu_init
        59: 0000000000601040     0 NOTYPE  GLOBAL DEFAULT   26 _end
        60: 0000000000400430    42 FUNC    GLOBAL DEFAULT   14 _start
        61: 0000000000601038     0 NOTYPE  GLOBAL DEFAULT   26 __bss_start
        62: 0000000000400526    21 FUNC    GLOBAL DEFAULT   14 main
        63: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
        64: 0000000000601038     0 OBJECT  GLOBAL HIDDEN    25 __TMC_END__
        65: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
        66: 00000000004003c8     0 FUNC    GLOBAL DEFAULT   11 _init

    4.3 查看依赖的库

    $ readelf -d main

    Dynamic section at offset 0xe28 contains 24 entries:
      Tag        Type                         Name/Value
     0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
     0x000000000000000c (INIT)               0x4003c8
     0x000000000000000d (FINI)               0x4005b4
     0x0000000000000019 (INIT_ARRAY)         0x600e10
     0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
     0x000000000000001a (FINI_ARRAY)         0x600e18
     0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
     0x000000006ffffef5 (GNU_HASH)           0x400298
     0x0000000000000005 (STRTAB)             0x400318
     0x0000000000000006 (SYMTAB)             0x4002b8
     0x000000000000000a (STRSZ)              61 (bytes)
     0x000000000000000b (SYMENT)             24 (bytes)
     0x0000000000000015 (DEBUG)              0x0
     0x0000000000000003 (PLTGOT)             0x601000
     0x0000000000000002 (PLTRELSZ)           48 (bytes)
     0x0000000000000014 (PLTREL)             RELA
     0x0000000000000017 (JMPREL)             0x400398
     0x0000000000000007 (RELA)               0x400380
     0x0000000000000008 (RELASZ)             24 (bytes)
     0x0000000000000009 (RELAENT)            24 (bytes)
     0x000000006ffffffe (VERNEED)            0x400360
     0x000000006fffffff (VERNEEDNUM)         1
     0x000000006ffffff0 (VERSYM)             0x400356
     0x0000000000000000 (NULL)               0x0 

    4.4 显示section headers

    $ readelf -S main
    There are 31 section headers, starting at offset 0x19d8:

    Section Headers:
      [Nr] Name              Type             Address           Offset
           Size              EntSize          Flags  Link  Info  Align
      [ 0]                   NULL             0000000000000000  00000000
           0000000000000000  0000000000000000           0     0     0
      [ 1] .interp           PROGBITS         0000000000400238  00000238
           000000000000001c  0000000000000000   A       0     0     1
      [ 2] .note.ABI-tag     NOTE             0000000000400254  00000254
           0000000000000020  0000000000000000   A       0     0     4
      [ 3] .note.gnu.build-i NOTE             0000000000400274  00000274
           0000000000000024  0000000000000000   A       0     0     4
      [ 4] .gnu.hash         GNU_HASH         0000000000400298  00000298
           000000000000001c  0000000000000000   A       5     0     8
      [ 5] .dynsym           DYNSYM           00000000004002b8  000002b8
           0000000000000060  0000000000000018   A       6     1     8
      [ 6] .dynstr           STRTAB           0000000000400318  00000318
           000000000000003d  0000000000000000   A       0     0     1
      [ 7] .gnu.version      VERSYM           0000000000400356  00000356
           0000000000000008  0000000000000002   A       5     0     2
      [ 8] .gnu.version_r    VERNEED          0000000000400360  00000360
           0000000000000020  0000000000000000   A       6     1     8
      [ 9] .rela.dyn         RELA             0000000000400380  00000380
           0000000000000018  0000000000000018   A       5     0     8
      [10] .rela.plt         RELA             0000000000400398  00000398
           0000000000000030  0000000000000018  AI       5    24     8
      [11] .init             PROGBITS         00000000004003c8  000003c8
           000000000000001a  0000000000000000  AX       0     0     4
      [12] .plt              PROGBITS         00000000004003f0  000003f0
           0000000000000030  0000000000000010  AX       0     0     16
      [13] .plt.got          PROGBITS         0000000000400420  00000420
           0000000000000008  0000000000000000  AX       0     0     8
      [14] .text             PROGBITS         0000000000400430  00000430
           0000000000000182  0000000000000000  AX       0     0     16
      [15] .fini             PROGBITS         00000000004005b4  000005b4
           0000000000000009  0000000000000000  AX       0     0     4
      [16] .rodata           PROGBITS         00000000004005c0  000005c0
           0000000000000008  0000000000000000   A       0     0     4
      [17] .eh_frame_hdr     PROGBITS         00000000004005c8  000005c8
           0000000000000034  0000000000000000   A       0     0     4
      [18] .eh_frame         PROGBITS         0000000000400600  00000600
           00000000000000f4  0000000000000000   A       0     0     8
      [19] .init_array       INIT_ARRAY       0000000000600e10  00000e10
           0000000000000008  0000000000000000  WA       0     0     8
      [20] .fini_array       FINI_ARRAY       0000000000600e18  00000e18
           0000000000000008  0000000000000000  WA       0     0     8
      [21] .jcr              PROGBITS         0000000000600e20  00000e20
           0000000000000008  0000000000000000  WA       0     0     8
      [22] .dynamic          DYNAMIC          0000000000600e28  00000e28
           00000000000001d0  0000000000000010  WA       6     0     8
      [23] .got              PROGBITS         0000000000600ff8  00000ff8
           0000000000000008  0000000000000008  WA       0     0     8
      [24] .got.plt          PROGBITS         0000000000601000  00001000
           0000000000000028  0000000000000008  WA       0     0     8
      [25] .data             PROGBITS         0000000000601028  00001028
           0000000000000010  0000000000000000  WA       0     0     8
      [26] .bss              NOBITS           0000000000601038  00001038
           0000000000000008  0000000000000000  WA       0     0     1
      [27] .comment          PROGBITS         0000000000000000  00001038
           0000000000000035  0000000000000001  MS       0     0     1
      [28] .shstrtab         STRTAB           0000000000000000  000018cb
           000000000000010c  0000000000000000           0     0     1
      [29] .symtab           SYMTAB           0000000000000000  00001070
           0000000000000648  0000000000000018          30    47     8
      [30] .strtab           STRTAB           0000000000000000  000016b8
           0000000000000213  0000000000000000           0     0     1
    Key to Flags:
      W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
      I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
      O (extra OS processing required) o (OS specific), p (processor specific)

    4.5 显示program headers

    $ readelf -l main

    Elf file type is EXEC (Executable file)
    Entry point 0x400430
    There are 9 program headers, starting at offset 64

    Program Headers:
      Type           Offset             VirtAddr           PhysAddr
                     FileSiz            MemSiz              Flags  Align
      PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                     0x00000000000001f8 0x00000000000001f8  R E    8
      INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
                     0x000000000000001c 0x000000000000001c  R      1
          [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
      LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                     0x00000000000006f4 0x00000000000006f4  R E    200000
      LOAD           0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
                     0x0000000000000228 0x0000000000000230  RW     200000
      DYNAMIC        0x0000000000000e28 0x0000000000600e28 0x0000000000600e28
                     0x00000000000001d0 0x00000000000001d0  RW     8
      NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254
                     0x0000000000000044 0x0000000000000044  R      4
      GNU_EH_FRAME   0x00000000000005c8 0x00000000004005c8 0x00000000004005c8
                     0x0000000000000034 0x0000000000000034  R      4
      GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                     0x0000000000000000 0x0000000000000000  RW     10
      GNU_RELRO      0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
                     0x00000000000001f0 0x00000000000001f0  R      1

     Section to Segment mapping:
      Segment Sections...
       00     
       01     .interp 
       02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 
       03     .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 
       04     .dynamic 
       05     .note.ABI-tag .note.gnu.build-id 
       06     .eh_frame_hdr 
       07     
       08     .init_array .fini_array .jcr .dynamic .got 
     

    5、参考

    https://www.cnblogs.com/kele-dad/p/9471328.html

    https://blog.csdn.net/daide2012/article/details/73065204

    展开全文
  • readelf 和 objdump 例子详解及区别

    千次阅读 2020-06-22 16:53:49
    readelf 命令+代码例子详解1.1 readelf -s simple.o //--symbols 显示符号表段中的项1.2 readelf -h simple.o //显示elf文件开始的文件头信息.1.3 readelf -S simple.o //显示节头信息1.4 readelf -a simple.o //...

    这里以 simple.c 的目标文件为例子说明

    #include<stdio.h>
    
    int g_init_var = 100;
    int g_uinit_var;
    
    void func1(int i)
    {
    	printf("%d\n",i);
    }
    
    int main()
    {
    	static int iStaticVar = 101;
    	static int iStaticVar2;
    	
    	int a = 1;
    	int b;
    	func1(iStaticVar + iStaticVar2 + a + b);
    	return 0;
    }
    

    1. readelf - 查看elf文件的信息

    readelf - Displays information about ELF files.
    readelf 只能看elf文件的信息
    选项-h(elfheader),显示elf文件开始的文件头信息。后面文章会补上具体说明。
    选项-l(programheaders),segments显示程序头(段头)信息(如果有数据的话)。后面文章会补上具体说明。
    选项-S(sectionheaders),sections显示节头信息(如果有数据的话)。后面文章会补上具体说明。

    参数大全
    选项-g(sectiongroups),显示节组信息(如果有数据的话)。
    选项-t,section-details显示节的详细信息(-S的)。
    选项-s,symbols显示符号表段中的项(如果有数据的话)。
    选项-e,headers显示全部头信息,等价于:-h-l-S。
    选项-n,notes显示note段(内核注释)的信息。
    选项-r,relocs显示可重定位段的信息。
    选项-u,unwind显示unwind段信息。当前只支持IA64ELF的unwind段信息。
    选项-d,dynamic显示动态段的信息。
    选项-V,version-info显示版本段的信息。
    选项-A,arch-specific显示CPU构架信息。
    选项-I,histogram显示符号的时候,显示bucketlist长度的柱状图。
    选项-x,hex-dump=以16进制方式显示指定段内内容。number指定段表中段的索引,或字符串指定文件中的段名
    选项-D,use-dynamic使用动态段中的符号表显示符号,而不是使用符号段。
    选项-a,all显示全部信息,等价于-h-l-S-s-r-d-V-A-I。
    选项-v,version显示readelf的版本信息。
    选项-H,help显示readelf所支持的命令行选项。

    原文链接:https://blog.csdn.net/qq_43414142/article/details/90316965

    1. readelf 命令+代码例子详解

    1.1 readelf -s simple.o //–symbols 显示符号表段中的项

    –syms --symbols
    显示符号表段中的项

    root@ubuntu-admin-a1:/home# readelf -s simple.o
    
    Symbol table '.symtab' contains 16 entries:
    Num:    Value          Size Type    Bind   Vis      Ndx Name
    	0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
    	1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS simple.c
    	2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
    	3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 
    	4: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 
    	5: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 
    	6: 0000000000000004     4 OBJECT  LOCAL  DEFAULT    3 iStaticVar.2290
    	7: 0000000000000000     4 OBJECT  LOCAL  DEFAULT    4 iStaticVar2.2291
    	8: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 
    	9: 0000000000000000     0 SECTION LOCAL  DEFAULT    8 
    	10: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 
    	11: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 g_init_var
    	12: 0000000000000004     4 OBJECT  GLOBAL DEFAULT  COM g_uinit_var
    	13: 0000000000000000    34 FUNC    GLOBAL DEFAULT    1 func1
    	14: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND printf
    	15: 0000000000000022    53 FUNC    GLOBAL DEFAULT    1 main
    root@ubuntu-admin-a1:/home#
    

    1.2 readelf -h simple.o //显示elf文件开始的文件头信息.

    -h :–file-header
    显示elf文件开始的文件头信息.

    root@ubuntu-admin-a1:/home# readelf -h simple.o
    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:                              REL (Relocatable file)
    Machine:                           Advanced Micro Devices X86-64
    Version:                           0x1
    Entry point address:               0x0
    Start of program headers:          0 (bytes into file)
    Start of section headers:          1056 (bytes into file)
    Flags:                             0x0
    Size of this header:               64 (bytes)
    Size of program headers:           0 (bytes)
    Number of program headers:         0
    Size of section headers:           64 (bytes)
    Number of section headers:         13
    Section header string table index: 10
    root@ubuntu-admin-a1:/home# 
    

    1.3 readelf -S simple.o //显示节头信息

    –section-headers ;–sections 显示节头信息(如果有的话)。

    root@ubuntu-admin-a1:/home# readelf -S simple.o
    There are 13 section headers, starting at offset 0x420:
    
    Section Headers:
    [Nr] Name              Type             Address           Offset
    	Size              EntSize          Flags  Link  Info  Align
    [ 0]                   NULL             0000000000000000  00000000
    	0000000000000000  0000000000000000           0     0     0
    [ 1] .text             PROGBITS         0000000000000000  00000040
    	0000000000000057  0000000000000000  AX       0     0     1
    [ 2] .rela.text        RELA             0000000000000000  00000310
    	0000000000000078  0000000000000018   I      11     1     8
    [ 3] .data             PROGBITS         0000000000000000  00000098
    	0000000000000008  0000000000000000  WA       0     0     4
    [ 4] .bss              NOBITS           0000000000000000  000000a0
    	0000000000000004  0000000000000000  WA       0     0     4
    [ 5] .rodata           PROGBITS         0000000000000000  000000a0
    	0000000000000004  0000000000000000   A       0     0     1
    [ 6] .comment          PROGBITS         0000000000000000  000000a4
    	0000000000000035  0000000000000001  MS       0     0     1
    [ 7] .note.GNU-stack   PROGBITS         0000000000000000  000000d9
    	0000000000000000  0000000000000000           0     0     1
    [ 8] .eh_frame         PROGBITS         0000000000000000  000000e0
    	0000000000000058  0000000000000000   A       0     0     8
    [ 9] .rela.eh_frame    RELA             0000000000000000  00000388
    	0000000000000030  0000000000000018   I      11     8     8
    [10] .shstrtab         STRTAB           0000000000000000  000003b8
    	0000000000000061  0000000000000000           0     0     1
    [11] .symtab           SYMTAB           0000000000000000  00000138
    	0000000000000180  0000000000000018          12    11     8
    [12] .strtab           STRTAB           0000000000000000  000002b8
    	0000000000000054  0000000000000000           0     0     1
    Key to Flags:
    W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
    I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
    O (extra OS processing required) o (OS specific), p (processor specific)
    root@ubuntu-admin-a1:/home# 
    

    1.4 readelf -a simple.o //elf显示全部信息

    -a :–all
    显示全部信息,等价于 -h -l -S -s -r -d -V -A -I

    root@ubuntu-admin-a1:/home# readelf -a simple.o
    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:                              REL (Relocatable file)
    Machine:                           Advanced Micro Devices X86-64
    Version:                           0x1
    Entry point address:               0x0
    Start of program headers:          0 (bytes into file)
    Start of section headers:          1056 (bytes into file)
    Flags:                             0x0
    Size of this header:               64 (bytes)
    Size of program headers:           0 (bytes)
    Number of program headers:         0
    Size of section headers:           64 (bytes)
    Number of section headers:         13
    Section header string table index: 10
    
    Section Headers:
    [Nr] Name              Type             Address           Offset
    	Size              EntSize          Flags  Link  Info  Align
    [ 0]                   NULL             0000000000000000  00000000
    	0000000000000000  0000000000000000           0     0     0
    [ 1] .text             PROGBITS         0000000000000000  00000040
    	0000000000000057  0000000000000000  AX       0     0     1
    [ 2] .rela.text        RELA             0000000000000000  00000310
    	0000000000000078  0000000000000018   I      11     1     8
    [ 3] .data             PROGBITS         0000000000000000  00000098
    	0000000000000008  0000000000000000  WA       0     0     4
    [ 4] .bss              NOBITS           0000000000000000  000000a0
    	0000000000000004  0000000000000000  WA       0     0     4
    [ 5] .rodata           PROGBITS         0000000000000000  000000a0
    	0000000000000004  0000000000000000   A       0     0     1
    [ 6] .comment          PROGBITS         0000000000000000  000000a4
    	0000000000000035  0000000000000001  MS       0     0     1
    [ 7] .note.GNU-stack   PROGBITS         0000000000000000  000000d9
    	0000000000000000  0000000000000000           0     0     1
    [ 8] .eh_frame         PROGBITS         0000000000000000  000000e0
    	0000000000000058  0000000000000000   A       0     0     8
    [ 9] .rela.eh_frame    RELA             0000000000000000  00000388
    	0000000000000030  0000000000000018   I      11     8     8
    [10] .shstrtab         STRTAB           0000000000000000  000003b8
    	0000000000000061  0000000000000000           0     0     1
    [11] .symtab           SYMTAB           0000000000000000  00000138
    	0000000000000180  0000000000000018          12    11     8
    [12] .strtab           STRTAB           0000000000000000  000002b8
    	0000000000000054  0000000000000000           0     0     1
    Key to Flags:
    W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
    I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
    O (extra OS processing required) o (OS specific), p (processor specific)
    
    There are no section groups in this file.
    
    There are no program headers in this file.
    
    Relocation section '.rela.text' at offset 0x310 contains 5 entries:
    Offset          Info           Type           Sym. Value    Sym. Name + Addend
    000000000011  00050000000a R_X86_64_32       0000000000000000 .rodata + 0
    00000000001b  000e00000002 R_X86_64_PC32     0000000000000000 printf - 4
    000000000033  000300000002 R_X86_64_PC32     0000000000000000 .data + 0
    000000000039  000400000002 R_X86_64_PC32     0000000000000000 .bss - 4
    00000000004c  000d00000002 R_X86_64_PC32     0000000000000000 func1 - 4
    
    Relocation section '.rela.eh_frame' at offset 0x388 contains 2 entries:
    Offset          Info           Type           Sym. Value    Sym. Name + Addend
    000000000020  000200000002 R_X86_64_PC32     0000000000000000 .text + 0
    000000000040  000200000002 R_X86_64_PC32     0000000000000000 .text + 22
    
    The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported.
    
    Symbol table '.symtab' contains 16 entries:
    Num:    Value          Size Type    Bind   Vis      Ndx Name
    	0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
    	1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS simple.c
    	2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
    	3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 
    	4: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 
    	5: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 
    	6: 0000000000000004     4 OBJECT  LOCAL  DEFAULT    3 iStaticVar.2290
    	7: 0000000000000000     4 OBJECT  LOCAL  DEFAULT    4 iStaticVar2.2291
    	8: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 
    	9: 0000000000000000     0 SECTION LOCAL  DEFAULT    8 
    	10: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 
    	11: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 g_init_var
    	12: 0000000000000004     4 OBJECT  GLOBAL DEFAULT  COM g_uinit_var
    	13: 0000000000000000    34 FUNC    GLOBAL DEFAULT    1 func1
    	14: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND printf
    	15: 0000000000000022    53 FUNC    GLOBAL DEFAULT    1 main
    
    No version information found in this file.
    root@ubuntu-admin-a1:/home#
    

    1.5 readelf -l simple //查看显示程序头表信息

    显示程序头表信息,包扩有几个段,每个段的属性,以及每个段中包含有哪几个节(Section)

    	root@ubuntu-admin-a1:/home# readelf -l simple
    Elf file type is EXEC (Executable file)
    Entry point 0x400430
    There are 9 program headers, starting at offset 64
    
    Program Headers:
    Type           Offset             VirtAddr           PhysAddr
    				FileSiz            MemSiz              Flags  Align
    PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
    				0x00000000000001f8 0x00000000000001f8  R E    8
    INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
    				0x000000000000001c 0x000000000000001c  R      1
    	[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
    LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
    				0x000000000000075c 0x000000000000075c  R E    200000
    LOAD           0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
    				0x0000000000000230 0x0000000000000240  RW     200000
    DYNAMIC        0x0000000000000e28 0x0000000000600e28 0x0000000000600e28
    				0x00000000000001d0 0x00000000000001d0  RW     8
    NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254
    				0x0000000000000044 0x0000000000000044  R      4
    GNU_EH_FRAME   0x0000000000000608 0x0000000000400608 0x0000000000400608
    				0x000000000000003c 0x000000000000003c  R      4
    GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
    				0x0000000000000000 0x0000000000000000  RW     10
    GNU_RELRO      0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
    				0x00000000000001f0 0x00000000000001f0  R      1
    
    Section to Segment mapping:
    Segment Sections...
    00     
    01     .interp 
    02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 
    03     .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 
    04     .dynamic 
    05     .note.ABI-tag .note.gnu.build-id 
    06     .eh_frame_hdr 
    07     
    08     .init_array .fini_array .jcr .dynamic .got 
    root@ubuntu-admin-a1:/home# 
    

    2. objdump - 查看目标文件的信息

    objdump - display information from object files.
    objdump 可以看目标文件的信息

    2. objdump 命令+代码例子详解

    2.1 objdump -h simple.o //显示目标文件各个section的头部摘要信息

    –section-headers --headers
    显示目标文件各个section的头部摘要信息

    root@ubuntu-admin-a1:/home# objdump -h simple.o
    simple.o:     file format elf64-x86-64
    Sections:
    Idx Name          Size      VMA               LMA               File off  Algn
    0 .text         00000057  0000000000000000  0000000000000000  00000040  2**0
    				CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
    1 .data         00000008  0000000000000000  0000000000000000  00000098  2**2
    				CONTENTS, ALLOC, LOAD, DATA
    2 .bss          00000004  0000000000000000  0000000000000000  000000a0  2**2
    				ALLOC
    3 .rodata       00000004  0000000000000000  0000000000000000  000000a0  2**0
    				CONTENTS, ALLOC, LOAD, READONLY, DATA
    4 .comment      00000035  0000000000000000  0000000000000000  000000a4  2**0
    				CONTENTS, READONLY
    5 .note.GNU-stack 00000000  0000000000000000  0000000000000000  000000d9  2**0
    				CONTENTS, READONLY
    6 .eh_frame     00000058  0000000000000000  0000000000000000  000000e0  2**3
    				CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
    root@ubuntu-admin-a1:/home# 
    

    2.2 objdump -t simple.o //显示文件的符号表入口。

    -t --syms
    显示文件的符号表入口

    root@ubuntu-admin-a1:/home# objdump -t simple.o
    simple.o:     file format elf64-x86-64
    SYMBOL TABLE:
    0000000000000000 l    df *ABS*	0000000000000000 simple.c
    0000000000000000 l    d  .text	0000000000000000 .text
    0000000000000000 l    d  .data	0000000000000000 .data
    0000000000000000 l    d  .bss	0000000000000000 .bss
    0000000000000000 l    d  .rodata	0000000000000000 .rodata
    0000000000000004 l     O .data	0000000000000004 iStaticVar.2290
    0000000000000000 l     O .bss	0000000000000004 iStaticVar2.2291
    0000000000000000 l    d  .note.GNU-stack	0000000000000000 .note.GNU-stack
    0000000000000000 l    d  .eh_frame	0000000000000000 .eh_frame
    0000000000000000 l    d  .comment	0000000000000000 .comment
    0000000000000000 g     O .data	0000000000000004 g_init_var
    0000000000000004       O *COM*	0000000000000004 g_uinit_var
    0000000000000000 g     F .text	0000000000000022 func1
    0000000000000000         *UND*	0000000000000000 printf
    0000000000000022 g     F .text	0000000000000035 main
    root@ubuntu-admin-a1:/home# 
    

    2.2.1 objdump -t libc.a grep -w printf //查找 printf 在 libc.a 库的哪个目标文件

    objdump -t libc.a grep -w printf //查找 printf 在 libc.a 库的哪个目标文件
    libc.a 库里面包含了 1400多个目标文件。
    
    	root@ubuntu-admin-a1:/home/4Chapter# objdump -t /usr/lib/x86_64-linux-gnu/libc.a | grep -w printf
    	……
    	printf.o:     file format elf64-x86-64
    	0000000000000000 g     F .text	000000000000009e printf
    	……
    	root@ubuntu-admin-a1:/home/4Chapter# 
    

    2.3 objdump -d simple.o //-d 参数看代码段反汇编结果

    -d --disassemble
    从objfile中反汇编那些特定指令机器码的section。

    root@ubuntu-admin-a1:/home# objdump -d simple.o
    simple.o:     file format elf64-x86-64
    Disassembly of section .text:
    0000000000000000 <func1>:
    0:	55                   	push   %rbp
    1:	48 89 e5             	mov    %rsp,%rbp
    4:	48 83 ec 10          	sub    $0x10,%rsp
    8:	89 7d fc             	mov    %edi,-0x4(%rbp)
    b:	8b 45 fc             	mov    -0x4(%rbp),%eax
    e:	89 c6                	mov    %eax,%esi
    10:	bf 00 00 00 00       	mov    $0x0,%edi
    15:	b8 00 00 00 00       	mov    $0x0,%eax
    1a:	e8 00 00 00 00       	callq  1f <func1+0x1f>
    1f:	90                   	nop
    20:	c9                   	leaveq 
    21:	c3                   	retq   
    0000000000000022 <main>:
    22:	55                   	push   %rbp
    23:	48 89 e5             	mov    %rsp,%rbp
    26:	48 83 ec 10          	sub    $0x10,%rsp
    2a:	c7 45 f8 01 00 00 00 	movl   $0x1,-0x8(%rbp)
    31:	8b 15 00 00 00 00    	mov    0x0(%rip),%edx        # 37 <main+0x15>
    37:	8b 05 00 00 00 00    	mov    0x0(%rip),%eax        # 3d <main+0x1b>
    3d:	01 c2                	add    %eax,%edx
    3f:	8b 45 f8             	mov    -0x8(%rbp),%eax
    42:	01 c2                	add    %eax,%edx
    44:	8b 45 fc             	mov    -0x4(%rbp),%eax
    47:	01 d0                	add    %edx,%eax
    49:	89 c7                	mov    %eax,%edi
    4b:	e8 00 00 00 00       	callq  50 <main+0x2e>
    50:	b8 00 00 00 00       	mov    $0x0,%eax
    55:	c9                   	leaveq 
    56:	c3                   	retq   
    root@ubuntu-admin-a1:/home# 
    

    2.4 objdump -r simple.o //查看重定位表

    -r --reloc
    显示文件的重定位入口

    root@ubuntu-admin-a1:/home# objdump -r simple.o
    simple.o:     file format elf64-x86-64
    RELOCATION RECORDS FOR [.text]:
    OFFSET           TYPE              VALUE 
    0000000000000011 R_X86_64_32       .rodata
    000000000000001b R_X86_64_PC32     printf-0x0000000000000004
    0000000000000033 R_X86_64_PC32     .data
    0000000000000039 R_X86_64_PC32     .bss-0x0000000000000004
    000000000000004c R_X86_64_PC32     func1-0x0000000000000004
    RELOCATION RECORDS FOR [.eh_frame]:
    OFFSET           TYPE              VALUE 
    0000000000000020 R_X86_64_PC32     .text
    0000000000000040 R_X86_64_PC32     .text+0x0000000000000022
    root@ubuntu-admin-a1:/home# 
    

    2.5 objdump -f simple.o //显示objfile中每个文件的整体头部摘要信息

    –file-headers
    显示objfile中每个文件的整体头部摘要信息。

    root@ubuntu-admin-a1:/home# objdump -f simple.o
    
    simple.o:     file format elf64-x86-64
    architecture: i386:x86-64, flags 0x00000011:
    HAS_RELOC, HAS_SYMS
    start address 0x0000000000000000
    
    root@ubuntu-admin-a1:/home#
    

    2.6 objdump -s simple.o //显示指定section的完整内容

    -s --full-contents
    显示指定section的完整内容。默认所有的非空section都会被显示。

    root@ubuntu-admin-a1:/home# objdump -s simple.o
    simple.o:     file format elf64-x86-64
    Contents of section .text:
    0000 554889e5 4883ec10 897dfc8b 45fc89c6  UH..H....}..E...
    0010 bf000000 00b80000 0000e800 00000090  ................
    0020 c9c35548 89e54883 ec10c745 f8010000  ..UH..H....E....
    0030 008b1500 0000008b 05000000 0001c28b  ................
    0040 45f801c2 8b45fc01 d089c7e8 00000000  E....E..........
    0050 b8000000 00c9c3                      .......         
    Contents of section .data:
    0000 64000000 65000000                    d...e...        
    Contents of section .rodata:
    0000 25640a00                             %d..            
    Contents of section .comment:
    0000 00474343 3a202855 62756e74 7520352e  .GCC: (Ubuntu 5.
    0010 342e302d 36756275 6e747531 7e31362e  4.0-6ubuntu1~16.
    0020 30342e34 2920352e 342e3020 32303136  04.4) 5.4.0 2016
    0030 30363039 00                          0609.           
    Contents of section .eh_frame:
    0000 14000000 00000000 017a5200 01781001  .........zR..x..
    0010 1b0c0708 90010000 1c000000 1c000000  ................
    0020 00000000 22000000 00410e10 8602430d  ...."....A....C.
    0030 065d0c07 08000000 1c000000 3c000000  .]..........<...
    0040 00000000 35000000 00410e10 8602430d  ....5....A....C.
    0050 06700c07 08000000                    .p......        
    root@ubuntu-admin-a1:/home# 
    

    2.7 objdump -x simple.o //显示所可用的头信息

    -x --all-headers
    显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。

    root@ubuntu-admin-a1:/home# objdump -x simple.o
    simple.o:     file format elf64-x86-64
    simple.o
    architecture: i386:x86-64, flags 0x00000011:
    HAS_RELOC, HAS_SYMS
    start address 0x0000000000000000
    Sections:
    Idx Name          Size      VMA               LMA               File off  Algn
    0 .text         00000057  0000000000000000  0000000000000000  00000040  2**0
    				CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
    1 .data         00000008  0000000000000000  0000000000000000  00000098  2**2
    				CONTENTS, ALLOC, LOAD, DATA
    2 .bss          00000004  0000000000000000  0000000000000000  000000a0  2**2
    				ALLOC
    3 .rodata       00000004  0000000000000000  0000000000000000  000000a0  2**0
    				CONTENTS, ALLOC, LOAD, READONLY, DATA
    4 .comment      00000035  0000000000000000  0000000000000000  000000a4  2**0
    				CONTENTS, READONLY
    5 .note.GNU-stack 00000000  0000000000000000  0000000000000000  000000d9  2**0
    				CONTENTS, READONLY
    6 .eh_frame     00000058  0000000000000000  0000000000000000  000000e0  2**3
    				CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
    SYMBOL TABLE:
    0000000000000000 l    df *ABS*	0000000000000000 simple.c
    0000000000000000 l    d  .text	0000000000000000 .text
    0000000000000000 l    d  .data	0000000000000000 .data
    0000000000000000 l    d  .bss	0000000000000000 .bss
    0000000000000000 l    d  .rodata	0000000000000000 .rodata
    0000000000000004 l     O .data	0000000000000004 iStaticVar.2290
    0000000000000000 l     O .bss	0000000000000004 iStaticVar2.2291
    0000000000000000 l    d  .note.GNU-stack	0000000000000000 .note.GNU-stack
    0000000000000000 l    d  .eh_frame	0000000000000000 .eh_frame
    0000000000000000 l    d  .comment	0000000000000000 .comment
    0000000000000000 g     O .data	0000000000000004 g_init_var
    0000000000000004       O *COM*	0000000000000004 g_uinit_var
    0000000000000000 g     F .text	0000000000000022 func1
    0000000000000000         *UND*	0000000000000000 printf
    0000000000000022 g     F .text	0000000000000035 main
    
    RELOCATION RECORDS FOR [.text]:
    OFFSET           TYPE              VALUE 
    0000000000000011 R_X86_64_32       .rodata
    000000000000001b R_X86_64_PC32     printf-0x0000000000000004
    0000000000000033 R_X86_64_PC32     .data
    0000000000000039 R_X86_64_PC32     .bss-0x0000000000000004
    000000000000004c R_X86_64_PC32     func1-0x0000000000000004
    
    RELOCATION RECORDS FOR [.eh_frame]:
    OFFSET           TYPE              VALUE 
    0000000000000020 R_X86_64_PC32     .text
    0000000000000040 R_X86_64_PC32     .text+0x0000000000000022
    root@ubuntu-admin-a1:/home# 
    

    2.8 objdump -a simple.o //显示档案库的成员信息

    -a --archive-headers
    显示档案库的成员信息,类似ls -l将lib*.a的信息列出。

    root@ubuntu-admin-a1:/home# objdump -a simple.o
    simple.o:     file format elf64-x86-64
    simple.o
    root@ubuntu-admin-a1:/home# 
    

    3. readelf 和 objdump 的区别

    3.1 概念的区别

    readelf 显示elf文件的信息
    objdump 显示目标文件的信息

    3.2 readelf 并不提供反汇编功能

    objdump 提供反汇编功能

    3.3 readelf 可以显示调试信息

    objdump 则不能显示调试信息
    但是实际上bfd库支持DWARF的处理,通过简单处理objdump也可以显示调试信息

    3.4 objdump 使用了bfd库进行文件读取

    BFD库(Binary File Descriptor Library),它是一个GNU项目
    它的目标就是希望通过一种统一的接口来处理不同的目标文件格式。

    而readelf则没有,另外写的一套代码,且对一些条件的判断并不是很严格

    参考

    https://blog.csdn.net/qq_43414142/article/details/90316965

    展开全文
  • readelf命令解析及演示

    2020-12-30 15:09:38
    readelf命令可显示一个或多个ELF格式对象文件的信息。后面可加一些选项控制要显示的特定信息。 elffile …是要检查的目标文件。支持32位和64位ELF文件,也支持包含ELF文件的文档(如使用ar命令将一些elf文件打包生成...
  • From:http://blog.csdn.net/yasi_xi/article/details/45197583 readelf命令:http://man.linuxde.net/readelf ELF文件格式解析:https://www.2cto.com/kf/201605/511370.html ELF文件格式解析:http://blog....
  • readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指...
  • ​ 本文是对程序员的自我修养:链接、装载与库中第3章的学习与实践总结,通过使用工具readelf、objdump对目标文件进行解析,学习目标文件的结构。
  • readelf android版

    2015-03-26 23:39:10
    readelf: ELF 32 bit LSB shared object ARM version 1 SYSV dynamically linked uses shared libs stripped
  • https://github.com/JiaZhengJingXianSheng/ReadELF ELF 目标文件格式的最前部是 ELF文件头 (ELF Header) ,它包含了描述整个文件的基本属性,比如 ELF 文件版本、目标机器型号、程序入口地址等。紧接是 ELF 文件各个...
  • readelf命令用来查看ELF文件,Linux系统中的目标文件,可执行文件,以及.s0动态链接库,都是ELF文件格式。-S(大写)汇总显示ELF文件的所有section header的信息$ readelf -S hh1.oThere are 12 section headers, ...
  • 查看.o文件是否编入了调试信息(编译的时候是否加了-g):: $readelf -S Shpos.o | grep debug 完整输出 readelf输出的完整内容: $readelf -all a.out ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00...
  • ELF readelf objdump
  • readelf的使用

    2021-09-26 14:25:37
    记录下有接触到的使用。 这个命令可以用来查询可执行文件依赖什么动态库,查看静态库中包含了什么.o文件。 1、查询可执行文件依赖什么动态库 2、静态库中包含了什么.o文件
  • 交叉编译工具集介绍 3.1 gcc命令 3.1.1 常用编译命令选项 3.1.2 多源文件的编译方法 3.1.3 库文件连接 3.2 readelf命令 3.3 objdump命令 3.4 size命令 3.5 nm命令 3.6 addr2line命令 3.7 stings命令 3.8 strip命令 4...
  • 1.简介 readelf用于显示ELF(Executable and Linkable Format)格式文件的信息,包括
  • readelf命令

    2018-09-18 15:50:18
    readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般...
  • 参考Linux系统中readelf的功能输出,编写一个程序实现和其一样的功能,以实现对elf文件的头、程序头、节区头等内容的读取显示,相当于是一个对readelf的复现,但是功能上并不是很完备,这里只实现了读取elf头、程序...
  • readelf概述 readelf命令使用说明 readelf概述 readelf是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用。常见的文件如在Linux上的可执行文件,动态库(*.so)或者静态库(*.a) 等包含ELF格式...
  • Linux readelf命令使用

    2021-06-04 12:23:24
    readelf用来显示ELF格式目标文件的信息.可通过参数选项来控制显示哪些特定信息。(注意: readelf不支持显示archive文档, 也不支持64位的ELF文件)。使用方法1:查看共享库的依赖库(NEEDED)和搜索名(SONAME)。readelf -...
  • 1.功能简介readelf 用于读取 ELF(Executable and Linkable Format)格式文件的详细信息,包括目标文件、可执行文件、共享目标文件与核心转储文件。1.1 ELF 文件分类(1)可重定位文件(Relocatable File),这类文件包含...
  • 主要介绍readelf 和file指令
  • readelf命令使用

    2021-04-15 13:07:19
    readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。   0x...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,018
精华内容 6,807
关键字:

readelf

友情链接: CH376S读CSV文件.rar