13.3代码重定位_链接脚本的解析
链接脚本的语法

解释:
secname :段名
start :起始地址:运行时的地址(runtime addr);重定位地址(relocate addr)
AT ( ldadr ) :可有可无(load addr:加载地址) 不写时LoadAddr = runtime addr
{ contents } 的内容:
start.o //内容为start.o文件
*(.text)所有的代码段文件
start.o *(.text)文件
elf文件格式
1 链接得到elf文件,含有地址信息(load addr)
2 使用加载器
2.1 对于裸板是JTAG调试工具
2.2 对于APP,加载器也是APP 把elf文件解析读入内存的加载地址
3运行程序
4如果loadaddr != runtimeaddr程序本身要重定位
核心程序运行时应该位于 runtimeaddr(reloate addr)或者链接地址
bin文件
1 elf生成bin文件
2 硬件机制启动
3 如果bin文件所在位置 不等于runtimeaddr ,程序本身实现重定位
bin文件/elf文件都不保存bss段 这些都是初始值为0 或者没有初始化的全局变量
程序运行时把bss段对应的空间清零
做个实验,把全局变量g_A以16进制打印出来


上述代码,没有清理bss段 g_A等于莫名奇妙的值 并不等于0 所以需要清理bss段
修改lds链接文件

修改start.s,清除bss段

现在的代码全局变量就是为0,通过几行代码,就可以少几十个甚至上千个全局变量的存储空间。

