uboot-链接脚本(u-boot.lds)
學習目標:
uboot鏈接腳本分析
學習內容:
學習使用了正點原子的I.MX6ULL教程及開發平臺。
uboot的鏈接腳本u-boot.lds,u-boot.map。
學習時間:
2022-07-17
學習產出:
分析uboot的啟動流程之前,首先要找到uboot的入口函數,第一個運行的函數在哪里。uboot編譯完之后都是需要通過鏈接腳本來指定程序如何存放。所以可以通過鏈接腳本找到uboot的入口函數。
uboot在編譯完成后會在uboot的根目錄下生成一個名為uboot.lds的鏈接腳本文件,此文件是根據arch/arm/cpu/u-boot.lds文件,經過uboot編譯后生成的,uboot在編譯時,會根據原本的鏈接腳本文件增加一些東西,才最終在uboot的根目錄下生成u-boot.lds最終使用的鏈接腳本文件。在uboot編譯時,會打印如下鏈接命令:
這些就是根據鏈接腳本u-boot.lds執行鏈接的過程,由此可知鏈接地址為0x87800000。
uboot根目錄中鏈接腳本的內容如下:
uboot.map文件是uboot的映射文件,從此文件中可以看出某個文件或者函數被鏈接到了哪個地址,文件部分內容如下:
名稱 來源 長度 屬性 *default* 0x0000000000000000 0xffffffffffffffff鏈結器命令稿和內存映射段 .text 的地址設置為 0x878000000x0000000000000000 . = 0x00x0000000000000000 . = ALIGN (0x4).text 0x0000000087800000 0x3f93c*(.__image_copy_start).__image_copy_start0x0000000087800000 0x0 arch/arm/lib/built-in.o0x0000000087800000 __image_copy_start*(.vectors).vectors 0x0000000087800000 0x300 arch/arm/lib/built-in.o0x0000000087800000 _start0x0000000087800020 _undefined_instruction0x0000000087800024 _software_interrupt0x0000000087800028 _prefetch_abort0x000000008780002c _data_abort0x0000000087800030 _not_used0x0000000087800034 _irq0x0000000087800038 _fiq0x0000000087800040 IRQ_STACK_START_INarch/arm/cpu/armv7/start.o(.text*).text 0x0000000087800300 0xb0 arch/arm/cpu/armv7/start.o0x0000000087800300 reset0x0000000087800304 save_boot_params_ret0x0000000087800340 c_runtime_cpu_setup0x0000000087800350 save_boot_params0x0000000087800354 cpu_init_cp150x00000000878003a8 cpu_init_crit*(.text*).text 0x00000000878003b0 0x24 arch/arm/cpu/armv7/built-in.o0x00000000878003b0 lowlevel_init.text.v7_maint_dcache_all0x00000000878003d4 0xcc arch/arm/cpu/armv7/built-in.o.text.invalidate_icache_all0x00000000878004a0 0x18 arch/arm/cpu/armv7/built-in.o0x00000000878004a0 invalidate_icache_all.text.v7_outer_cache_enable0x00000000878004b8 0x4 arch/arm/cpu/armv7/built-in.o0x00000000878004b8 v7_outer_cache_enable.text.v7_outer_cache_disable0x00000000878004bc 0x4 arch/arm/cpu/armv7/built-in.o0x00000000878004bc v7_outer_cache_disable.text.v7_outer_cache_flush_all0x00000000878004c0 0x4 arch/arm/cpu/armv7/built-in.o0x00000000878004c0 v7_outer_cache_flush_all.text.flush_dcache_all0x00000000878004c4 0x14 arch/arm/cpu/armv7/built-in.o0x00000000878004c4 flush_dcache_all從中可以看出__image_copy_start的地址為0x87800000,入口函數_start位于文件arch/arm/lib/vectors.S文件中,此文件內容如下:
#include <config.h> .globl _start.section ".vectors", "ax" _start:#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG.word CONFIG_SYS_DV_NOR_BOOT_CFG #endifb resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq_start 后面就是中斷向量表,從圖中的“.section “.vectors”,"ax”可以得到,此代碼存放在.vectors 段里面。
從u-boot.map文件中可以看出一些變量值,如下:
除了__image_copy_start以外,其他的變量值每次編譯的時候可能會變化,如果修改了 uboot 代碼、修改了 uboot 配置、選用不同的優化等級等等都會影響到這些值。所以,一切以實際值為準!
總結
以上是生活随笔為你收集整理的uboot-链接脚本(u-boot.lds)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360极速浏览器去广告优化版 v13.0
- 下一篇: 解决时间差太大导致Windows无法同步