嵌入式bin文件和elf文件重点

电子说

1.2w人已加入

描述

文件格式

(1)BIN文件:binary文件,即二进制文件。

(2)HEX文件:hex的全称是Intel HEX,此类文件通常用于传输将被存于ROM或者EPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。大多数EPROM编程器或模拟器使用Intel HEX文件。 HEX文件记录由对应机器语言码和/或常量数据的十六进制编码数字组成。

(3)ELF文件: 是Linux的主要可执行文件格式。 ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。

(4)bin文件和elf文件重点摘要:

执行raw binary很简单,只需要将程序加载到其起始地址,就可以执行; 执行ELF程序则需要一个ELF Loader。 现在知道了吧,uboot和Linux kernel启动的时候是没有ELF Loader的,所以烧在flash上的文件只能是raw binary格式的,即镜像文件image。

a)通过gcc编译出来的是elf文件

b)通过objcpy可以把elf文件转换为bin文件

(5)LDS文件:它定义了整个程序编译之后的连接过程,决定了一个可执行程序的各个段的存储位置。指定连接文件的存储地址、运行地址,存储地址和运行地址可以相同也可以不同。转自:https://wenku.baidu.com/view/9a8beb125f0e7cd18425369a.html

(6)map文件:map文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,是整个程序工程信息的静态文本,通常由linker生成。 map文件保存整个工程的静态文本信息,里面有所有函数的入口地址。

通过查看map文件,我们可以找到代码段(.text),全局未初始化区(.bss),数据段(.data)。

map文件的作用是,我们可以根据程序产生错误地址在map文件中找到相应的函数、变量地址。

(7)symbol文件:目标文件的值、类型、名字,例如: 00000024 T cleanup_before_linux

00000024是以16进制显示的其值,T为类型表示此函数位于代码区,而cleanup_before_linux是其名字。可以看出,上面显示的cleanup_before_linux这个symbol的值实际上是该函数在text section中的偏移。但是,每个符号的值的具体含义依其类型而异(类型见原文)。当然,对于每个符号的值,其类型、其值以及它们所属的section是密切相关的。

(8)Code:代表执行的代码,程序中所有的函数都位于此处。

RO-data: 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处。

RW-data:代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。

ZI-data:代表未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处。

一、下载到FLASH中的数据大小是:(Code + RO Data + RW Data)这个数据关系到占用了多少单片机的FLASH,关系到是否可以再添加程序。比如你的单片机FLASH是8K,编译程序后,发现程序已经7K了,但是工程还需要写很多程序,那就可以考虑换个FLASH大点的单片机了。

二、程序运行是要在RAM中运行的大小是:(RW Data + ZI Data) 单片机的两个重要参数,一个是上面的FLASH大小,一个是RAM大小。看了第一条,就知道这条的重要性。

刚入门的,看程序的大小,会看HEX文件在WINDOWS中的占用大小来确定占用FLASH的大小,是不对的。

这个HEX文件在电脑上的大小是4.46KB,但是它只会占用单片机FLSAH的1.57KB,如下图所示:

二进制

(提示:在你生成的工程中的Listings文件夹里面,有一个.map后缀的文件,拉到最后面,就有算好的大小)

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分