1、程序段的概念
程序段就是将你写的代码分成不同的段,拥有相同段属性的代码链接时会被链接在一起。将来程序在内存中运行时,相同段属性的代码就会加载在连续的地址中。如果你不指定代码的段属性,编译器就会按照默认的规则对代码进行程序段的划分,所以写应用程序的程序员不用关心程序段,反正编译器会自动划分程序段。程序段分为先天段和自定义段。
先天段:就是每个程序都会有的基础段属性,你不用指定编译器也会自动划分,包括代码段、数据段、bss段;
自定义段:就要靠自己主动去指定代码的段属性。
2、链接脚本
上面已经将代码赋予了不同的段属性,相当于对代码进行了分类。在链接的时候就需要将不同段属性的代码链接成一个可执行程序,这就涉及到链接规则,怎么合理
的将代码组织起来,比如:哪些段放在前面,哪些段放在后面,相同段属性的代码要放在一起······。链接脚本就是指定链接规则,让编译器知道怎么组织代码。
《嵌入式开发(S5PV210)——u-boot的链接脚本分析》、《内核(kernel)的链接脚本》。
3、程序段的组成
代码段(.text):又叫文本段,代码段其实就是你写的那些函数和头文件;
数据段(.data):初始化为非零的全局变量;
bss段(.bss):未初始化或者初始化为零的全局变量;bss段在加载到内存时,整个段都会被清零。
自定义段:在写代码时自己指定段属性;
4、自定义段的好处
自定义段就是你主动将某些代码赋予特有的段属性,将来在链接的时候,具有相同段属性的代码会被链接在一起。简单来说,就是你想把某些代码链接的时候挨着放在一起,就可以把那些特有的段属性。我的理解,自定义段的好处就是既有数组按下标访问的优势,也有链表方便扩展的优势。因为你将代码赋予相同的段属性,将来这些代码都被链接在一块,所有你可以向数组一样去访问这些代码;又因为自定义段并没有限制一个段的代码数量,你想指定多少代码为同一个段属性都可以,所以又具有链表的扩展性。
5、自定义段的应用
6、为什么C语言中未初始化的全局变量默认值是零?
因为C语言把未显式初始化的全局变量放在了bss段,所以能够保证其值为0。
7、 如何保证显式初始化为非0的全局变量在main之前就被赋值了?
因为它把这类变量放在了.data段 中,而.data段会在main执行之前被处理(初始化)