《朱老师物联网大讲堂》学习笔记
学习地址:www.zhulaoshi.org
运行时地址,在编译链接阶段无法绝对确定。
gcc 1.c -o exe
默认链接地址是0x0,
这是因为应用程序独享4G的虚拟地址空间。
210裸机程序,运行地址由我们下载时候确定,
下载到0xD0020010,需要说明一点的是,这个地址看起来是我们在设定,其实我们是没办法随便改的,
这是由BL0加载BL1时候确定的,CPU事先约定好了的,
如果你改到其它地址,就会出错。
从源代码程序到可执行程序,要经历下面这些阶段
预编译
编译
编译的时候是以函数为单位,分成一段一段的,比如一个.c文件中有3个函数,就会生成3个段。
链接
链接是有一定的规则的,把.o文件中各函数(段)按照一定规则(链接脚本)累积在一起,形成可执行文件。
strip(可选步骤)
把可执行程序中的符号信息拿掉,以节省空间。
补充一点:符号表简单说就是记录了各个函数的名字。
体现就是dubug版本和release版本,
同时编译报错中的符号也源自这里,没有的话,报错就是具体的地址,我们会不知所云了。。。。
程序段的概念也非常重要
函数,也可以叫代码段,
整个程序分成一个一个段,并起了个名字,方便链接。
段名分两种,一种是先天的,是编译链接内部定好的,
另一种是程序员自己指定的,定义的。
先天的段名
代码段:.text段,又叫文本段,就是函数编译后生成的,
数据段:.data段,就是C语言中显示初始化为非0的全局变量,
bss段:.bss段,又叫ZI(zero initial)段,就是零初始化段,对应C语言中初始化为0的全局变量。
后天的段名
段名由程序员自己定义,段的属性和定义也由程序员自己定义。
链接脚本就是一个规则文件,
关键内容:段名 + 地址
下面就是一个链接脚本
SECTIONS
{
. = 0xd0024000;
.text : {
start.o
* (.text)
}
.data : {
* (.data)
}
bss_start = .;
.bss : {
* (.bss)
}
bss_end = .;
}
.代表当前位置,
但是这个地址,很容易使你误会,这个.代表的地址是从上往下在增加的,
千万不要以为始终就是0xd0024000。