SECTIONS {
. = 0x00; //表示当前地址为零,从零地址开始排放
.text : { *(.text) }
.rodata ALIGN(4) : {*(.rodata)}
.data ALIGN(4) : { *(.data) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
. = 0x00表示当前地址为零,从零地址开始排放。首先是代码段,接着是只读数据段,然后是data段和bss段。这里的*表示所有文件的代码段数据段等。
1、 bss段用来存放 没有被初始化 和 已经被初始化为0 的全局变量。静态变量
2、已被初始化为非零的全局变量(.data段)
3、常量数据(.rodata段)
rodata用来存放常量数据。 ro: read only
字符串会被编译器自动放在rodata中,加 const 关键字的常量数据会被放在 rodata 中
在有的嵌入式系统中, rodata放在 ROM(或 NOR Flash)里,运行时直接读取,不须加载到RAM内存中。
所以,在嵌入式开发中,常将已知的常量系数,表格数据等造表加以 const 关键字。存在ROM中,避免占用RAM空间
4.代码(.text段)
text段存放代码(如:函数)和部分整数常量(应该指的是一些立即数),这个段是可执行的。
5.栈(stack)
1)stack 存放函数的局部变量和函数参数
2)被调用函数的参数和返回值 被存储到当前程序的栈区,之后被调用函数再为自身的自动变量和临时变量在栈区上分配空间
3)函数返回时,栈区的数据会被释放掉,先入后出(FILO)的顺序。
6.堆(heap)
heap用来动态分配内存,由程序自身决定开辟和释放。