ecos最简单的helloword程序的elf格式文件内容分析!

当你编译好了最简单的helloword程序时候是不是迫不及待的去运行看看效果呢?
我们还是先分析一下这个elf文件的内容吧!(本hello文件装在我的板子内存0x8000处运行

  ELF Header:

  Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 //elf头,16位,标志文件为32位LSB,elf格式的文件。
  Class:                             ELF32//
  Data:                              2's complement, little endian//小头
  Version:                           1 (current)//版本
  OS/ABI:                            ARM//运行的平台是arm(w90p710)
  ABI Version:                       0
  Type:                              EXEC (Executable file)//可执行文件
  Machine:                           ARM//arm corp
  Version:                           0x1
  Entry point address:               0x8040//程序的入口点
  Start of program headers:          52 (bytes into file)//段表的在文件的偏移位置
  Start of section headers:          139172 (bytes into file)//节表在文件的偏移位置
  Flags:                             0x2, has entry point, GNU EABI//arm处理器的标志
  Size of this header:               52 (bytes)//elf头的大小
  Size of program headers:           32 (bytes)//段表的大小
  Number of program headers:         1//段表的表项,就是说一共有多少段表了
  Size of section headers:           40 (bytes)//节表头的大小,段是由各个节组成
  Number of section headers:         22//一共有多少节
  Section header string table index: 19//节区名称的标项索引

/****************************************************************************

该elf文件有以下的节组成,由于是elf文件前7个都是debug的信息,第8个开始安装异常向量,第9个就是组成下面段的节了,那么段(见蓝色)是由 哪几个节组成呢?(见红色)第10个为代码段,占约46k,第12、16数据段约为2k,一共约为48k,正好我的hello.bin 就是48K左右吧!

  Section Headers:

  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .debug_aranges    PROGBITS        00000000 013f90 000340 00      0   0  8
  [ 2] .debug_pubnames   PROGBITS        00000000 0142d0 0002ed 00      0   0  1
  [ 3] .debug_info       PROGBITS        00000000 0145bd 0084b5 00      0   0  1
  [ 4] .debug_abbrev     PROGBITS        00000000 01ca72 0026d2 00      0   0  1
  [ 5] .debug_line       PROGBITS        00000000 01f144 0014e9 00      0   0  1
  [ 6] .debug_frame      PROGBITS        00000000 020630 000684 00      0   0  4
  [ 7] .debug_str        PROGBITS        00000000 020cb4 000e7f 01  MS  0   0  1
  [ 8] .fixed_vectors    PROGBITS        00000200 021b40 000140 00      0   0 32
  [ 9] .rom_vectors      PROGBITS        00008000 008000 000040 00  AX  0   0  1
  [10] .text             PROGBITS        00008040 008040 00b4e4 00  AX  0   0  4
  [11] .fini             PROGBITS        00013524 021c80 000000 00   W  0   0  1
  [12] .rodata           PROGBITS        00013524 013524 0002d4 00   A  0   0  4
  [13] .rodata1          PROGBITS        000137f8 021c80 000000 00   W  0   0  1
  [14] .fixup            PROGBITS        000137f8 021c80 000000 00   W  0   0  1
  [15] .gcc_except_table PROGBITS        000137f8 021c80 000000 00   W  0   0  1
  [16] .data             PROGBITS        000137f8 0137f8 000794 00  WA  0   0  4
  [17] .bss              NOBITS          00013f8c 013f8c 00683c 00  WA  0   0 16
  [18] .debug_ranges     PROGBITS        00000000 021c80 000240 00      0   0  1
  [19] .shstrtab         STRTAB          00000000 021ec0 0000e3 00      0   0  1
  [20] .symtab           SYMTAB          00000000 022314 003360 10     21 200  4
  [21] .strtab           STRTAB          00000000 025674 003a6a 00      0   0  1

/****************************************************************************/

段表头的具体内容,type是load表示是一个可加载的段,该段在文件中的偏移地址和在内存中的物理地址都是0x8000,在文件中的大小是 0x0bf8c(49k),然而给其分配内存的时候,分配了0x127c8(75k)的内存,大概是由于对其等的缘故吧,Flg 属性是可读写的,对其方式是0x8000。该段由上面的小节组成。

   Program Headers:
   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
   LOAD           0x008000 0x00008000 0x00008000 0x0bf8c 0x127c8 RWE 0x8000


   Section to Segment mapping:
   Segment Sections...
   00     .rom_vectors .text .rodata .data .bss

以上是我针对elf的简单分析,如果你对elf格式有深入研究,希望您的批评指正。因为很多东西我的确得不到答案只能自己钻研!
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值