嵌入式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文件是嵌入式固件的一种常见格式,它是二进制文件,包含了机器语言指令和数据。

构建嵌入式固件的过程包括编译、链接和烧录三个主要步骤。

本文将详细介绍嵌入式固件bin文件的构建方法,帮助读者理解并掌握该过程。

一、编写嵌入式固件代码嵌入式固件的编写通常使用C语言进行,开发者需要根据硬件设备的功能和需求编写相应的代码。

编写过程中需要注意代码的可读性、可维护性和可移植性,以便后续的调试和修改。

二、选择合适的编译器在编译嵌入式固件代码之前,需要选择合适的编译器。

常见的嵌入式编译器有GCC、Keil、IAR等,选择适合自己的编译器可以提高代码的效率和可靠性。

三、配置编译器选项编译器选项是编译器的一些参数设置,用于指定编译器的行为。

在编译嵌入式固件代码之前,需要根据硬件设备的特性和要求进行编译器选项的配置。

常见的编译器选项包括优化级别、编译目标、调试信息等。

四、进行编译编译是将源代码转换成可执行文件的过程。

在编译嵌入式固件代码时,编译器会将源代码翻译成汇编语言或机器语言,并生成目标文件。

编译过程中需要检查代码的语法和语义错误,确保代码的正确性。

五、进行链接链接是将多个目标文件合并成一个可执行文件的过程。

在链接嵌入式固件代码时,链接器会将各个目标文件中的符号和地址进行解析和重定位,生成最终的可执行文件。

链接过程中需要处理符号冲突和地址重定位等问题。

六、生成bin文件生成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文件基础

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⽂件详解—初步认识⼀、引⾔在讲解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文件区别

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开头的二进制文件

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)等。

ELF文件格式分析

ELF文件格式分析

摘要
嵌入式操作系统应用领域广,硬件环境复杂多样,降低开发成本、缩短开发周 期、提高产品质量是工业界和学术界共同关注的问题。借鉴软件复用的思想, 采用基于构件的软件开发思路来开发嵌入式操作系统是一条可行的途径。本文 是作者在探索系统软件构件的复用技术的过程中生成的技术笔记,重点分析了 UNIX 类操作系统中普遍采用的目标文件格式 ELF(Executable and Linkable 文首先介绍 ELF 文件格式规范,然后结合一个简单的 C 语言程序,分析编 译、链接后生成的可重定位、可执行格式实例。
3.2 目标文件格式........................................................................................................................................ 3 3.3 ELF HEADER部分 .................................................................................................................................. 3 3.4 节区(SECTIONS) ................................................................................................................................ 6
3 ELF文件格式 ..................................................................................................................... 2

二进制基础 elf文件结构

二进制基础 elf文件结构

二进制基础 elf文件结构ELF文件是一种常见的可执行文件格式,用于在计算机系统中存储和运行可执行程序。

它是以二进制形式存储的,具有特定的结构和组织方式。

ELF文件由多个段(Section)组成,每个段都有特定的功能和用途。

其中,最重要的段是代码段(text section)和数据段(data section)。

代码段包含可执行程序的机器指令,而数据段包含程序运行所需的数据。

除了代码段和数据段,ELF文件还包含其他一些重要的段,如符号表段和重定位表段。

符号表段记录了程序中定义和引用的符号信息,用于链接和调试程序。

重定位表段则记录了需要进行地址重定位的位置和信息。

ELF文件还包含了一些元数据,如文件头(File Header)和程序头(Program Header)。

文件头包含了文件的基本信息,如文件类型、目标体系结构和入口地址等。

程序头则描述了ELF文件中各个段的位置和大小等信息。

在计算机系统中,使用ELF文件格式的可执行程序可以直接加载到内存中运行。

当操作系统加载一个ELF文件时,它会解析文件头和程序头,将各个段加载到内存中的合适位置。

然后,操作系统将控制权转交给程序的入口地址,从而开始执行程序。

ELF文件的结构和组织方式使得它具有很好的可扩展性和可移植性。

不同的编程语言和编译器都可以生成符合ELF文件格式的可执行程序,从而实现跨平台的兼容性。

ELF文件是一种以二进制形式存储的可执行文件格式,具有特定的结构和组织方式。

通过解析ELF文件的各个段和元数据,操作系统可以加载和运行程序。

ELF文件的设计使得它具有很好的可扩展性和可移植性,成为计算机系统中常见的可执行文件格式之一。

elf2bin用法

elf2bin用法

elf2bin用法全文共四篇示例,供读者参考第一篇示例:elf2bin是一个常用的工具,用于将Elf格式的可执行文件转换为二进制文件。

Elf格式是一种可执行和可重定位文件格式,广泛用于Linux系统。

elf2bin工具通常是作为交叉编译工具链的一部分,用于开发嵌入式系统或者将程序移植到其他平台。

因为在嵌入式系统中,内存资源通常是有限的,使用二进制文件可以减小程序的内存占用,提高系统的性能。

下面来看一下elf2bin工具的使用方法:1. 安装elf2bin工具在Linux系统中,可以通过包管理工具安装elf2bin工具。

通常是通过以下命令来安装:```shellsudo apt-get install elf2bin```安装完成后,就可以开始使用elf2bin工具了。

假设我们有一个名为hello的Elf格式的可执行文件,现在需要将它转换为二进制文件。

可以通过以下命令来实现:这个命令会将hello文件转换为hello.bin文件,生成的hello.bin 文件就是一个二进制文件,可以直接在其他系统上运行。

如果对elf2bin工具还有其他使用问题,可以通过以下命令查看elf2bin工具的帮助信息:这样就可以看到elf2bin工具的更详细的用法说明。

elf2bin工具是一个非常实用的工具,可以帮助开发者将Elf格式的可执行文件转换为二进制文件,减小文件大小,提高程序运行效率。

希望本文对您有所帮助。

第二篇示例:ELF2BIN是一个命令行工具,用于将ELF(Executable and Linkable Format)可执行文件转换为二进制文件。

在嵌入式系统开发中,经常需要将可执行文件转换为二进制文件以便直接下载到目标设备中运行。

本文将介绍ELF2BIN的用法及相关注意事项。

一、ELF2BIN的安装在大多数Linux发行版中,ELF2BIN都可以通过包管理工具直接安装。

比如Debian/Ubuntu系可以使用以下命令安装:sudo apt-get install elf2bin在其他发行版中,可以从源码进行编译安装。

BOOT阅读笔记

BOOT阅读笔记
1.我们为什么需要relocate ? 经济方面,(nandflash和norflash 每兆价格相差悬殊),把boot代码放在norflash里面(为什么不放在nandflash里面,因为nandflash读需要驱动支持,norflash可以直接访问),boot通常很小,只需要占用几十k的空间,所以只需要很小的norflash芯片,这样很便宜,而把应用程序通常很大,所以用价格低廉nandflash来储存,实际应用,通过执行boot程序,把nandflash里面代码和数据搬运到内存中来执行,这样比程序直接放在norflash里执行,可以.另外还有运行速度方面的差别,程序在norflash里执行的速度远远小于在sdram中执行的速度,为了追求更高的速度,也需要relocate,让程序在sdram里面执行 .
和boot紧密相关的个人觉得就是一下几点.
1.remap.
remap比较简单,和MMU的功能可以看做是等价的,只是一般remap地址估定为0x0 ,网上有个帖子叫<<ARM remap与重定位摘抄>>专门讲了它对remap的理解,对remap的作用是这样讲的: 当ARM处理器上电或者Reset之后,处理器从0x0取指。因此,必须保证系统上电时,0x0处有指令可以执行。所以,上电的时候,0x0地址处必定是ROM或者Flash(NOR)。 但是,为了加快启动的速度,也方便可以更改异常向量表,加快中断响应速度,往往把异常向量表映射到更快、更宽(32bit/16bit)的RAM中。但是异常向量表的开始地址是由ARM架构决定的,必须位于0x0处,因此,必须把RAM映射到0x0。
3)如果上面两种机制都没有,那么Remap就不要做了。因为处理器实现决定了SDRAM对应的bank地址是不能改变的。如Samsung S3c2410.

ELF文件格式分析

ELF文件格式分析

ELF文件格式分析ELF(Executable and Linkable Format)是一种标准的文件格式,用于存储可执行代码,共享库和核心转储文件。

它在UNIX系统中广泛使用,包括Linux和BSD。

ELF文件格式的设计旨在提供一种灵活的格式,以满足各种不同类型的程序和软件库的需要。

在本文中,我们将对ELF文件格式进行详细分析,并深入探讨其结构和各个部分的作用。

1.ELF文件格式概述ELF文件格式由头部(Header)、节区表(Section Table)、节区(Section)、程序头部(Program Header)和数据部分组成,其中头部和节区表是ELF文件的核心组成部分,用于描述整个文件的结构和内容。

程序头部用于描述如何将节区加载到内存中以执行程序。

节区是文件内容的实际载体,包含各种类型的数据和代码。

2. ELF文件头部(Header)- e_ident:ELF头部的标识字段,用于标识文件的类型、字节序及其他相关信息。

- e_type:文件的类型,包括可执行文件、共享库、目标文件等。

- e_machine:目标机器的体系结构,如x86、ARM、MIPS等。

- e_version:文件的版本号。

- e_entry:程序的入口地址,即程序开始执行的地址。

- e_phoff:程序头部表的偏移量。

- e_shoff:节区头部表的偏移量。

- e_flags:标识文件特定属性的标志位。

- e_phentsize:每个程序头部表项的大小。

- e_phnum:程序头部表的项数。

- e_shentsize:每个节区头部表项的大小。

- e_shnum:节区头部表的项数。

头部的格式在不同的ELF文件版本中会有所不同,但一般遵循上述结构。

头部的内容是用于解析和执行ELF文件的关键信息,因此它是整个文件结构中最重要的部分之一3. 节区表(Section Table)节区表包含了描述各个节区的信息,包括名称、偏移量、大小、类型等。

hex、bin、elf、axf文件区别

hex、bin、elf、axf文件区别

hex,bin,axf,elf的区别一、HEX 和 BINHex文件,这里指的是Intel标准的十六进制文件,也就是机器代码的十六进制形式,并且是用一定文件格式的ASCII码来表示.具体格式介绍如下: Intel hex 文件格式Intel hex 文件常用来保存单片机或其他处理器的目标程序代码。

它保存物理程序存储区中的目标代码映象。

一般的编程器都支持这种格式。

Intel hex 文件全部由可打印的ASCII字符组成,如下例所示::2000000012014c75a800e4f508f509780a7a78e4f608dafcd283fcfded240af9a 7050dbd81:2000200000010ced2488ec34ff50edc283e4fcfded240af9e76d7013ed33e43c7 00d0dbd2a:2000400000010ced2488ec34ff50e50509e50970020508e50924a8e50834fd50a ee4f50874Intel hex 由一条或多条记录组成,每条记录都由一个冒号“:”打头,其格式如下::CCAAAARR...ZZ其中:CC本条记录中的数据字节数AAAA本条记录中的数据在存储区中的起始地址RR记录类型:00 数据记录 (data record)01 结束记录 (end record)02 段记录 (paragraph record)03 转移地址记录 (transfer address record)...数据域ZZ数据域校验和Intel hex文件记录中的数字都是16进制格式,两个16进制数字代表一个字节。

CC域是数据域中的实际字节数,地址、记录类型和校验和域没有计算在内。

校验和是取记录中从数据字节计数域(CC)到数据域(...)最后一个字节的所有字节总和的2的补码。

Bin文件是最纯粹的二进制机器代码,没有格式,或者说是"顺序格式"按assembly code顺序翻译成binary machine code.Bin是直接的内存映象的表示。

嵌入式必备知识

嵌入式必备知识

嵌入式系统开发必备知识学习嵌入式需要的条件:编程能力(C语言)内核框架的知识字符设备input子系统总线设备驱动模型platformI2C网卡驱动的框架framebuffer硬件的知识设备和CPU的连接方式1)GPIO2) 地址总线数据总线3)协议类总线中断号硬件的芯片手册CPU手册1 嵌入式系统:1)uCos-II–uC/OS-II是一种基于优先级的可抢先的硬实时内核。

应用广泛,专门为嵌入式设备设计,支持多种CPU,可运行在8位到64位的各种系统上。

–.51版本之后,就通过了美国FAA认证,可以运行在诸如航天器等对安全要求极为苛刻的系统之上(可用在生命攸关项目中)。

–商用要支付版权费,可以得到源代码。

2)Vxworks–vxworks 是这几种实时系统中性能最好的一个也是比较贵的,主要用于商业领域和科研领域。

飞到火星去的探测器上安装的就是这个系统。

实时性好。

3)Nuclues–实时性比较好。

对文件系统,网络协议栈的支持也比较不错,带的图形显示。

nuclues 内核很小。

4)Threadx–ThreadX是优秀的硬实时操作系统,具有规模小、实时性强、可靠性高、易于使用等特点。

–并且支持大量的处理器和SoC,包括ARM、PowerPC、SH 4、MIPS、ADI DSP、TI DPS、Nios II等,广泛应用于消费电子、汽车电子、工业自动化、网络解决方案、军事与航空航天等领域中–2005年7月4日,美国宇航局成功实施“深度撞击”号宇宙飞船对坦普尔1号彗星的准确撞击,此事件成为全球关注的焦点。

其中,“深度撞击”号宇宙飞船中关键的任务由著名的hreadX实时操作系统完成。

–2005年8月12日,美国宇航局发射的火星探测器MRO, 其关键任务仍由ThreadX实时操作系统担当。

5)freertos–FreeRTOS免费的开源实时操作系统,短小精悍。

6)eCos–ECOS由RedHat推出的小型实时系统(Real Time Operating System),最低编译核心可小至10K的级别,采用C++编写。

bin、hex、elf、axf文件的区别

bin、hex、elf、axf文件的区别

bin、hex、elf、axf⽂件的区别1、bin  Bin⽂件是最纯粹的⼆进制机器代码, 或者说是"顺序格式"。

按照assembly code顺序翻译成binary machine code,内部没有地址标记。

Bin是直接的内存映象表⽰,⼆进制⽂件⼤⼩即为⽂件所包含的数据的实际⼤⼩。

BIN⽂件就是直接的⼆进制⽂件,⼀般⽤编程器烧写时从00开始,⽽如果下载运⾏,则下载到编译时的地址即可。

可以直接在裸机上运⾏。

2.hexIntel hex ⽂件常⽤来保存单⽚机或其他处理器的⽬标程序代码。

它保存物理程序存储区中的⽬标代码映象。

⼀般的编程器都⽀持这种格式。

就是机器代码的⼗六进制形式,并且是⽤⼀定⽂件格式的ASCII码来表⽰。

HEX⽂件由记录(RECORD)组成。

在HEX⽂件⾥⾯,每⼀⾏代表⼀个记录。

每条记录都由⼀个冒号“:”打头,其格式如下: :BBAAAATTHHHH...HHHHCC BB:字节个数。

AAAA:数据记录的开始地址,⾼位在前,低位在后。

TT: Type 00数据记录,⽤来记录数据。

01记录结束,放在⽂件末尾,⽤来标识⽂件结束。

02⽤来标识扩展段地址的记录 04扩展地址记录(表⽰32位地址的前缀) HHHH:⼀个字(Word)的数据记录,⾼字节在前,低字节在后。

TT之后共有 BB/2 个字的数据。

CC: 占据⼀个Byte的CheckSum 举例分析: :020*********FA :10000400FF00A0E314209FE5001092E5011092E5A3 :00000001FF 分析如下: 第1条记录长度为0x02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。

数据为0000,校验和为FA。

从这个记录的长度和数据,我们可以计算出基地址为0X0000。

后⾯的数据记录都以此地址为基地址。

第2条记录长度为0x10(16),LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。

ELF文件格式

ELF文件格式

ELF⽂件格式ELF(executable and linkable format)可执⾏可链接格式,是⼀种⽤于⼆进制⽂件、可执⾏⽂件、⽬标代码、共享库和核⼼转储格式⽂件。

1.2.1ELF⽂件类型ELF主要分为3种⽂件类型:1、可重定位⽂件(relocatable file)后缀“.o” “.rel”:⽬标⽂件编译完成,尚未链接。

⼀般多个⽬标⽂件链接成⼀个可执⾏⽂件或共享⽬标⽂件也,也就是下⾯两种⽂件。

2、可执⾏⽂件(executable file)后缀“.exec”:linux中执⾏的程序。

2、共享⽬标⽂件(shared object file)后缀".dyn":也就是库⽂件。

⽤途1:和其他可重定位⽂件以及共享⽬标⽂件链接⽣成新的可重定位⽂件;⽤途2:动态链接时和可执⾏⽂件链接在⼀起运⾏。

还有⼀种ELF⽂件--核⼼转储⽂件(Core Dump file):程序异常终⽌后对地址空间的转储。

可以使⽤gdb读取⽂件查找异常原因。

1.2.2 ELF⽂件的结构⽬标⽂件既有链接阶段⼜有执⾏阶段,在两个阶段规定的⽂件格式有所不同。

如图1。

图1 在链接视⾓程序头表是可选,通过节(section)来划分;在运⾏视⾓节头表是可选,通过段(segment)来划分(段⼤都来⾃链接阶段的节);注意:除ELF Header位置固定外,其他部分位置、⼤⼩通过ELF Header的内容来确定。

节⼀般包含代码节(.text)、数据节(.data)、BSS节(.bss)。

代码节⽤于保存机器指令,数据节保存以初始化全局变量和局部静态变量,BSS节保存未初始化全局变量和局部静态变量。

将数据和指令分开存放有利于安全,设置代码节对进程只读、数据和BSS节可读写。

ELF ⽂件头(ELF Header) ELF⽂件头固定于程序的最开始,⽤于描述ELF⽂件的基本信息,例如⽂件类型、程序⼊⼝等;注意:⽂件头存在魔术字符(7f 45 4c 46),可通过搜索该字符来确定映射地址的位置。

ARM-ELF文件格式与GNU ARM Linker机制

ARM-ELF文件格式与GNU ARM Linker机制
址,分配一个绝对的运行时地址。这个地址是以section地址作为基地址的。假设.text section的地址是0x00000000,那
么.text里面的符号将以0x00000000这个地址作为基准地址。指定section地址的工作也是由连接脚本完成。在嵌入式开发中常见的在编译工
程时需指定的text_base, data_base等参数,最后会被加入到连接脚本中,从而完成section的地址分配。
Linker 的连接动作可以分为两部分:
1) 符号解析。确定引用符号的指向。
2) 符号重定位。合并section, 分配运行时环境地址,引用符号重定位。
符号解析:
在一个object文件中,有指令定义了符号,也有指令引用了符号。可能存在这样一种情况,一个被引用到的符号,有多重的定义。符号解析的作用就是确定,在这个object文件中,一个符号引用真正引用的是哪个符号。
ARM-ELF文件格式与GNU ARM Linker机制
这里所说的ARM系统基本文件格式,都是在基于ARM的嵌入式系统开发中常会碰到的文件格式。
ARM系统基本文件格式有三种:
1) BIN,平板式二进制格式,一般用于直接烧写到Flash中,也可以用于加载到monitor程序中。
下面仔细讨论一下.symtab:
每一个可重定位的object文件,都会有一个.symtab。这个符号表保存了在这个object文件中所有被定义的和被引用的符号。当源程序是C 语言程序时,.symtab 中的符号直接来源于C编译器(cc1)。这里所说的符号主要有三种:
1) 在这个object文件中被定义的可以被其他object文件全局符号。在C语言源程序中,主要就是那些非静态(没有static 修饰的)的全局变量和非静态的函数。在ARM汇编语言中,就是那些 被EXPORT 指令导出的变量。

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

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

和静态变量位于此处。 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,如下图所示:
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:代表已初始化的读写数据,程序中生成的工程中的 Listings 文件夹里面,有一个.map 后缀的文 件,拉到最后面,就有算好的大小)

elf 结构体详解

elf 结构体详解

elf 结构体详解
"elf"是Executable and Linkable Format的缩写,是一种用
于可执行文件、共享库和核心转储文件的标准文件格式。

它是一种
通用的、可移植的二进制文件格式,用于在不同的操作系统和体系
结构之间共享可执行文件和相关的信息。

在Linux系统中,可执行文件和共享库通常使用ELF格式。

ELF
文件由多个部分组成,其中最重要的部分是ELF头部、节头部表和
节区。

ELF头部包含了文件的基本信息,如文件类型、目标体系结构、入口点地址等。

节头部表包含了每个节区的描述信息,如名称、偏移量、大小等。

而节区则包含了实际的数据和代码。

ELF结构体是用来表示ELF文件格式的数据结构。

在C语言中,可以使用结构体来定义ELF头部、节头部表和节区等部分的数据结构,以便于对ELF文件进行解析和操作。

从技术角度来看,ELF结构体包括了多个字段,每个字段对应
了ELF文件中的一个部分,如ELF头部、节头部表、节区等。

通过
对这些结构体的使用,可以方便地对ELF文件进行解析和操作,如
读取ELF头部信息、遍历节区等。

此外,ELF结构体的定义还可以包括一些辅助函数,用于对ELF
文件进行读取、解析和操作。

这些函数可以实现对ELF文件的加载、重定位、符号解析等功能,从而实现对ELF文件的动态链接和执行。

总的来说,ELF结构体是用来表示ELF文件格式的数据结构,
在对ELF文件进行解析和操作时,可以使用这些结构体和相关的辅
助函数,以实现对ELF文件的读取、解析、加载和执行等功能。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档