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

嵌入式开发必知:HEX、BIN、ELF文件格式转换原理与实战 在嵌入式系统开发中,可执行文件格式是连接高级语言代码与底层硬件执行的关键桥梁。从编译链接过程产生的原始文件,到最终烧录至微控制器闪存的二进制映像,不同格式承载着各异的信息结构与设计目的。其核心原理在于如何高效、准确地将程序代码、数据及元数据组织成硬件可识别、工具链可处理的形态。理解这些格式的技术价值,能直接提升固件生产的可靠性、调试的便捷性与存储空间的利用率。典型的应用场景包括量产烧录、在线升级(OTA)、Bootloader设计以及跨平台固件交付。其中,HEX文件以其自包含地址信息的ASCII文本特性,在 阅读详情
AI摘要

本文探讨了在将ELF文件转换为BIN文件时遇到的空间膨胀问题,特别是针对嵌入式系统的应用。通过分析bootloader与应用程序的链接脚本设置及objcopy工具的使用方式,提出了解决方案。

    在上一篇文章《位置无关代码(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文件的拼装


千兆网动态配置FPGA小结(3) 今天终于把这个小任务结了,还是蛮高兴的。还把代码整理了一下,用C语言改写了下程序效果还是蛮不错。我发现memset这种类似的函数会事那个延时蛮长,现在时间终于稳定到了10s左右,还是蛮有成就感。这篇主要讲一下 elf和sof转化成bin文件 其实这种文件的相互转化altera做的已经很好了,但是主要转化方式还是需要nios command shell的,主要操作如下: 在一个不含中文和空格的路 阅读详情

相关推荐

轻松实现将NIOS II中两个hex文件合并成一个hex文件的方法

在NIOS II 中经常会将两个hex文件合并成一个,方法有很多种. 这里介绍一种间接的将原本硬件和软件生成的hex文件转换成一个hex 一、该语句将硬件生成的FF_C4.sof文件转化成hwimage.flash文件; sof2flash --input=FF_C4.sof --output=hwimage.flash --epcs -verbose 二、该语句将eclipse产生的 FF.elf 文件转化成 swimage.flash 文件; elf2flash --input=FF.elf --out

3有青年的博客 828

ELF与BIN文件区别

Gcc 编译出来的是ELF文件。通常gcc –o test test.c,生成的test文件就是ELF格式的,在linuxshell下输入 ./test就可以执行。 Bin 文件是经过压缩的可执行文件,去掉ELF格式的东西。是直接的内存映像的表示。在系统没有加载操作系统的时候可以执行。 elf(executable  and   link   format)文件里面包含了符号表,汇编等。

Sunny04的专栏 1万+

DevKitPro(GBA),MakeFile文件大概分析(编译)

前言:我对makefile文件不是很熟悉,所以只能大概分析一下 makefile文件分析 一, 判断两个关键系统变量 $(DEVKITARM)和$(DEVKITPRO),注:引用库路径都是根据这两个变量的 二, 引用gba_ruls文件,和base_ruls文件 三, 初始化所有变量 四, 编译所有文件,当遇到*.bin文件时,执行 bin2s $(outfile) || $(AS) -

yami的专栏 2093

关于ELF可执行文件转换为bin二进制文件反而变大带来的思考和解决方法

文章目录错误现象C程序的编译,汇编和链接编译常见选项编译选项制作动态库方法制作静态库方法链接选项bin文件反而变大原因分析为什么会出现空洞文件情况呢?解决方案问题二: 为什么指定了链接脚本,转换为bin文件反而变大了呢?建立测试代码通过交叉编译链进行默认的链接编写链接脚本通过链接脚本进行链接解决方法参考资料 错误现象 当我们在进行嵌入式的程序编写的时候,往往需要将我们在虚拟机生成的ELF可执行文件转换为二进制的文件。 原因:ELF可执行文件是针对于带有Linux操作系统的情况下才能使用,而当我们处于裸机的时

m0_56145255的博客 7209

STM32 BIN文件编程与应用:从代码到烧录的全过程

STM32微控制器是STMicroelectronics(意法半导体)推出的一款广泛使用的32位ARM Cortex-M系列微控制器。它们基于高性能的ARM Cortex-M0、M3、M4和M7核心,并具有多种功能强大的外设,适用于工业控制、医疗设备、消费电子和各种物联网应用。BIN文件通常是一种二进制文件格式,它包含可以直接加载到内存中的数据。在嵌入式系统领域,BIN文件常常用于存储可执行程序代码和数据,这些代码和数据经过编译和链接,被转化为机器可以理解的指令。

weixin_28746457的博客 1229

elf转换为bin脚本工具

本资源为一个windows脚本工具,可以将elf文件转为bin文件,其原理是调用objcopy工具,用起来方便,不用记复杂的命令选项

vitis2021.1 armr5-none-eabi-objcopy -O binary elf文件转bin文件变大

把编译的程序文件尾缀elf变成bin文件,编译的是xilinx 4ev R5核的裸机程序。 本来是一件很简单的事情,输入下面命令即可。 armr5-none-eabi-objcopy -O binary c_project_r5_app0.elf c_project_r5_app0.bin 但是编译出来的bin文件无法运行,排查文件大小,发现bin文件变得非常大,比elf文件还大。 很明显这不对劲,理论来说,elf文件变成bin文件应该会变的小很大的,现在反了。 后面创建了一个A53的工

sudaroot的博客 2507

智能网联汽车云控系统核心解析:车云数据交互协议设计与实践

本文深入解析了智能网联汽车云控系统的核心——车云数据交互协议的设计与实践。文章围绕“说什么”、“怎么说”及异常处理三大核心问题,详细阐述了二进制与结构体数据类型定义、TCP/UDP双通道传输机制、通用报文格式以及典型交互流程(如GLOSA车速引导),并分享了时间同步、坐标系定义等关键实战经验与避坑指南,为构建高效、可靠、安全的车云“神经系统”提供专业指导。

alice7model的博客 121

ELF文件和BIN文件

摘自:http://blog.chinaunix.net/uid-24148050-id-362928.html 文件的内容: 1. BIN文件是 raw binary 文件,这种文件只包含机器码。 2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。 所以ELF文件的体积比对应的BIN文件要大。 文件的执行: 1. 执行raw

向往大海专栏 1364

机房电脑的“还原”秘密:如何应对重启即清零的困境

机房电脑重启后自动还原是常见的现象,这主要依靠硬件还原卡或软件还原系统(如冰点还原)实现。这类技术会定期将系统盘恢复初始状态,但通常不保护非系统盘。要高效使用公共电脑,建议:1)将个人文件存储在D/E盘;2)使用绿色便携软件;3)必要时可尝试通过热键临时关闭还原功能;4)养成云端备份习惯。掌握这些技巧既能遵守机房规定,又能保证学习资料安全,培养良好的数字资产管理能力。

一位主要以学校学生信息技术,社会工作生活讲解科普拓展的博主 1452

深入了解torch框架

大国的游戏,政府支持到位,是未来;AI : Artificial Intelligence,旨在研究、开发能够模拟、延伸和扩展人类智能的理论、方法、技术及应用系统,是一种拥有自主学习和推理能力的技术。它模仿人类大脑某些功能,包括感知、学习、理解、决策和问题解决。AI本质​ NLP(说话,听)、CV(眼睛)、自动驾驶、机器人(肢体动作)、大模型三要素:数据、网络、算力① 神经网络:找到合适的数学公式;② 训练:用已有数据训练网络,目标是求最优解;③ 推理:用模型预测新样本;PyTorch,简称Torch

qq_74732076的博客 1136

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

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

weixin_39996134的博客 403

别再只会用555了!手把手教你用运放和RC电路搭一个50Hz正弦波信号源(附Multisim仿真文件)

本文详细介绍了如何使用运放LM358和RC电路搭建一个精准的50Hz正弦波信号源,涵盖文氏电桥核心原理、单电源供电解决方案、Multisim仿真及实物调试技巧。通过实战指南和优化建议,帮助电子爱好者快速掌握低频信号生成技术,适用于各种测试和校准场景。

weixin_34116482的博客 364

CodeWarrior IDE使用Tips-使用burner将elf文件转换生成HEX和BIN文件的方法和步骤详解

实际上在CodeWarrior IDE中集成的burner工具(针对S08、S12(x)以及MagniV S12Z系列),其功能十分强大,不但可以将CodeWarrior IDE自动编译生成的.abs文件,并提取其中的编程数据将其转换为S19/BIN/HEX等不同格式输出为变成文件,还可以将任何合法的elf文件识别并完成同样的功能;Tips:这里是转换输出为HEX文件,所以输出文件名为output.hex,若要输出bin文件,则将其后缀修改为.bin,同时选择对于的文件类型即可。

xqhrs232的专栏 1733

别再死记硬背Modbus报文了!用Python+Modbus Poll手把手教你调试工业设备

本文详细介绍了如何利用Python和Modbus Poll工具高效调试工业设备通信。通过实战案例和代码示例,帮助读者快速掌握Modbus通信协议的核心配置、数据监控技巧及Python自动化脚本编写,解决工业设备调试中的常见问题,提升工作效率。

weixin_42520780的博客 344

PADS VX2.7学习记录06-PADS Router软件功能操作

PADS VX2.7学习记录06-PADS Router软件功能操作

qq_31444421的博客 7860

keil转换c为汇编语言,如何用Keil生成bin、汇编、C与汇编混合文件?

1、话题引入在使用Keil集成开发环境中大伙使用频率高的文件大概就是.hex吧,如果考虑内存布局等会使用到.map文件,如果遇到了疑难bug还会在仿真过程中看一看汇编窗口栏。然而bin文件作为嵌入式最为直接的固件,同样也是我们非常需要获得的文件,比如进行远程升级等等,一方面可以直接通过其他hex转bin工具转化,另一方面通过集成开发环境自带的功能进行转化即可。同样有时候我们不想通过debug状态下...

weixin_42197129的博客 4469

基于PINN求解裂纹扩展问题的优化开发

本文提出了一种基于物理信息神经网络(PINN)的裂纹扩展问题求解方法。通过将线弹性断裂力学控制方程和裂纹尖端场特性嵌入神经网络损失函数,PINN有效克服了传统有限元法在处理裂纹扩展时面临的网格重构困难、计算成本高等问题。文章详细介绍了PINN网络架构设计、裂纹尖端奇异场处理、损失函数构造以及优化策略等关键技术。数值实验表明,该方法能准确预测裂纹扩展路径和应力强度因子,且在处理复杂几何和动态扩展问题时展现出显著优势。相比传统方法,PINN具有无网格、并行计算友好等特点,为断裂力学问题提供了新的求解范式。

huanghm88的专栏 152

MDK 的编译过程及文件类型全解

出处:MDK 的编译过程及文件类型全解 MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是很有帮助的,在有arm9开发的基础上,下面的东西很容易理解,如果看不懂,证明你还没有入门。下面的是从world复制过来的,格式和博客不太兼容,所有开始以字母q的,是world中的 □ 字符)...

9527的博客 2016

Android 系统低内存lowmemorykiller关于阈值修改 minfreeAbsKbytes优化

在系统rom定制化开发中,在对于运行内存ram 1G和2G的设备中,对于内存使用高峰期时,minfreeAbsKbytes优化很关键 调整合理的minfree,让内存合理的使用很关键,接下来分析相关功能的实现

安卓兼职framework和app工程师的博客 524

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

交叉编译工具的使用

一、概念 什么是交叉编译? 交叉编译就是编译和执行是不在同一个地方的。 在这里就是指我在我的电脑的Uboot上编译文件。 但是我在开发板上执行文件。 交叉编译工具的作用就是 我在电脑上如果直接用系统自带的编译器的话那么编译出来的可执行文件肯定是x86架构下的, 你x86下的执行文件在我arm架构下肯定就执行不了啊,肯定就不能用啊。架构都不一样(EG:我写了一个‘+’在x86架构下被编译成的机器码是1001,如果放到arm架构下运行,1001在我这里的意思就变成了减。NONON0!!) 这就是交叉编译的概念所

wzf_Cql 911

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

第 43 章 MDK 的编译过程及文件类型全解

(1)编译,MDK 软件使用的编译器是 armcc 和 armasm,它们根据每个 c/c++ 和汇编源文件编译成对应的以“.o”为后缀名的对象文件 (Object Code,也称目标文件),其内容主要是从源文件编译得到的机器码,包含了代码、数据以及调试使用的信息;(2)链接,链接器 armlink 把各个.o 文件及库文件链接成一个映像文件“.axf”或“.elf”;(3)格式转换。

C_say_easy_to_me的博客 5255

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

GCC编译生成bin

#连接 arm-linux-ld -Tboot.lds -o a.out $^ #将elf文件转换为bin arm-linux-objcopy -O binary -S a.out a.bin #boot.lds文件 SECTIONS { . = 0x30000000; .text : { *(.text) } ...

weixin_30371875的博客 497
上一篇: 位置无关代码(PIC)的思考
下一篇: qemu中ELF文件的加载
刘军卫
博客等级 码龄19年 1143粉丝 245原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值