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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

链接器ld程序的脚本文件u-boot.lds(二)

發(fā)布時間:2024/10/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链接器ld程序的脚本文件u-boot.lds(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目的:了解鏈接器用到的腳本文件u-boot.lds。

在開始這篇博文之前,需要先了解一些GNU linker script的基本知識,可以參考博主的另外一篇分享《GNU linker script,ld script,GNU鏈接腳本》

之前分析了u-boot的目錄結構,提及到了程序入口start.S,但在開始了解start.S之前,我們先聊聊鏈接器ld程序的腳本文件u-boot.lds。

下面我們就來品味一下UT4418開發(fā)板的u-boot.lds腳本,即u-boot/arch/arm/cpu/slsiap/u-boot.lds。如果讀者正好需要看source code,可以參看之前的文章《u-boot分析 一》中的源碼分享。

/*指定輸出可執(zhí)行文件是elf格式,32位ARM指令,小端*/ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")/*指定輸出可執(zhí)行文件的平臺為ARM*/ OUTPUT_ARCH(arm)/*指定輸出可執(zhí)行文件的起始代碼段為_stext*/ ENTRY(_stext)/*分配各個段地址*/ SECTIONS {/*指定可執(zhí)行文件的全局入口點,通常這個地址都放在ROM(flash)0x0位置。必須使編譯器知道這個地址,通常都是修改此處來完成,這里從0x0位置開始*/. = 0x00000000;/*保證text代碼段以4字節(jié)對齊*/. = ALIGN(4);/*代碼段*/ .text : { *(.__image_copy_start)/*u-boot將自己copy到RAM,此為需要copy的程序的start*/ /*./arch/arm/cpu/slsiap/s5p4418/start.S,啟動程序*/SOCDIR/start.o (.text*)/*./arch/arm/cpu/slsiap/s5p4418/vectors.S,異常向量表*/SOCDIR/vectors.o (.text*)/*其他的代碼段放在這里,即start.S/vector.S之后*/*(.text*)}/*代碼段結束后,有可能4bytes不對齊了,此時做好4bytes對齊,以開始后面的.rodata段*/ . = ALIGN(4);/*在代碼段之后,存放.rodata數(shù)據(jù)段,其中ro:read only,表示只讀數(shù)據(jù)段*/.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }/*和前面一樣,4bytes對齊,以開始接下來的.data段*/. = ALIGN(4);/*可讀寫數(shù)據(jù)段*/ .data : {*(.data*)}. = ALIGN(4);/*和前面一樣,4bytes對齊*/. = .;. = ALIGN(4);/*.data段結束后,緊接著存放u-boot自有的一些function,例如u-boot command等*/.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));}. = ALIGN(4);/*至此,u-boot需要自拷貝的內容結束,總結一下,包括代碼段,數(shù)據(jù)段,以及u_boot_list*/.image_copy_end :{*(.__image_copy_end)}/*在老的uboot中,如果我們想要uboot啟動后把自己拷貝到內存中的某個地方,只要把要拷貝的地址寫給TEXT_BASE即可,然后boot啟動后就會把自己拷貝到TEXT_BASE內的地址處運行,在拷貝之前的代碼都是相對的,不能出現(xiàn)絕對的跳轉,否則會跑飛。在新版的uboot里(2013.07),TEXT_BASE的含義改變了。它表示用戶要把這段代碼加載到哪里,通常是通過串口等工具。然后搬移的時候由uboot自己計算一個地址來進行搬移。新版的uboot采用了動態(tài)鏈接技術,在lds文件中有__rel_dyn_start和__rel_dyn_end,這兩個符號之間的區(qū)域存放著動態(tài)鏈接符號,只要給這里面的符號加上一定的偏移,拷貝到內存中代碼的后面相應的位置處,就可以在絕對跳轉中找到正確的函數(shù)。*/.rel_dyn_start : {*(.__rel_dyn_start)}/*動態(tài)鏈接符存放在的段*/.rel.dyn : {*(.rel*) }/*動態(tài)鏈接符段結束*/.rel_dyn_end : {*(.__rel_dyn_end)}.end :{*(.__end)}/*bin文件結束*/_image_binary_end = .;/** Deprecated: this MMU section is used by pxa at present but* should not be used by new boards/CPUs.*/. = ALIGN(4096);.mmutable : { /*for MMU*/*(.mmutable)}/** Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c* __bss_base and __bss_limit are for linker only (overlay ordering)*//*bss段的描述*/.bss_start (OVERLAY) : {KEEP(*(.__bss_start));__bss_base = .;}.bss __bss_base (OVERLAY) : {*(.bss*). = ALIGN(4);__bss_limit = .;}/*bss段的描述結束*/.bss_end __bss_limit (OVERLAY) : {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.*) } }

并結合其他博客理解:https://blog.csdn.net/dl0914791011/article/details/17299037?

總結

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

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