目录
现象
eclipse中编译一个ARM工程,编译成功后有以下打印:
...
....
数据解析:
.text: 10290 byte
.data: 3220 byte
.bss: 276 byte
dec: 以上三种数据占 13786 byte
hex: 以上三种数据占 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中的大小 = (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。
标签:bin,初始化,RW,ZI,文件,text,bss,data From: https://www.cnblogs.com/solo666/p/16619167.html