arm链接脚本学习

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用来动态分配内存,由程序自身决定开辟和释放。

猜你喜欢

转载自blog.csdn.net/shenlong1356/article/details/81805312
今日推荐