自家是豹哥皇冠现金app,小编是豹哥

  仔细看过豹哥在此之前课程的恋人一定晓得,豹哥在第6节课relocatable文件里介绍的object文件在格式上其实跟本文要讲的elf文件是近似的,它们都属于ELF文件分支。只不是relocatable文件只是个中过渡文件,而本文要讲的elf却是标准的output文件,这些文件大约涵盖了工程的装有新闻,有了这几个文件大家既能够在线调节和测试工程,也足以将elf文件转变到image文件,直接下载image文件数据进芯片中脱机械运输维。明天豹哥就为大家精心分析elf文件。

工具2:IAR工具ielftool.exe

位置:\IAR Systems\Embedded Workbench xxx\arm\bin\ielftool.exe
用法:
      ielftool.exe --bin  demo.elf demo.bin
      ielftool.exe --ihex demo.elf demo.hex
      ielftool.exe --srec demo.elf demo.s19

  至此,嵌入式开采里的executable文件(elf)文件豹哥便介绍完成了,掌声在哪个地方~~~

2.1.3 readelf.exe用法

  readelf.exe遵从标准的windows命令行用法,使用–help能够列出全部命令option及其简单介绍,下边仅列出比较常用的option。

C:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe --help
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
  -h --file-header       Display the ELF file header
  -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
  -t --section-details   Display the section details
  -e --headers           Equivalent to: -h -l -S
  -s --syms              Display the symbol table
     --symbols           An alias for --syms
  --dyn-syms             Display the dynamic symbol table
  -r --relocs            Display the relocations (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)
  -I --histogram         Display histogram of bucket list lengths
  @<file>                Read options from <file>
2.1.3 readelf.exe用法

  readelf.exe遵从标准的windows命令行用法,使用–help能够列出全数命令option及其简要介绍,下边仅列出比较常用的option。

C:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe --help
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
  -h --file-header       Display the ELF file header
  -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
  -t --section-details   Display the section details
  -e --headers           Equivalent to: -h -l -S
  -s --syms              Display the symbol table
     --symbols           An alias for --syms
  --dyn-syms             Display the dynamic symbol table
  -r --relocs            Display the relocations (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)
  -I --histogram         Display histogram of bucket list lengths
  @<file>                Read options from <file>

工具2:IAR工具ielftool.exe

位置:\IAR Systems\Embedded Workbench xxx\arm\bin\ielftool.exe
用法:
      ielftool.exe --bin  demo.elf demo.bin
      ielftool.exe --ihex demo.elf demo.hex
      ielftool.exe --srec demo.elf demo.s19

  至此,嵌入式开采里的executable文件(elf)文件豹哥便介绍完成了,掌声在何地~~~

2.2.2 获得program header
C:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -l demo.elf

Elf file type is EXEC (Executable file)
Entry point 0x41
There are 1 program headers, starting at offset 31740

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000034 0x00000000 0x00000000 0x004c4 0x004c4 R E 0x100

 Section to Segment mapping:
  Segment Sections...
   00     A0 rw P1 ro

  再来分析program header,通过readelf -l命令能够获得program
header解析后的新闻。从地点可以查出header初始地点在demo.elf的31740
byte处(与file header里的e_phoff音讯是对应的),header消息提醒program
data从offset 0x3四早先,大小共0x肆c四bytes,Reset_Handler入口是0x肆一。继续在Hex艾德itor查看31740处开头的32byte数据,因为Elf3二_Phdr大小正是3贰bytes:

offset(h)
00007BF0: -- -- -- -- -- -- -- -- -- -- -- -- 01 00 00 00
00007C00: 34 00 00 00 00 00 00 00 00 00 00 00 C4 04 00 00
00007C10: C4 04 00 00 05 00 00 00 00 01 00 00 -- -- -- --

  可以看到p_offset=0x00000034,p_memsz=0x000004c4,
与地点解析后的新闻是如出1辙的;余下可活动对照。
那里的新闻就相比关键了,因为那提示了全体image
binary数据所在(知道了那些新闻,大家便得以平素写脚本依照elf文件生成image
binary),继续在Hex艾德itor里看下来(仅截取部分显得):

offset(h)
00000030: -- -- -- -- 00 20 00 10 41 00 00 00 03 04 00 00
00000040: 3F 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000060: 61 04 00 00 00 00 00 00 00 00 00 00 63 04 00 00
00000070: 65 04 00 00 72 B6 0E 48 0E 49 88 60 00 22 00 23
00000080: 00 24 00 25 00 26 00 27 B8 46 B9 46 BA 46 BB 46

皇冠现金app,  ATucsonM系统的image前十七个指针都以系统中断向量,大家能够看看SP=0x一千两千,
PC=0x0000004一,那与地点解析的Reset_Handler入口是0x肆1是相配的。

2.1.2 cygwin(windows下使用GNU)

  Cygwin是1个在windows平台上运营的类UNIX模拟条件,是cygnus
solutions公司(已被Redhat收购)开拓的自由软件。它对于学习UNIX/Linux操作环境,也许从UNIX到Windows的应用程序移植,尤其是选择GNU工具集在Windows上进行嵌入式系统开辟,非凡实用。

// 下载链接
Installer:http://cygwin.com/install.html
Package:  https://cygwin.com/packages/package_list.html
// 相关包(根据平台选择)
binutils                - GNU assembler, linker, and similar utilities
cygwin32-binutils       - Binutils for Cygwin 32bit toolchain
mingw64-x86_64-binutils - Binutils for MinGW-w64 Win64 toolchain 
mingw64-i686-binutils   - Binutils for MinGW-w64 Win32 toolchain

  下载安装好cygwin包后,便可在安装目录下\cygwin64\bin\找到x86_64-w6四-mingw3二-readelf.exe工具(豹哥选用的是mingw6四-x8六_64-binutils包)。

  第四、五节课里,豹哥已经给大家介绍了贰种output文件,本文继续给大家讲project生成的另①种output文件-executable文件,也是专门主要的output文件。

  文件涉及:linker文件

2.2.4 获得symbol list
c:cygwin64\bin>x86_64-w64-mingw32-readelf.exe -s demo.elf

Symbol table '.symtab' contains 198 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
    74: 10002018    16 OBJECT  LOCAL  DEFAULT    7 s_array
    75: 10002014     4 OBJECT  LOCAL  DEFAULT    7 s_variable0
    76: 10002010     4 OBJECT  LOCAL  DEFAULT    7 s_variable2
   135: 00000000     0 OBJECT  GLOBAL DEFAULT    4 __vector_table
   140: 00000041     0 FUNC    GLOBAL DEFAULT    5 Reset_Handler
   141: 00000098     4 OBJECT  GLOBAL DEFAULT    5 s_constant
   142: 000000ad    32 FUNC    GLOBAL DEFAULT    5 main
   143: 000000cd    14 FUNC    GLOBAL DEFAULT    5 normal_task
   144: 000000db    60 FUNC    GLOBAL DEFAULT    5 heap_task
   155: 0000034d    84 FUNC    GLOBAL DEFAULT    5 init_data_bss
   156: 000003a1    18 FUNC    GLOBAL DEFAULT    5 init_interrupts
   157: 000003dd    12 FUNC    GLOBAL DEFAULT    5 SystemInit
   186: 10002001    16 FUNC    GLOBAL DEFAULT    7 ram_task
   191: 10002034     4 OBJECT  GLOBAL DEFAULT    7 n_variable1

  通过readelf -s命令能够获得symbol
list解析后的新闻。能够看到有不少个symbol,豹哥在此地仅列出利用工程里自定义的函数和变量,从symbol表里大家可以得知函数/变量在存款和储蓄器中现实分配地址和长度,那对于大家更是分析和调控应用是有扶助的。

2.3 elf文件layout

  经过上一节对demo.elf里相继header的解析,此时我们便能够粗略地画出elf文件layout。

File offset Data content Data size in bytes
0x00000000 ELF file header 52
0x00000034 Image binary (Section4-A0 rw, .intvec中断向量表) 0x40
0x00000074 Image binary (Section5-P1 ro, readonly section(.text, .rodata…)) 0x484
0x000004F8 Section8-20 (包含各种辅助调试和系统段.debug_xx, .iar.xx) 0x5E3E
0x00006336 NULL 0x2
0x00006338 Section1-.shstrtab字符串表 0xE6
0x00006420 Section2-.strtab字符串信息 0xB7C
0x00006F9C Section3-.symtab符号信息 0xC60
0x00007BFC ELF Program header 0x20
0x00007C1C ELF Section headers (0 – 20) 21 * 40
2.2.3 获得section header
c:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -S demo.elf
There are 21 section headers, starting at offset 0x7c1c:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 006338 000000 00      0   0  4
  [ 1] .shstrtab         STRTAB          00000000 006338 0000e6 00      0   0  4
  [ 2] .strtab           STRTAB          00000000 006420 000b7c 00      0   0  4
  [ 3] .symtab           SYMTAB          00000000 006f9c 000c60 10      2 135  4
  [ 4] A0 rw             PROGBITS        00000000 000034 000040 01  AX  0   0 256
  [ 5] P1 ro             PROGBITS        00000040 000074 000484 01  AX  0   0  4
  [ 6] P3 ui             NOBITS          10000000 0004f8 002000 01  WA  0   0  8
  [ 7] P2 rw             NOBITS          10002000 0004f8 000438 01  WA  0   0  8
  [ 8] .debug_abbrev     PROGBITS        00000000 0004f8 0002c6 01      0   0  0
  [ 9] .debug_aranges    PROGBITS        00000000 0007c0 00016c 01      0   0  0
  [10] .debug_frame      PROGBITS        00000000 00092c 00057c 01      0   0  0
  [11] .debug_info       PROGBITS        00000000 000ea8 000e2e 01      0   0  0
  [12] .debug_line       PROGBITS        00000000 001cd8 000dcb 01      0   0  0
  [13] .debug_loc        PROGBITS        00000000 002aa4 00024c 01      0   0  0
  [14] .debug_macinfo    PROGBITS        00000000 002cf0 00011e 01      0   0  0
  [15] .debug_pubnames   PROGBITS        00000000 002e10 00012a 01      0   0  0
  [16] .iar.debug_frame  PROGBITS        00000000 002f3c 00007e 01      0   0  0
  [17] .iar.debug_line   PROGBITS        00000000 002fbc 000367 01      0   0  0
  [18] .comment          PROGBITS        00000000 003324 002fa2 01      0   0  0
  [19] .iar.rtmodel      PROGBITS        00000000 0062c8 000047 01      0   0  0
  [20] .ARM.attributes   ARM_ATTRIBUTES  00000000 006310 000026 01      0   0  0
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),
  y (purecode), p (processor specific)

  再来分析section header,通过readelf -S命令可以获得section
header解析后的音信。能够见见有好些个少个section,个中最要害的陆个section是A0(readonly
vector), P一(readonly code,data), P二(readwrite data, heap),
P三(STACK)。具体分析,各位朋友自个儿尝试看。

工具1:GNU工具objcopy

位置:C:\cygwin64\bin>x86_64-w64-mingw32-objcopy.exe
用法:
      objcopy.exe -O binary -S demo.elf demo.bin
      objcopy.exe -O srec   -S demo.elf demo.s19

备注:一说需用arm-linux-objcopy,待验证

二.2 稳步分析elf文件

  万事俱备了,开头分析elf文件,以第一节课project文件里demo工程为例。编写翻译链接该工程可在D:\myProject\bsp\builds\demo\Release\Exe路线下获得demo.elf文件。该文件大小3261二bytes,显著那样简单的二个小工程image
size不容许那样大,表明elf文件里的记录音信数据占比一点都相当的大。

2.2.3 获得section header
c:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -S demo.elf
There are 21 section headers, starting at offset 0x7c1c:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 006338 000000 00      0   0  4
  [ 1] .shstrtab         STRTAB          00000000 006338 0000e6 00      0   0  4
  [ 2] .strtab           STRTAB          00000000 006420 000b7c 00      0   0  4
  [ 3] .symtab           SYMTAB          00000000 006f9c 000c60 10      2 135  4
  [ 4] A0 rw             PROGBITS        00000000 000034 000040 01  AX  0   0 256
  [ 5] P1 ro             PROGBITS        00000040 000074 000484 01  AX  0   0  4
  [ 6] P3 ui             NOBITS          10000000 0004f8 002000 01  WA  0   0  8
  [ 7] P2 rw             NOBITS          10002000 0004f8 000438 01  WA  0   0  8
  [ 8] .debug_abbrev     PROGBITS        00000000 0004f8 0002c6 01      0   0  0
  [ 9] .debug_aranges    PROGBITS        00000000 0007c0 00016c 01      0   0  0
  [10] .debug_frame      PROGBITS        00000000 00092c 00057c 01      0   0  0
  [11] .debug_info       PROGBITS        00000000 000ea8 000e2e 01      0   0  0
  [12] .debug_line       PROGBITS        00000000 001cd8 000dcb 01      0   0  0
  [13] .debug_loc        PROGBITS        00000000 002aa4 00024c 01      0   0  0
  [14] .debug_macinfo    PROGBITS        00000000 002cf0 00011e 01      0   0  0
  [15] .debug_pubnames   PROGBITS        00000000 002e10 00012a 01      0   0  0
  [16] .iar.debug_frame  PROGBITS        00000000 002f3c 00007e 01      0   0  0
  [17] .iar.debug_line   PROGBITS        00000000 002fbc 000367 01      0   0  0
  [18] .comment          PROGBITS        00000000 003324 002fa2 01      0   0  0
  [19] .iar.rtmodel      PROGBITS        00000000 0062c8 000047 01      0   0  0
  [20] .ARM.attributes   ARM_ATTRIBUTES  00000000 006310 000026 01      0   0  0
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),
  y (purecode), p (processor specific)

  再来分析section header,通过readelf -S命令能够获得section
header解析后的音讯。能够看出有为数不少个section,当中最要害的五个section是A0(readonly
vector), P壹(readonly code,data), P二(readwrite data, heap),
P三(STACK)。具体分析,各位朋友本身尝试看。

2.3 elf文件layout

  经过上1节对demo.elf里相继header的辨析,此时大家便足以粗略地画出elf文件layout。

File offset Data content Data size in bytes
0x00000000 ELF file header 52
0x00000034 Image binary (Section4-A0 rw, .intvec中断向量表) 0x40
0x00000074 Image binary (Section5-P1 ro, readonly section(.text, .rodata…)) 0x484
0x000004F8 Section8-20 (包含各种辅助调试和系统段.debug_xx, .iar.xx) 0x5E3E
0x00006336 NULL 0x2
0x00006338 Section1-.shstrtab字符串表 0xE6
0x00006420 Section2-.strtab字符串信息 0xB7C
0x00006F9C Section3-.symtab符号信息 0xC60
0x00007BFC ELF Program header 0x20
0x00007C1C ELF Section headers (0 – 20) 21 * 40
2.2.4 获得symbol list
c:cygwin64\bin>x86_64-w64-mingw32-readelf.exe -s demo.elf

Symbol table '.symtab' contains 198 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
    74: 10002018    16 OBJECT  LOCAL  DEFAULT    7 s_array
    75: 10002014     4 OBJECT  LOCAL  DEFAULT    7 s_variable0
    76: 10002010     4 OBJECT  LOCAL  DEFAULT    7 s_variable2
   135: 00000000     0 OBJECT  GLOBAL DEFAULT    4 __vector_table
   140: 00000041     0 FUNC    GLOBAL DEFAULT    5 Reset_Handler
   141: 00000098     4 OBJECT  GLOBAL DEFAULT    5 s_constant
   142: 000000ad    32 FUNC    GLOBAL DEFAULT    5 main
   143: 000000cd    14 FUNC    GLOBAL DEFAULT    5 normal_task
   144: 000000db    60 FUNC    GLOBAL DEFAULT    5 heap_task
   155: 0000034d    84 FUNC    GLOBAL DEFAULT    5 init_data_bss
   156: 000003a1    18 FUNC    GLOBAL DEFAULT    5 init_interrupts
   157: 000003dd    12 FUNC    GLOBAL DEFAULT    5 SystemInit
   186: 10002001    16 FUNC    GLOBAL DEFAULT    7 ram_task
   191: 10002034     4 OBJECT  GLOBAL DEFAULT    7 n_variable1

  通过readelf -s命令能够拿走symbol
list解析后的消息。能够看出有许四个symbol,豹哥在那边仅列出利用工程里自定义的函数和变量,从symbol表里大家能够识破函数/变量在存储器中具体分配地址和长度,那对于大家更是分析和调整应用是有援救的。

  咱们好,作者是豹哥,猎豹的豹,犀利哥的哥。后天豹哥给大家讲的是嵌入式开采里的executable文件(elf)

壹、elf文件基础

  ELF全称Executable and Linkable
Format,可进行连接格式,ELF格式的公文最早用于存款和储蓄Linux程序,后衍变到ALX570M系统上存款和储蓄A奇骏M程序。ELF文件(目的文件)格式首要三种:

  • 可重定向文件:用来和其它的对象文件一同来创建一个可实践文件只怕共享目的文件(也称object文件或许静态库文件,平日后缀为.o和.a的文书)。这么些文件是用于编写翻译和链接阶段。
  • 可施行文件:用于转移应用image,载入存款和储蓄器试行(后缀平时为.out或然.elf)。那么些文件是用来加载实行阶段。
  • 共享目标文件:用于和任何共享目的文件也许object文件一同生成可实施文件,大概和可实施文件一起开创应用image。(也称共享库文件,后缀为.so的文书)。那么些文件既可用来编写翻译和链接阶段,也可用以加载实施阶段。

  大家在ASportageM开辟中更多接触的是前二种格式,第三种格式前边类别小说relocatable文件曾经介绍过,本文的支柱是第三种格式-可推行文件。不管是哪个种类格式的ELF文件,其都可能带有如下三种基本索引表:

  • file header:1般在文书的启幕,描述了ELF文件的完全组织处境。
  • program
    header
    :告诉系统怎样创立image,可实践文件必须具备program
    header,而可重定向文件则不要求。
  • section
    header
    :包括了描述文件section的新闻,每一种section都有多个header,各类header给出诸如section名称、section大小等音信。可重定向文件必须包涵section
    header。

  既然知道了设有两种索引表,那么表的构造定义在何地吧?github上的linux旅社里有切实可行定义,在elf.h头文件里。

Linux仓库:https://github.com/torvalds/linux.git
elf.h路径:\linux\include\uapi\linux\elf.h

  展开elf.h文件便可找到七个表的原型定义,鉴于近期的AGL450M
Cortex-M都是32bit,所以那里仅列出3贰bit下的表的原型:Elf3二_Ehdr、Elf32_Phdr、Elf32_Shdr。

// file header
#define EI_NIDENT    16
typedef struct elf32_hdr{
  unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */
  Elf32_Half    e_type;                 /* Object file type */  
  Elf32_Half    e_machine;              /* Architecture */  
  Elf32_Word    e_version;              /* Object file version */  
  Elf32_Addr    e_entry;                /* Entry point virtual address */  
  Elf32_Off     e_phoff;                /* Program header table file offset */  
  Elf32_Off     e_shoff;                /* Section header table file offset */  
  Elf32_Word    e_flags;                /* Processor-specific flags */  
  Elf32_Half    e_ehsize;               /* ELF header size in bytes */  
  Elf32_Half    e_phentsize;            /* Program header table entry size */  
  Elf32_Half    e_phnum;                /* Program header table entry count */  
  Elf32_Half    e_shentsize;            /* Section header table entry size */  
  Elf32_Half    e_shnum;                /* Section header table entry count */  
  Elf32_Half    e_shstrndx;             /* Section header string table index */ 
} Elf32_Ehdr;

// program header
typedef struct elf32_phdr{
  Elf32_Word    p_type;           /* Segment type */
  Elf32_Off     p_offset;         /* Segment file offset */
  Elf32_Addr    p_vaddr;          /* Segment virtual address */
  Elf32_Addr    p_paddr;          /* Segment physical address */
  Elf32_Word    p_filesz;         /* Segment size in file */
  Elf32_Word    p_memsz;          /* Segment size in memory */
  Elf32_Word    p_flags;          /* Segment flags */
  Elf32_Word    p_align;          /* Segment alignment, file & memory */
} Elf32_Phdr;

// section header
typedef struct elf32_shdr {
  Elf32_Word    sh_name;          /* Section name, index in string tbl */
  Elf32_Word    sh_type;          /* Type of section */
  Elf32_Word    sh_flags;         /* Miscellaneous section attributes */
  Elf32_Addr    sh_addr;          /* Section virtual addr at execution */
  Elf32_Off     sh_offset;        /* Section file offset */
  Elf32_Word    sh_size;          /* Size of section in bytes */
  Elf32_Word    sh_link;          /* Index of another section */
  Elf32_Word    sh_info;          /* Additional section information */
  Elf32_Word    sh_addralign;     /* Section alignment */
  Elf32_Word    sh_entsize;       /* Entry size if section holds table */
} Elf32_Shdr;

二、解析elf文件

  所谓工欲善其事,必先利其器,在起头解析elf文件在此以前,大家不可能不先找到一款适合的解析工具,readelf正是GNU/Linux官方推出的专用解析工具。有了这么些分析工具,大家便足以渐渐分析elf文件。

2.2.2 获得program header
C:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -l demo.elf

Elf file type is EXEC (Executable file)
Entry point 0x41
There are 1 program headers, starting at offset 31740

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000034 0x00000000 0x00000000 0x004c4 0x004c4 R E 0x100

 Section to Segment mapping:
  Segment Sections...
   00     A0 rw P1 ro

  再来分析program header,通过readelf -l命令能够得到program
header解析后的新闻。从上边能够识破header早先地方在demo.elf的31740
byte处(与file header里的e_phoff新闻是应和的),header消息提醒program
data从offset 0x3肆起来,大小共0x四c四bytes,Reset_Handler入口是0x4一。继续在Hex艾德itor查看31740处起头的3二byte数据,因为Elf32_Phdr大小便是32bytes:

offset(h)
00007BF0: -- -- -- -- -- -- -- -- -- -- -- -- 01 00 00 00
00007C00: 34 00 00 00 00 00 00 00 00 00 00 00 C4 04 00 00
00007C10: C4 04 00 00 05 00 00 00 00 01 00 00 -- -- -- --

  能够见到p_offset=0x00000034,p_memsz=0x00000四c四,
与地方解析后的音信是千篇一律的;余下可活动对照。
那里的音讯就相比主要了,因为这提醒了全副image
binary数据所在(知道了那么些新闻,大家便得以一贯写脚本依据elf文件生成image
binary),继续在Hex艾德itor里看下来(仅截取部分显得):

offset(h)
00000030: -- -- -- -- 00 20 00 10 41 00 00 00 03 04 00 00
00000040: 3F 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000060: 61 04 00 00 00 00 00 00 00 00 00 00 63 04 00 00
00000070: 65 04 00 00 72 B6 0E 48 0E 49 88 60 00 22 00 23
00000080: 00 24 00 25 00 26 00 27 B8 46 B9 46 BA 46 BB 46

  A帕杰罗M系统的image前14个指针都以系统中断向量,我们能够看看SP=0x一千3000,
PC=0x000000四1,那与地点解析的Reset_Handler入口是0x肆一是相称的。

2.1.2 cygwin(windows下使用GNU)

  Cygwin是二个在windows平台上运营的类UNIX模拟条件,是cygnus
solutions集团(已被Redhat收购)开拓的自由软件。它对于学习UNIX/Linux操作环境,只怕从UNIX到Windows的应用程序移植,尤其是利用GNU工具集在Windows上进展嵌入式系统开拓,格外实用。

// 下载链接
Installer:http://cygwin.com/install.html
Package:  https://cygwin.com/packages/package_list.html
// 相关包(根据平台选择)
binutils                - GNU assembler, linker, and similar utilities
cygwin32-binutils       - Binutils for Cygwin 32bit toolchain
mingw64-x86_64-binutils - Binutils for MinGW-w64 Win64 toolchain 
mingw64-i686-binutils   - Binutils for MinGW-w64 Win32 toolchain

  下载安装好cygwin包后,便可在装置目录下\cygwin64\bin\找到x86_6四-w6四-mingw3二-readelf.exe工具(豹哥选择的是mingw6四-x86_64-binutils包)。



2.1.1 GNU工具集(binutils)

  GNU是“GNU’s Not
Unix”的递归缩写,又叫做GNU布署,多数家弦户诵的开源软件及工具都是GNU开荒的(比如著名的C语言编写翻译器GCC)。binutils是GNU1系列binary小工具的聚合,大家从上边包车型客车链接里找到官方binutils包。

主页:http://www.gnu.org/software/binutils/
仓库:git://sourceware.org/git/binutils-gdb.git
下载:http://ftp.gnu.org/gnu/binutils/
文档:https://sourceware.org/binutils/docs-2.29/binutils/index.html

  不过采纳上述包里的readelf会有2个主题素材,上述工具是在Linux系统下选用的,而大家平常做A哈弗M
Cortex-M开发许多都是在windows平台下,那么怎么在windows下使用readelf工具呢?别急,cygwin给了大家支持。

1、elf文件基础

  ELF全称Executable and Linkable
Format,可实行连接格式,ELF格式的文件最早用于存款和储蓄Linux程序,后演化到A帕杰罗M系统上存款和储蓄A奥迪Q五M程序。ELF文件(目标文件)格式首要两种:

  • 可重定向文件:用来和别的的对象文件一同来创建三个可执行文件大概共享目的文件(也称object文件或然静态库文件,常常后缀为.o和.a的公文)。这几个文件是用于编写翻译和链接阶段。
  • 可施行文件:用于转移应用image,载入存款和储蓄器实行(后缀平日为.out恐怕.elf)。这么些文件是用来加载试行阶段。
  • 共享目的文件:用于和别的共享目的文件也许object文件一起生成可推行文件,或然和可实施文件一同创办应用image。(也称共享库文件,后缀为.so的公文)。那么些文件既可用以编写翻译和链接阶段,也可用以加载推行等级。

  大家在AOdysseyM开荒中越来越多接触的是前三种格式,第3种格式后边种类小说relocatable文件曾经介绍过,本文的支柱是第二种格式-可施行文件。不管是哪类格式的ELF文件,其都恐怕带有如下两种基本索引表:

  • file header:1般在文书的初始,描述了ELF文件的完整协会情形。
  • program
    header
    :告诉系统如何制造image,可推行文件必须持有program
    header,而可重定向文件则不要求。
  • section
    header
    :包括了描述文件section的新闻,每一个section都有1个header,每三个header给出诸如section名称、section大小等消息。可重定向文件必须带有section
    header。

  既然知道了设有二种索引表,那么表的布局定义在哪儿啊?github上的linux仓Curry有具体定义,在elf.h头文件里。

Linux仓库:https://github.com/torvalds/linux.git
elf.h路径:\linux\include\uapi\linux\elf.h

  展开elf.h文件便可找到四个表的原型定义,鉴于近来的APAJEROM
Cortex-M皆以32bit,所以那里仅列出3二bit下的表的原型:Elf32_Ehdr、Elf32_Phdr、Elf32_Shdr。

// file header
#define EI_NIDENT    16
typedef struct elf32_hdr{
  unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */
  Elf32_Half    e_type;                 /* Object file type */  
  Elf32_Half    e_machine;              /* Architecture */  
  Elf32_Word    e_version;              /* Object file version */  
  Elf32_Addr    e_entry;                /* Entry point virtual address */  
  Elf32_Off     e_phoff;                /* Program header table file offset */  
  Elf32_Off     e_shoff;                /* Section header table file offset */  
  Elf32_Word    e_flags;                /* Processor-specific flags */  
  Elf32_Half    e_ehsize;               /* ELF header size in bytes */  
  Elf32_Half    e_phentsize;            /* Program header table entry size */  
  Elf32_Half    e_phnum;                /* Program header table entry count */  
  Elf32_Half    e_shentsize;            /* Section header table entry size */  
  Elf32_Half    e_shnum;                /* Section header table entry count */  
  Elf32_Half    e_shstrndx;             /* Section header string table index */ 
} Elf32_Ehdr;

// program header
typedef struct elf32_phdr{
  Elf32_Word    p_type;           /* Segment type */
  Elf32_Off     p_offset;         /* Segment file offset */
  Elf32_Addr    p_vaddr;          /* Segment virtual address */
  Elf32_Addr    p_paddr;          /* Segment physical address */
  Elf32_Word    p_filesz;         /* Segment size in file */
  Elf32_Word    p_memsz;          /* Segment size in memory */
  Elf32_Word    p_flags;          /* Segment flags */
  Elf32_Word    p_align;          /* Segment alignment, file & memory */
} Elf32_Phdr;

// section header
typedef struct elf32_shdr {
  Elf32_Word    sh_name;          /* Section name, index in string tbl */
  Elf32_Word    sh_type;          /* Type of section */
  Elf32_Word    sh_flags;         /* Miscellaneous section attributes */
  Elf32_Addr    sh_addr;          /* Section virtual addr at execution */
  Elf32_Off     sh_offset;        /* Section file offset */
  Elf32_Word    sh_size;          /* Size of section in bytes */
  Elf32_Word    sh_link;          /* Index of another section */
  Elf32_Word    sh_info;          /* Additional section information */
  Elf32_Word    sh_addralign;     /* Section alignment */
  Elf32_Word    sh_entsize;       /* Entry size if section holds table */
} Elf32_Shdr;

  大家好,小编是豹哥,猎豹的豹,犀利哥的哥。前日豹哥给我们讲的是嵌入式开拓里的executable文件(elf)

2.2.1 获得file header
C:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -h demo.elf
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x41
  Start of program headers:          31740 (bytes into file)
  Start of section headers:          31772 (bytes into file)
  Flags:                             0x5000000, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         1
  Size of section headers:           40 (bytes)
  Number of section headers:         21
  Section header string table index: 1

  第贰步首先分析file header,前边介绍里说过file
header是献身文件最前方的。通过readelf -h命令可以赢得file
header解析后的新闻。让我们来对待一下,使用Hex艾德itor间接展开demo.elf可获得如下数据,仅取前52bytes(0x3四)数据,因为Elf32_Ehdr大小便是5二bytes:

offset(h)
00000000: 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00
00000010: 02 00 28 00 01 00 00 00 41 00 00 00 FC 7B 00 00
00000020: 1C 7C 00 00 00 00 00 05 34 00 20 00 01 00 28 00
00000030: 15 00 01 00 -- -- -- -- -- -- -- -- -- -- -- --

  可以看出前16byte是e_ident[16],与分析后的Magic是如出一辙的;再来验证prgram
header偏移e_phoff=0x00007BFC,数量e_phnum=0x0001,大小e_phentsize=0x0020,也是与分析后的消息相配的;余下可活动对照。

  仔细看过豹哥以前课程的爱人一定精通,豹哥在第6节课relocatable文件里介绍的object文件在格式上实在跟本文要讲的elf文件是看似的,它们都属于ELF文件分支。只不是relocatable文件只是高级中学级过渡文件,而本文要讲的elf却是标准的output文件,那么些文件大约涵盖了工程的富有新闻,有了那几个文件大家既能够在线调节和测试工程,也能够将elf文件调换来image文件,直接下载image文件数据进芯片中脱机械运输转。明日豹哥就为大家细心分析elf文件。

番外一、几个elf转换image工具

  在前些天的番外篇里,豹哥给大家顺便介绍六款专业的elf文件转变到image文件的工具。

2.1.1 GNU工具集(binutils)

  GNU是“GNU’s Not
Unix”的递归缩写,又叫做GNU安插,诸多威名赫赫的开源软件及工具都是GNU开拓的(比如知名的C语言编写翻译器GCC)。binutils是GNU一类别binary小工具的会师,我们从底下的链接里找到官方binutils包。

主页:http://www.gnu.org/software/binutils/
仓库:git://sourceware.org/git/binutils-gdb.git
下载:http://ftp.gnu.org/gnu/binutils/
文档:https://sourceware.org/binutils/docs-2.29/binutils/index.html

  可是采用上述包里的readelf会有3个主题素材,上述工具是在Linux系统下行使的,而大家平时做A昂科雷M
Cortex-M开垦诸多都以在windows平台下,那么怎么在windows下使用readelf工具呢?别急,cygwin给了我们协助。

  第5、5节课里,豹哥已经给大家介绍了二种output文件,本文继续给大家讲project生成的另一种output文件-executable文件,也是越发重大的output文件。

  文件涉及:linker文件

2.2.1 获得file header
C:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -h demo.elf
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x41
  Start of program headers:          31740 (bytes into file)
  Start of section headers:          31772 (bytes into file)
  Flags:                             0x5000000, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         1
  Size of section headers:           40 (bytes)
  Number of section headers:         21
  Section header string table index: 1

  第一步首先分析file header,前边介绍里说过file
header是位于文件最前边的。通过readelf -h命令能够获取file
header解析后的消息。让大家来相比较一下,使用Hex艾德itor直接展开demo.elf可获取如下数据,仅取前5二bytes(0x3四)数据,因为Elf3二_Ehdr大小正是5贰bytes:

offset(h)
00000000: 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00
00000010: 02 00 28 00 01 00 00 00 41 00 00 00 FC 7B 00 00
00000020: 1C 7C 00 00 00 00 00 05 34 00 20 00 01 00 28 00
00000030: 15 00 01 00 -- -- -- -- -- -- -- -- -- -- -- --

  能够看看前1陆byte是e_ident[16],与分析后的Magic是均等的;再来验证prgram
header偏移e_phoff=0x00007BFC,数量e_phnum=0x0001,大小e_phentsize=0x0020,也是与分析后的音信十分的;余下可自行对照。

贰.壹 解析工具readelf

  既然elf文件是Linux系统下常用的可施行文件格式,那么Linux社区一定会有配套的工具去分析它,是的,那几个工具就叫readelf,在GNU工具集binutils里。

工具1:GNU工具objcopy

位置:C:\cygwin64\bin>x86_64-w64-mingw32-objcopy.exe
用法:
      objcopy.exe -O binary -S demo.elf demo.bin
      objcopy.exe -O srec   -S demo.elf demo.s19

备注:一说需用arm-linux-objcopy,待验证

二.二 稳步分析elf文件

  万事俱备了,初叶分析elf文件,以第一节课project文件里demo工程为例。编写翻译链接该工程可在D:\myProject\bsp\builds\demo\Release\Exe路线下获得demo.elf文件。该文件大小32612bytes,显明那样简单的3个小工程image
size不容许那样大,表明elf文件里的记录音信数据占比比比较大。

番外一、几个elf转换image工具

  在后天的番外篇里,豹哥给我们顺便介绍七款专业的elf文件调换到image文件的工具。

二、解析elf文件

  所谓工欲善其事,必先利其器,在初始解析elf文件以前,我们必须先找到1款合适的辨析工具,readelf便是GNU/Linux官方推出的专用解析工具。有了那个分析工具,大家便能够渐渐分析elf文件。

二.1 解析工具readelf

  既然elf文件是Linux系统下常用的可实施文件格式,那么Linux社区一定会有配套的工具去分析它,是的,这一个工具就叫readelf,在GNU工具集binutils里。

相关文章