嵌入式bin文件和elf文件重点
单片机各种烧写文件格式简介

各种烧写文件格式简介-ELF Hex Bin一,ELFExecutable and linking format(ELF)文件是x86 Linux系统下的一种常用目标文件(object file)格式,有三种主要类型:Executable and linking format(ELF)文件是x86 Linux系统下的一种常用目标文件(object file)格式,有三种主要类型:(1)适于连接的可重定位文件(relocatable file),可与其它目标文件一起创建可执行文件和共享目标文件。
(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载的内存执行。
(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。
ELF文件格式比较复杂。
二,hex什么是Intel HEX格式?Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输存储到ROM.EPROM,大多数编程器和模拟器使用Intel HEX文件.记录格式一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式.:llaaaatt[dd...]cc每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述.:冒号是每一条Intel HEX记录的开始ll 是这条记录的长度域,他表示数据(dd)的字节数目.aaaa 是地址域,他表示数据的起始地址<如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址>tt 这个域表示这条HEX记录的类型,他有可能是下面这几种类型00 ----数据记录01 ----文件结束记录02 ----扩展段地址记录04 ----扩展线性地址记录dd 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以查看ll域的说明cc 是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对<不包括本效验字和冒号> 所表示的十六进制数字<一对字母表示一个十六进制数,这样的一个十六进制数为一个字节>都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节cc.<例如::0300000002005E9Dcc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x9C=0x9DC语言描述:UCHAR cc;cc=(UCHAR)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5E);cc++;>数据记录Intel HEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束<回车为0x0d换行为0x0a>比如下面的一条数据记录:10246200464C5549442050524F46494C4500464C3310 是此行记录数据的字节数目2462 是数据在内存<将要烧写的eprom地址>中的起始地址00 是记录类型00(是一个数据记录)464C 到464C 是数据33 是此行记录的效验和扩展线性地址记录(HEX386)扩展线性地址记录也可称为32位地址记录和HEX386记录,这个纪录包含高16(16-31位)位数据地址,这种扩展的线性记录总是有两个字节数据,像下面这样::02000004FFFFFC02 是记录的数据字节数目0000 是地址域这在扩展地址记录中总是000004 是记录类型04(扩展地址记录)FFFF 是高16位地址FC 是记录效验和,计算方法如下:01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,直到读到下一个扩展线性记录.绝对内存地址= 数据记录中的地址+ 移位后的扩展线性地址下面举例说明这个过程从数据记录的地址域得到地址2462从扩展线性地址记录的地址域得到地址FFFF绝对内存地址FFFF2462扩展段地址记录(HEX86)扩展段地址记录也被称为HEX86记录, 包含4-19位的数据地址段,这个扩展段地址记录总是有两字节数据,如下::020*********EA02 是记录中的数据字节数目0000 是地址域,在扩展段地址记录中,这个域总是000002 是记录类型02(扩展段地址的标示)1200 是该段的地址EA 是效验和计算如下:01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).当扩展段地址记录被读后,扩展段地址将被存储并应用到以后从Intel HEX文件读出的记录,这个段地址一直有效直到读到下一个扩展段地址记录绝对内存地址= 数据记录中的地址+ 移位后的扩展段地址数据记录中的地址域移位后扩展段地址记录中的地址域下面举例说明这个过程从数据记录的地址域得到地址2 4 6 2从扩展段地址记录的地址域得到地址1 2 0 0绝对内存地址0 0 0 1 4 4 6 2文件结束记录(EOF)一个Intel HEX文件必须有一个文件结束记录,这个记录的类型域必须是01,一个EOF记录总是这样::00000001FF00是记录中数据字节的数目0000这个地址对于EOF记录来说无任何意义01记录类型是01(文件结束记录标示)FF是效验和计算如下01h + NOT(00h + 00h + 00h + 01h).========================总结形如:BBAAAATTHHHH...HHHHCCBB: ByteAAAA:数据记录的开始地址,高位在前,地位在后因为这个格式只支持8bits,地址被倍乘所以,为了得到实际的PIC的地址,需要将地址除以2TT: Type00 数据记录01 记录结束04 扩展地址记录(表示32位地址的前缀,当然这种只能在INHX32)HHHH:一个字(Word)的数据记录,高Byte在前,低Byte在后TT之后,总共有BB/2 个字的数据CC: 一个Byte的CheckSum因为PIC16F873A只有4K的程序空间所以,不会有TT=04的Linear Address Record三,binbin文件就是直接的二进制文件,内部没有地址标记。
嵌入式固件bin文件构建方法

嵌入式固件bin文件构建方法嵌入式固件是指在硬件设备中烧录的软件程序,它负责控制硬件设备的各个功能和特性。
bin文件是嵌入式固件的一种常见格式,它是二进制文件,包含了机器语言指令和数据。
构建嵌入式固件的过程包括编译、链接和烧录三个主要步骤。
本文将详细介绍嵌入式固件bin文件的构建方法,帮助读者理解并掌握该过程。
一、编写嵌入式固件代码嵌入式固件的编写通常使用C语言进行,开发者需要根据硬件设备的功能和需求编写相应的代码。
编写过程中需要注意代码的可读性、可维护性和可移植性,以便后续的调试和修改。
二、选择合适的编译器在编译嵌入式固件代码之前,需要选择合适的编译器。
常见的嵌入式编译器有GCC、Keil、IAR等,选择适合自己的编译器可以提高代码的效率和可靠性。
三、配置编译器选项编译器选项是编译器的一些参数设置,用于指定编译器的行为。
在编译嵌入式固件代码之前,需要根据硬件设备的特性和要求进行编译器选项的配置。
常见的编译器选项包括优化级别、编译目标、调试信息等。
四、进行编译编译是将源代码转换成可执行文件的过程。
在编译嵌入式固件代码时,编译器会将源代码翻译成汇编语言或机器语言,并生成目标文件。
编译过程中需要检查代码的语法和语义错误,确保代码的正确性。
五、进行链接链接是将多个目标文件合并成一个可执行文件的过程。
在链接嵌入式固件代码时,链接器会将各个目标文件中的符号和地址进行解析和重定位,生成最终的可执行文件。
链接过程中需要处理符号冲突和地址重定位等问题。
六、生成bin文件生成bin文件是将可执行文件转换成二进制文件的过程。
在生成bin文件时,通常需要使用特定的工具或命令,将可执行文件中的机器语言指令和数据以二进制形式保存到bin文件中。
生成bin文件的过程中需要注意文件的格式和结构,确保生成的bin文件能够正确烧录到硬件设备中。
七、烧录bin文件烧录是将bin文件写入到硬件设备中的过程。
烧录过程通常需要使用专用的烧录工具或者通过调试接口进行操作。
嵌入式固件bin文件构建方法

嵌入式固件bin文件构建方法嵌入式固件是一种被嵌入在硬件设备中的软件,常用于控制设备的操作。
在嵌入式系统开发中,bin文件是常见的固件文件格式,用于将软件程序烧录到嵌入式设备的非易失性存储器中。
本文将介绍嵌入式固件bin文件的构建方法。
1. 确定目标硬件平台和开发环境在构建嵌入式固件之前,首先需要确定目标硬件平台和开发环境。
不同的硬件平台和开发环境可能有不同的编译工具链和构建方法。
常见的硬件平台有ARM、MIPS等,常见的开发环境有Keil、IAR等。
2. 配置编译工具链根据目标硬件平台和开发环境,配置相应的编译工具链。
编译工具链包括编译器、链接器等工具,用于将源代码编译成可执行的二进制文件。
根据不同的编译工具链,配置相应的编译选项和链接选项。
3. 编写嵌入式固件代码根据设备功能需求,编写嵌入式固件的代码。
嵌入式固件的代码通常使用C/C++语言编写,可以包括设备驱动程序、操作系统内核、应用程序等。
4. 编译源代码使用配置好的编译工具链,将源代码编译成目标平台可执行的二进制文件。
编译过程中,编译器会将源代码转换成汇编代码,然后再将汇编代码转换成机器码。
编译过程中会检查代码的语法错误和类型错误,并生成相应的目标文件。
5. 链接目标文件编译完成后,使用链接器将目标文件链接成可执行的二进制文件。
链接过程中,链接器会解析目标文件中的符号引用,并将它们与其他目标文件中的符号定义进行关联。
链接器还会处理重定位信息,将目标文件中的相对地址转换成绝对地址。
6. 生成bin文件链接完成后,可以通过工具将可执行文件转换成bin文件。
bin文件是一种纯二进制格式的文件,不包含任何调试信息和符号表。
bin 文件可以直接烧录到嵌入式设备的非易失性存储器中。
7. 烧录bin文件到嵌入式设备将生成的bin文件通过烧录器烧录到嵌入式设备的非易失性存储器中。
烧录过程中需要注意设备的连接方式和烧录工具的设置。
总结:本文介绍了嵌入式固件bin文件的构建方法,包括确定目标硬件平台和开发环境、配置编译工具链、编写嵌入式固件代码、编译源代码、链接目标文件、生成bin文件和烧录bin文件到嵌入式设备。
计算机三级嵌入式要点及试题总结

要点嵌入式系统及三要素定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
简单定义:嵌入到对象体系中的专用计算机系统。
三要素:嵌入式系统的三个基本要素是嵌入性、专用性与计算机系统。
(1)嵌入性是把软件嵌入到Flash存储器中,(2)专用性是指针对某个具体应用领域和场合,量体裁衣式的定制适用该场合的专用系统,(3)计算机系统是指必须具有计算机系统的组成,核心是计算机系统。
三个要素决定了嵌入式系统是嵌入到对象体系中的一种专用的计算机系统。
嵌入式系统設計与开发原则与步驟1.設計与开发原則既然嵌入式系统是嵌入到对象体系中的专用的计算机系统,因此嵌入式系统设计的基本原则:物尽其用。
这一原则表明,嵌入式系统的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,以最小成本实现更高的性能,同时尽可能采用高效率的设计算法,以提高系统的整体性能,换句话说同,“物尽其用”就是“够用就好”,以最高性价比来设计嵌入式应用系统。
2、设计与开发步骤嵌入式系统的设计步骤包括需求分析、体系结构设计、硬件设计,软件设计,执行机构设计、系统集成和系统测试。
各个阶段之间往往要求不断的修改,直至完成最终设计目标。
ARM存储模式关于存储模式:大端模式和小端模式,靠GPE8(ENDIAN)高低电平决定,高电平大端模式,低电平小端模式。
让GPE8工作于功能1模式控制。
掌握大小端模式存储结构。
已知一个32位的一个字0x87654321,存放在内存0x12000004~0x12000007中,指出对于大端模式和小端模式下,字节0x65存放的地址。
ARM指令流水线关于指令流水线:ARM采用指令流水线技术。
不同内核指令流水线的级数不同。
采用指令流水线的作用是提高指令执行效率。
有3、5、6、7、8级不等。
对于一个具有1条8级指令流水线的ARM处理器,假设每1级所需要的时间为1ns,求这种ARM处理器执行4000条指令最快所需要的时间。
ELF文件基础

ELF⽂件基础(Executable Linkable Format, )是Linux参考COFF(Common Object File Format)规范⽽定义的可执⾏⽂件格式。
可执⾏⽂件、共享⽬标⽂件(*.so)、⽬标中间⽂件(⼜称可重定位⽂件,*.o)、核⼼转储⽂件(Core Dump File)都是ELF⽂件。
按位数可分为:elf32和elf64;⽀持cpu架构有:aarch64(即:arm64)、arm等。
ELF可能按照不同的字节序(Byte Order)来存储。
例如:elf32-big arm是⼤端(Big-endian)存储;elf64-little aarch64是⼩端(Little-endian)存储。
与COFF⼀样,ELF也是基于段(Segment,有时也被叫节Section)的结构。
其⽂件结构如下:ELF头(ELF Header):ELF魔数、⽂件机器字节长度、数据存储⽅式(⼤⼩端)、版本、运⾏平台、ABI版本、ELF重定位类型、硬件平台及版本、⼊⼝地址、程序头⼊⼝和长度、段表的位置和长度、段的数量。
段表(Section header table):描述了ELF各个段的基本信息,如:每个段的段名、段的长度、在⽂件中偏移、读写权限及段的其他属性。
编译器、链接器和装载器都是依靠段表来定位和访问各个段的属性的。
段的类型:常量值含义SHT_NULL0⽆效段SHT_PROGBITS1程序段、代码段、数据段都是这种类型SHT_SYMTAB2该段的内容为符号表SHT_STRTAB3该段的内容为字符串表SHT_RELA4重定位表,包含重定位信息SHT_HASH5符号表的哈希表SHT_DYNAMIC6动态链接信息SHT_NOTE7提⽰性信息SHT_NOBITS8表⽰该段在⽂件中没有内容。
如:bss段SHT_REL9该段包含了重定位信息SHT_SHLIB10保留SHT_DNYSYM11动态链接的符号表段的标志位表⽰该段在进程虚拟空间中的属性。
ELF文件详解—初步认识

ELF⽂件详解—初步认识⼀、引⾔在讲解ELF⽂件格式之前,我们来回顾⼀下,⼀个⽤C语⾔编写的⾼级语⾔程序是从编写到打包、再到编译执⾏的基本过程,我们知道在CPU上执⾏的是低级别的机器语⾔,从⾼级语⾔到低级别的机器语⾔肯定是要经过翻译过程,这个过程⼤体的过程如下图所⽰:在Unix系统中,从源⽂件到可执⾏⽬标⽂件是由编译驱动程序完成的,如⼤名⿍⿍的gcc,翻译过程包括图中的是个阶段;Ø 预处理阶段预处理器(cpp)根据以字符#开头的命令修给原始的C程序,结果得到另⼀个C程序,通常以.i作为⽂件扩展名。
主要是进⾏⽂本替换、宏展开、删除注释这类简单⼯作。
对应的命令:linux> gcc -E hello.c hello.iØ 编译阶段编译器将⽂本⽂件hello.i翻译成hello.s,包含相应的汇编语⾔程序对应的命令:linux> gcc -S hello.c hello.sØ 汇编阶段将.s⽂件翻译成机器语⾔指令,把这些指令打包成⼀种叫做可重定位⽬标程序的格式,并将结果保存在⽬标⽂件.o中(把汇编语⾔翻译成机器语⾔的过程)。
把⼀个源程序翻译成⽬标程序的⼯作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码⽣成;代码优化;⽬标代码⽣成。
主要是进⾏词法分析和语法分析,⼜称为源程序分析,分析过程中发现有语法错误,给出提⽰信息。
对应的命令:linux> gcc -c hello.c hello.oØ 链接阶段此时hello程序调⽤了printf函数。
printf函数存在于⼀个名为printf.o的单独的预编译⽬标⽂件中。
链接器(ld)就负责处理把这个⽂件并⼊到hello.o程序中,结果得到hello⽂件,⼀个可执⾏⽂件。
最后可执⾏⽂件加载到储存器后由系统负责执⾏, 函数库⼀般分为静态库和动态库两种。
静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运⾏时也就不再需要库⽂件了。
ELF与BIN文件区别

Gcc 编译出来的是ELF文件。
通常gcc –o test test.c,生成的test文件就是ELF格式的,在linuxshell下输入 ./test就可以执行。
Bin 文件是经过压缩的可执行文件,去掉ELF格式的东西。
是直接的内存映像的表示。
在系统没有加载操作系统的时候可以执行。
elf(executable and link format)文件里面包含了符号表,汇编等。
BIN文件是将elf文件中的代码段,数据段,还有一些自定义的段抽取出来做成的一个内存的镜像。
在Embedded中,如果上电开始运行,没有OS系统,如果将ELF格式的文件烧写进去,包含一些ELF格式的东西,arm运行碰到这些指令,就会导致失败,如果用arm-softfloat-Linux-gnu-objcopy生成纯粹的汇编 bin文件,程序就可以一步一步运行。
两种文件都可以运行机器最终只认BIN,之所以有ELF格式是在有操作系统时,操作系统会根据ELF解析出代码、数据等等,最终仍是以BIN运行。
由于elf文件的信息比较全,所以可以用来以单步跟踪的方式运行。
关键是看loader。
嵌入式开发的时候,我们的编译一个*.S文件,并最终生成bin文件,编译命令大致如下:CC=arm-softfloat-linux-gnu-gccLD=arm-softfloat-linux-gnu-ldOBJCOPY=arm-softfloat-linux-gnu-objcopy$(CC) -g$(CFLAG) -c boot.S #先将boot.S文件生成boot.o$(LD) -g-Bstatic -T$(LDFILE) -Ttext 0x12345600 boot.o --start-group -Map boot.map -oboot.elf #再将boot.o生成boot.elf,boot.elf通常就是可执行文件,类似于gcc-o test test.c 中的test文件,在LinuxShell下输入./test就可以执行。
elf开头的二进制文件

elf开头的二进制文件摘要:1.文件格式简介- 什么是elf文件- elf文件的特点和应用场景2.elf文件的组成- elf文件的头部信息- elf文件的主体部分3.elf文件的解析- elf文件的解析流程- elf文件解析的工具和方法4.elf文件的修改与编译- elf文件的修改方法- elf文件的编译流程5.elf文件的应用案例- elf文件在嵌入式系统中的应用- elf文件在软件开发中的实际应用正文:elf开头的二进制文件,通常是指采用ELF(Executable and Linkable Format)格式的可执行文件。
ELF是一种通用的可执行文件格式,广泛应用于各种操作系统和处理器架构。
本文将详细介绍elf文件的基本概念、组成、解析方法以及在实际应用中的相关案例。
ELF文件是一种用于存储程序代码和数据的目标文件格式。
它具有可移植性、高效性和可扩展性等特点,适用于多种不同的处理器架构。
ELF文件主要由三部分组成:ELF头部(ELF Header)、程序头部表(Program Header Table)和节(Section)。
1.ELF头部(ELF Header)ELF头部是ELF文件的第一部分,它包含了关于ELF文件的基本信息,如文件类型、入口地址、程序头部表的位置等。
ELF头部使用ELF64或ELF32数据结构表示,分别对应64位和32位处理器架构。
2.程序头部表(Program Header Table)程序头部表是ELF文件的主体部分之一,它包含了一系列程序头部,每个程序头部描述了一个程序段(如代码段、数据段、符号表等)的信息。
程序头部表的第一个程序头部总是指向ELF文件的主体部分,即程序代码和数据。
3.节(Section)ELF文件的第三部分是节,它包含了实际程序代码和数据。
每个节都有一个唯一的名称,用于描述节的内容和用途。
常见的节类型包括:代码段(.text)、数据段(.data)、符号表(.symtab)等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式bin文件和elf文件重点
文件格式
(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/view/9a8beb125f0e7cd18425369al
(6)map文件:map文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,是整个程序工程信息的静态文本,通常由linker生成。
map文件保存整个工程的静态文本信息,里面有所有函数的入口地址。
通过查看map文件,我们可以找到代码段(.text),全局未初始化区(.bss),数据段(.data)。
map文件的作用是,我们可以根据程序产生错误地址在map文件中找到相应的函数、变量地址。
(7)symbol文件:目标文件的值、类型、名字,例如:00000024 T cleanup_before_linux。