13.3代碼重定位_鏈接腳本的解析
鏈接腳本的語法?

解釋:?
secname? :段名
start? :起始地址:運行時的地址(runtime addr);重定位地址(relocate addr)
AT ( ldadr ) :可有可無(load addr:加載地址) 不寫時LoadAddr = runtime addr
{ contents } 的內(nèi)容:?
start.o //內(nèi)容為start.o文件
*(.text)所有的代碼段文件
start.o *(.text)文件
elf文件格式
1 鏈接得到elf文件,含有地址信息(load addr)
2 使用加載器
????2.1 對于裸板是JTAG調(diào)試工具
????2.2 對于APP,加載器也是APP 把elf文件解析讀入內(nèi)存的加載地址
3運行程序
4如果loadaddr?!= runtimeaddr程序本身要重定位
核心程序運行時應(yīng)該位于 runtimeaddr(reloate addr)或者鏈接地址?
bin文件
1 elf生成bin文件
2 硬件機(jī)制啟動
3 如果bin文件所在位置 不等于runtimeaddr ,程序本身實現(xiàn)重定位
bin文件/elf文件都不保存bss段 這些都是初始值為0 或者沒有初始化的全局變量
程序運行時把bss段對應(yīng)的空間清零
做個實驗,把全局變量g_A以16進(jìn)制打印出來?


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

修改start.s,清除bss段?

現(xiàn)在的代碼全局變量就是為0,通過幾行代碼,就可以少幾十個甚至上千個全局變量的存儲空間。?
標(biāo)簽: