日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uboot-链接脚本(u-boot.lds)

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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編譯時,會打印如下鏈接命令:

arm-linux-gnueabihf-ld.bfd -pie --gc-sections -Bstatic -Ttext 0x87800000 -o u-boot -T u-boot.lds arch/arm/cpu/armv7/start.o --start-group arch/arm/cpu/built-in.o arch/arm/cpu/armv7/built-in.oarch/arm/imx-common/built-in.o arch/arm/lib/built-in.o board/freescale/common/built-in.o board/freescale/mx6ullevk/built-in.o cmd/built-in.o common/built-in.odisk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mmc/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.odrivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o --end-group arch/arm/lib/eabi_compat.o -L /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4 -lgcc -Map u-boot.map

這些就是根據鏈接腳本u-boot.lds執行鏈接的過程,由此可知鏈接地址為0x87800000。
uboot根目錄中鏈接腳本的內容如下:

#指定輸出可執行文件是elf格式,32位ARM指令,小端模式 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm)#指定輸出而執行文件運行于ARM平臺 ENTRY(_start)#程序默認的入口函數為_start SECTIONS {. = 0x00000000;#指明目標代碼起始地址為0x0,"."代表當前位置. = ALIGN(4);#按4字節對齊.text :#.text代碼段,可讀可執行{*(.__image_copy_start)#uboot映像文件復制起始地址,在u-boot.map中定義*(.vectors)#中斷向量表arch/arm/cpu/armv7/start.o (.text*)#start.o文件*(.text*)#其他代碼段}. = ALIGN(4);.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }#只讀數據段RO段(存放常量). = ALIGN(4);.data : {#讀寫數據段 RW段(存放已經初始化的全局變量和靜態變量)*(.data*)}. = ALIGN(4);. = .;. = ALIGN(4);.u_boot_list : {#uboot.list段KEEP(*(SORT(.u_boot_list*)));}. = ALIGN(4);.image_copy_end :#uboot映像文件復制結束地址,在u-boot.map中定義{*(.__image_copy_end)}.rel_dyn_start :{*(.__rel_dyn_start)}.rel.dyn : {*(.rel*)}.rel_dyn_end :{*(.__rel_dyn_end)}.end :{*(.__end)}_image_binary_end = .;. = ALIGN(4096);.mmutable : {*(.mmutable)}.bss_start __rel_dyn_start (OVERLAY) : {#bss段起始地址KEEP(*(.__bss_start));__bss_base = .;}.bss __bss_base (OVERLAY) : {*(.bss*). = ALIGN(4);__bss_limit = .;}.bss_end __bss_limit (OVERLAY) : {#bss段結束地址KEEP(*(.__bss_end));}.dynsym _image_binary_end : { *(.dynsym) }.dynbss : { *(.dynbss) }.dynstr : { *(.dynstr*) }.dynamic : { *(.dynamic*) }.plt : { *(.plt*) }.interp : { *(.interp*) }.gnu.hash : { *(.gnu.hash) }.gnu : { *(.gnu*) }.ARM.exidx : { *(.ARM.exidx*) }.gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) } }

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 0x87800000 uboot 拷貝的首地址 __image_copy_end 0x87853728 uboot 拷貝的結束地址 __rel_dyn_start 0x87853728 .rel.dyn 段起始地址 __rel_dyn_end 0x8785c3c8 .rel.dyn 段結束地址 image_binary_end 0x8785c3c8 鏡像結束地址 __bss_start 0x87853728 .bss 段起始地址 __bss_end 0x8789e814 .bss 段結束地址

除了__image_copy_start以外,其他的變量值每次編譯的時候可能會變化,如果修改了 uboot 代碼、修改了 uboot 配置、選用不同的優化等級等等都會影響到這些值。所以,一切以實際值為準!

總結

以上是生活随笔為你收集整理的uboot-链接脚本(u-boot.lds)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。