linker script

lma =  load memory address。装载地址
vma =  vitual memory address。运行地址

預設lma和vma是相同的。

 

input section (*.obj)

output section(*.out or other executable file)

loadable section(程式執行時,可以從flash copy到ram裡執行的部份)

.text - Program Code (RO),存放code, function。

.data  - Initialized Data (RW)。存放有初始化的全局變數。

.bss  - Uninitialized Data (RW),存放沒有初始化的全局變數。

.rodata  - Constants (RO),存放常數。

SECTIONS
{
   . = 0x10000; /*程式放到這裡,從這個位址開始執行*/
   .text : { *(.text) }
   . = 0x8000000; /*數據、變數存放在這裡*/
   .data : { *(.data) }
   .bss : { *(.bss) }
}

若沒有指定output section的位址,就以當前位置計數器(location counter的值當做地址)。
*(.text)表示原始碼中所有code和function的部份。

在*.s中的起始點必需宣告成.global,否則系統找不到,例如:.global __ENTRY。

.text 0x30000000 :設定.text的VMA位址,執行時將代碼copy到0x30000000,程式才能正常運行。

 AT(lma) :指定從哪載入程式。不是指生成output file裡的存放位置。

 .data 0x31000000 : AT(LOADADDR(.text) + SIZEOF(.text)) 這句是說vma是0x31000000,但是生成檔案時,lma的位址是從.text的lma加上.text的大小,開始存放.data。

ADDR(.text)可以得到.text的vma位址。

 

Reference: 

GCC的连接脚本学习笔记

Linker Script 链接器脚本

非常经典的一片介绍 linker script的文章

Linker script

Linker Script概觀

ARM學習報告001

ARM學習報告002

ARM學習報告003

处理器仿真和软件相关笔记

《See MIPS Run Linux》 讀書筆記

各种流行的编程风格


 

操作和查看mtd分区,需要三个环境变量partition, mtdids和mtdparts。
其中partition中存放当前的活动分区,mtdids是指内核mtd设备ID和u-boot设备id的映射
mtdparts存放分区表,这些环境变量的格式如下:
mtdids=nor0=nor0
mtdparts=mtdparts=nor0:192K(ucboot)ro,-(root)
partition=nor0,1
上述内容表示,内核中的nor0设备对应u-boot中的nor0闪存,该闪存被分为两个区,一个
大小为192K的只读ucboot分区,剩下部分是root分区,当前分区是nor0,1。


arrow
arrow
    全站熱搜

    lver76 發表在 痞客邦 留言(0) 人氣()