text、data、bss、RO、RW、ZI、Code、elf、bin、hex扫盲

现象

eclipse中编译一个ARM工程,编译成功后有以下打印:

数据说明:
.text: 10290 byte
.data: 3220 byte
.bss: 276 byte
dec: text+data+bss=13786 byte (十进制)
hex: text+data+bss=0x35da byte (十六进制)

Code

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

RO data

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

RW data

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

ZI data

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

text代码段

(.text)= (Code + RO data) ,存放代码、常量及向量表,只读。 最终存放在FLASH。
例如函数、const int table[]、中断向量表。

data数据段

(.data) = (RW data),存放已初始化的全局/静态变量,可读可写。 最终存放在FLASH。
data放的是初始化的变量,且同时计入RAM和FLASH。链接器把数据分配在FLASH中然后在启动代码中从ROM拷贝到RAM。
例如int32_t myVar = 0x12345678;,data段仅包含初始化所用的数据(本例中的0x12345678),不含变量(myVar)。变量myVar不是常量,所以最终会存放于RAM内。但是初始值(0x12345678)是一个常量,因此可以放在FLASH里。

bss

(.bss) = (ZI data) ,存放所有未初始化的全局/静态变量,可读可写。 最终存放在RAM。
例如int32_t myGlobal; ,函数初始化bss段就是把未初始化的变量置0。

bin文件

binary文件,即二进制文件。
执行raw binary很简单,只需要将程序加载到其起始地址,就可以执行;

从可执行程序的角度来说,如果一个数据未被初始化,就不需要为其分配空间,所以.bss 并不占用可执行文件的大小,仅仅记录需要用多少空间来存储这些未初始化的数据,而不分配实际空间。
所以 bin = text + data = Code + RO Data + RW Data
而程序运行在RAM中的大小 = data + bss = RW Data + ZI Data
.data(RW-data) 同时计入RAM和FLASH。

elf文件

相比bin,多了段的加载地址,运行地址,重定位表,符号表等。

hex文件

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

AXF文件

AXF,BIN格式的扩展版,主体部分同BIN,在文件头和尾加入了调试用的信息,用于AXD。

posted @ 2022-08-24 14:24  solonj  阅读(1553)  评论(0编辑  收藏  举报