地段划分:段定义
程序的代码和数据会被分到不同的段,段是内存中连续的区域。段的划分没有硬性规定,但通常会根据以下原则:
放进同一个内存区域的符号归一个段。
需要一起初始化的符号归一个段。
回顾上篇,我们提到了两类需要批量初始化的符号:
已初始化的静态变量,需要从Flash复制到RAM。
未初始化的静态变量,需要清零。
此外,链接脚本还要关心:
代码和常量数据,通常放Flash
保留的RAM区域,比如堆栈
按照惯例,段的命名如下:
- .text:代码和常量
- .bss:未初始化数据
- .stack:堆栈
- .data:已初始化数据
如果我们不定义任何段,只写内存布局:
- MEMORY
- {
- rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000
- ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000
- }
- SECTIONS
- {
- /* 空荡荡! */
- }
链接器照样能工作,但用objdump检查生成的elf文件,会发现符号表空空如也。链接器虽然能靠默认假设链接程序,但至少需要知道入口点或.text段的内容。
|