嵌入式系统可执行文件格式_转

转自:嵌入式系统可执行文件格式

UBOOT编译映像格式(uboot)
UBOOT编译完成后,可以得到u-boot各种格式的映像文件和符号表
u-boot.bin:      u-boot映像原始的二进制格式
u-boot:            u-boot映像的ELF格式
u-boot.srec:     u-boot映像的S-Record格式
u-boot.map:    u-boot映像的符号表
u-boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin最为常用,直接按照二进制格式下载,并 且按照绝对地址烧写到Flash中就可以了。u-boot和u-boot.srec格式映像都自带定位信息

嵌入式系统可执行文件的格式
调试器需要的调试信息与一些下载时需要的一些信息。不同的嵌入式环境中,其组织可执行文件的格式也不相同,主要有以下几种:   ELF文件格式、S-record文件格式、HEX文件格式、bin文件格式
BIN文件格式
原始的二进制格式,内部没有地址标记,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中就可以启动了,而如果下载运行,则下载到编译时的地址即可。
ELF文件格式(Executable and linking format)

Executable and linking format(ELF)文件是Linux系统 下的一种常用、可移植目标文件(object file)格式,它有三种主要类型:

可重定位文件(Relocatable File):包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。

可执行文件(Executable File):包含适合于执行的一个程序,此文件规定了exec() 如何创建一个程序的进程映像。


享目标文件(Shared Object
File):包含可在两种上下文中链接的代码和数据。首先链接编辑器可以将它和其它可重定位文件和共享目标文件一起处理,生成另外一个目标文件。其次,动
态链接器(Dynamic Linker)可能将它与某个可执行文件以及其它共享目标一起组合,创建进程映像。

S-Record文件格式

S-
Record文件遵循Motorola制定的格式规范,是一种标准的、可打印格式的文件。S-Record文件是通过对链接器生成的目标程序或
数据进行编码生成的,适用于在计算机平台间传送,也可以在编辑后用于交叉平台间的传送。S-Record文件编码简单,可以通过IDE下载,但无法在线实
时调试。S-Record文件是由多条记录组成的,每条记录都是由5个字段组成的ASCII字符串,格式如下所示。
l         记录类型:由两个字符组成,描述了该条记录的可能类型(S0, S1, S2, S3, S5, S7, S8, or S9)。

l         数据长度:是对应于2 byte十六进制数的一对字符,表示该条记录后续字符对的个数;

l         地址:由4,6或者8个字符组成,也是由十六进制值翻译得到的字符,给出数据字段将存放在存储器中的地址;

l         数据:由每2 byte十六进制值翻译得到的成对的字符,大小为0-64,这些十六进制数值可能是存放在存储器中的数据,或者是描述信息;

l         校验和:它们所对应的十六进制数值是根据除记录类型之外的其他字段字符成对累加之和求反所得;

l         换行符:每条记录都由换行符终止。针对不同的目标器件,可能每条记录的结束符不尽相同,设计中用传输程序来提供一致的换行符。


有的S-Record文件都是以类型为S0的记录作为首条记录,这条记录在数据字段中给出文件的信息,包括路径、版本号等,这些信息是供阅读的,
将不被存放到存储器中。S-Record文件的中间记录可能是类型为S1、S2或S3的记录,其地址字段分别对应2、3、4
byte地址,因而主要区别在于寻址空间的不同。S-Record文件以S7、S8或S9类型的记录作为末条记录,除了地址字段长度不同外,它们都给出了
程序执行的起始地址,并都不含数据字段。

HEX文件格式
Intel
HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。Intel
HEX文件经常被用于将程序或数据传输 存储到ROM、EPROM。大多数编程器和模拟器使用Intel HEX文件。

一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式, :LLaaaatt[dd...]cc
每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述: :冒号:它是每一条Intel
HEX记录的开始。 LL是这条记录的长度域,他表示数据(dd)的字节数目。 aaaa是地址域:他表示数据的起始地址。
如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM/FLASH中的偏移地址,对于不支持扩展段地址和扩展线性地址的,如89C51,这就是
此条记录的起始地址。 tt这个域表示这条HEX记录的类型,他有可能是下面这几种类型: 00:数据记录 01:文件结束记录 02:扩展段地址记录
04:扩展线性地址记录 dd是数据域:表示一个字节的数据。一个记录可能有多个数据字节,字节数目可以查看LL域的说明。
cc是效验和域:表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对(不包括本效验字和冒号)所表示的十六进制数字都加起来,然后模除256得
到的余数,最后求出余数的补码即是本效验字节cc。

Intel HEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束,(回车为0x0d换行为0x0a)。


展线性地址记录(HEX386) :
扩展线性地址记录也可称为32位地址记录和HEX386记录,这个纪录包含高16(16-31位)位数据地址,这种扩展的线性记录总是有两个字节数据。当
一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,
直到读到下一个扩展线性记录。 文件结束记录(EOF) :     一个Intel
HEX文件必须有一个文件结束记录,这个记录的类型域必须是01,一个EOF记录总是这样:
:00000001FF,其中:00是记录中数据字节的数目,0000这个地址对于EOF记录来说无任何意义,01记录类型是01(文件结束记录标
示),FF是效验和。计算如下01h + NOT(00h + 00h + 00h + 01h)。

可执行文件格式的差别

a)      HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身,在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。而烧写BIN文件的时候,用户是一定需要指定地址信息的。

b)      BIN文件格式 对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。

c)      
HEX文件格式
HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录类型包括:记录数据域,文件结束域,扩展线性地址的记录,扩展

段地址的记录。在上面的后2种记录,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算
地址的时候,都是以这些“基”地址为基础的。

d)       AXF是Arm特有的文件格式,它除了包含bin文件外,还额外包括了许多其他调试信息。在下载到目标板的时候,烧入ROM还是bin文件,额外的调试信息会被去掉


般来说,可以由elf文件转化为其它两种文件,hex也可以直接转换为bin文件,但是bin要转
化为hex文件必须要给定一个基地址。而hex和bin不能转化为elf文件,因为elf的信息量要大。另外还有一种ads的调试文件axf,它可以用以
下命令fromelf -nodebug xx.axf -bin xx.bin转化为bin文件。

时间: 2024-10-14 20:52:40

嵌入式系统可执行文件格式_转的相关文章

可执行文件格式elf和bin

区别 常用的可执行文件包含两类:原始二进制文件(bin)和可加载执行的二进制文件,在linux中可加载执行的二进制文件为elf文件. BIN文件是直接的二进制文件,内部没有地址标记.bin文件内部数据按照代码段或者数据段的物理空间地址来排列.一般用编程器烧写时从00开始,而如果下载运行,则下载到编译时的地址即可. 在Linux OS上,为了运行可执行文件,他们是遵循ELF格式的,通常gcc -o test test.c,生成的test文件就是ELF格式的.执行elf文件时内核会使用加载器来解析e

利用qemu模拟嵌入式系统制作全过程

http://www.tinylab.org/using-qemu-simulation-inserts-the-type-system-to-produce-the-whole-process/ 利用qemu模拟嵌入式系统制作全过程 by Pingbo Wen of TinyLab.org 2013/08/31 这篇文章,将介绍如何用qemu来搭建一个基于ARM的嵌入式linux系统.通过该文章,你可以学习到如何配置kernel,如何交叉编译 kernel,如何配置busybox并编译,如何制

嵌入式系统C编程之堆栈回溯

前言 在嵌入式系统C语言开发调试过程中,常会遇到各类异常情况.一般可按需添加打印信息,以便观察程序执行流或变量值是否异常.然而,打印操作会占用CPU时间,而且代码中添加过多打印信息时会显得很凌乱.此外,即使出错打印已非常详尽,但仍难以完全预防和处理段违例(Segment Violation)等错误.在没有外部调试器(如gdb server)可用或无法现场调试的情况下,若程序能在突发崩溃时自动输出函数的调用堆栈信息(即堆栈回溯),那么对于排错将会非常有用. 本文主要介绍嵌入式系统C语言编程中,发生

利用 qemu 模拟嵌入式系统制作全过程

利用qemu模拟嵌入式系统制作全过程 by Pingbo Wen of TinyLab.org 2013/08/31 这篇文章将介绍如何用 Qemu 来搭建一个基于 ARM 的嵌入式 Linux 系统.通过该文章可以学习到如何配置和交叉编译 Kernel,如何配置 Busybox 并编译,如何制作 Initramfs,如何制作根文件系统,如何定制自己的 Uboot,如何通过 Uboot 向 Kernel 传递参数等.开始干活! 零.环境搭建 在实现我们的目标之前,我们需要搭建自己的工作环境.在这

【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级

SWUpdate: 嵌入式系统的软件升级 概述 本项目被认为有助于从存储媒体或网络更新嵌入式系统.但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWUpdate中称为处理程序). 一个用例是从外部本地媒体(如USB-Pen或sd卡)进行更新.在这种情况下,更新是在没有操作员干预的情况下完成的:它被认为是"一键更新",软件在复位时启动,只需按下一个键(或者以任何目标可以识别的方式),自动进行所有检查.最后,更新过程只向操作员报告状态(成功

关于嵌入式系统的学习路线图

嵌入式系统方向 嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一.嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器.存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等.特别是随着消费家电的智能化,嵌入式更显重要.像我们平常常见到的手机.PDA.电子字典.可视电话.VCD/DVD/MP3 Player.数字相机(DC).数字摄像机(DV).U-Disk.机顶盒(Set Top Box).高清电视(HDTV).游戏机.智能玩具.交换机.路由器.数控设备或仪表.汽

嵌入式系统编程和调试技巧

嵌入式系统的开发,软件的运行稳定可靠是非常重要的.在芯片中,软件是没有质量的,但软件的质量可以决定一颗芯片的成败.芯片设计中,性能能否满足设计要求,除了硬件设计.软硬件配合的设计技巧,对于软件来说,编程的一些技术和技巧同样重要. 本文讲述我在芯片固件开发过程中使用的一些编程调试技巧.针对在嵌入式系统开发中常见的问题,如实时系统下的同步问题,动态内存分配的内存泄漏问题,如何在编程阶段预防BUG出现,调试阶段如何及时发现问题和定位问题.总结下经验,目的是开发一个稳定运行的固件,提高开发效率,提高运行

2014025689 《嵌入式系统程序设计》第五周学习总结

<嵌入式系统程序设计>第五周学习总结 一.6.5(标准I/O编程)主要涉及的函数及知识点 标准的I/O的三种缓冲存储:全缓冲.行缓冲.不带缓冲. 1. 全缓存:当填满标准I/O缓存后才进行实际的I/O操作 2. 行缓存:当输入或输出中遇到行结束符时,标准I/O库执行I/O操作 3. 不带缓存:标准I/O库不对字符进行缓冲 打开文件的三个标准函数:  fopen().fdopen()和 freopen(). -fopen()可以指定打开文件的路径和模式 函数原型:FILE * fopen(con

SoC嵌入式软件架构设计之七:嵌入式系统固件的系统区文件系统设计

嵌入式固件的系统区(system disk,SD)包括操作系统.驱动.中间件.应用和字库.UI资源等文件,本文讲述SD区的文件系统设计.文件系统最主要的目标是为了实现单个文件的定位和读写.因为一般代码都是不可自修改的,即量产之后不会有写操作,嵌入式系统的SD文件系统就是为了能够简单.高效地定位某个文件和读取文件中的数据.设计原则和要点有以下几方面: 1. 逻辑连续存储单个文件,以扇区对齐. SD区的单个代码和资源文件一般都不大,所以不必要像fat32文件系统那样用fat表把文件簇串起来,直接逻辑