加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

elf转化成bin后,bin文件变大的问题

发布时间:2020-12-15 06:37:30 所属栏目:百科 来源:网络整理
导读:??? 在上一篇文章《 位置无关代码(PIC)的思考 》中提到,在elf文件转化成bin文件的过程中,输出段与段之间如果有空隙的话,objcopy会用0来填充段与段之间的空隙,也可以通过objcopy的选项--gap-fill= val来制定填充值的内容为val,这将会导致bin文件比elf

??? 在上一篇文章《位置无关代码(PIC)的思考》中提到,在elf文件转化成bin文件的过程中,输出段与段之间如果有空隙的话,objcopy会用0来填充段与段之间的空隙,也可以通过objcopy的选项--gap-fill= val来制定填充值的内容为val,这将会导致bin文件比elf文件大很多的问题,在很多嵌入式设备上将是无法接受的,因为嵌入式设备通常会将程序转化成bin烧写到FLASH中,这样做的目的就是为了省空间,但结果确实大大的浪费了空间。

??? 下面先通过一个简单的例子来说明下这个问题。

??? 1. boot.s文件,模拟bootloader,代码如下:

 ?.extern _entry
  .globl _start
  .text
  _start:                                                                                         
      jmp _entry
~                 
?? 2. main.s文件,模拟应用程序或os镜像,代码如下:

  .text
  .globl _entry
 ?_entry:
      mov $1,%eax                                                                                
  

3. 链接脚本文件(boot.lds):

OUTPUT_ARCH(i386)
  ENTRY(_start)
  
  SECTIONS
  {
      . = 0x0;?
  
      . = ALIGN(4);
      .boot 0x0 : ? ? ?;bootloader映射到ROM地址空间中,上电开始运行
      {
          boot.o(.text)
      }
  
 ?    . = ALIGN(4);                                                                               
      .text 0x10000   : ? ?;应用程序或os镜像映射到RAM中,由bootloader从ROM中搬运到RAM中
      {
          _tstart = .;
  
          *(.text)
     }
  
      . = ALIGN(4);
      .data : {*(.data)}
      _bss_start = .;
      .bss : {*(.bss)}
  }

??? 下面编译链接上面两个.s文件,并生成bin文件,过程如下:

gcc -c -g boot.s
gcc -c -g main.s
ld boot.o main.o -o bootelf -Tboot.lds -Map boot.map --gap-fill=0xff ? /*默认填充0,填充ff方便查看*/
objcopy -O binary bootelf bootbin.bin 

其中-Map boot.map是生成符号表,便于查看某些信息,下面是生成的每个文件的大小的截图:


从图中可以看到bootbin.bin的大小远远大于bootelf,下面我们来计算下文件的大小。

1. 首先先查看下bootbin.bin文件的内容: hexdump bootbin.bin

可以看到正是由于0x10~0x10000之间被填充了0xff,所以才导致了bin文件变大了,而且其大小正好是0x10000+5个字节,从map文件就可以计算出。

弄清楚了问题的根源,下面来分析下解决方法。

1. lds文件写法问题

??? 虽然这么写看起来清晰写,能够分清哪些代码在ROM中执行哪些代码在RAM中执行,但是却是通过增加额外的REGION来实现的,在《位置无关代码(PIC)的思考》一文中也提到了lds文件的写法,即将ROM中运行的代码也放在RAM地址空间中,至于为什么,前面已经讲过。

2. objcopy填充的问题

??? objcopy完全可以通过map文件或elf文件本的信息来对bin文件重新拼装,这个问题objcopy好像没有专门的选项来对应,需要自己通过脚本来实现bin文件的拼装

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读