其他分享
首页 > 其他分享> > text、data、bss、RO、RW、ZI、Code、elf、bin、hex扫盲

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

作者:互联网

目录

现象

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文件记录由对应机器语言码和/或常量数据的十六进制编码数字组成。

标签:bin,初始化,RW,FLASH,ZI,RAM,bss,data
来源: https://www.cnblogs.com/solo666/p/16619167.html