这是描述信息

esp32 h2 功耗乐鑫科技芯片代理商RISC-V链接脚本

esp32 h2 功耗乐鑫科技芯片代理商RISC-V链接脚本

esp32 h2 功耗乐鑫科技芯片代理商RISC-V链接脚本

esp32 h2 功耗乐鑫科技芯片代理商RISC-V链接脚本

esp32

esp32 h2 功耗乐鑫科技芯片代理商RISC-V链接脚本,链接器把一个或多个输人文件合成一个输出文件。输人文件包括二进制目标X件,二进制库文件和链接脚本文件,输出文件是二进制目标文件、二进制库文件或”执行文件。

每个目标文件中都包含符号表(SYMBOL TABLE)。esp32 h2 功耗乐鑫科技芯片代理商表中含有全局(global)变量,静态(static)变量和函数名等已定义的符号,以及未定义符号信息。每个符号映射到一个内存地址,即符号值。

链接器在链接过程中读取链接脚本文件( *.lds)中的命令和信息,并根据从脚本文件中所读取的内容,确定输入文件内的段(section)合并到输出文件的方式,并控制输出文件内各部分在虚拟(逻辑)内存空间内的分布,完成链接过程。


脚本格式

链接脚本由一系列命令组成,每个命令都由一个关键字或一条符号的赋值语句组成,命令之间用分号“;”隔开。

1.常用链接命令

(1)ENTRY(SYMBOL)
将符号 SYMBOL 设置为程序的入口地址。
人口地址是进程执行的第一条指令在程序空间的地址。链接器 ld 中其他设置
程序入口地址的方式包括:
1、采用ld 命令行的参数-e;
2、如果定义了 start 符号,则使用 start 符号值;
3、如果存在.text section,则使用.text section 的第一字节的位置值。
(2)INCLUDE filename
包含名称为 filename 的其他链接脚本文件。
(3) INPUT( file , file,... )
将括号内的文件作为链接过程的输入文件。
(4)GROUP( file, file,...)
指定需要重复搜索符号的多个输人文件。file 必须是库文件,且 file 文件被 ld重复扫描,直到不再有新的未定义的引用出现。
(5)OUTPUT(filename)
定义输出文件的名字,等同于 ld 命令行参数“-o filename”。如果同时使用脚本文件和命令行参数,则命令行参数的优先级更高。
(6)STARTUP(filename)
指定 filename 为第一个输人文件。
(7) OUTPUT ARCH(BFDARCH
设置输出文件对应的处理器架构。
(8)OUTPUT FORMAT(BFNAME
设置输出文件使用的 BFD格式,等同于 ld 命令行参数“-o format BFDNAME”如果同时使用脚本文件和命令行参数,则命令行参数的优先级更高。


2.SECTIONS 命令

SBCTIONS命令告诉链接器输入和输人文件中段的处理方式,包括,如何把人文件的段映射到输出文件的各个段,如何将输人段合并为输出段,以及如何把输”段成人虚拟内存地址空间(Virtual Memory Addres,VMA)和加载地址空间(LMemory Address,LMA)。esp32 h2 功耗乐鑫科技芯片代理商LMA 是序代码和数据装载到内存空间的物理地VMA是程序运行时代码和数据的虚拟地址。对于实模式,VMA 与内存的物理地一致。如果 SECTIONS中 VMA与 LMA 不相同,则运行程序前需要将程序指
数据从 LMA 位置复制到 VMA 位置。


(1)SECTONS 格式
SECTIONS 命令给出输人文件的 section 映射到输出文件中的各种 section 方式。包括,将输入 section 合并为输出 section,以及把输出 section 映射到 VMA和LMA 中。命令格式如下:

SECTIONS
{
SECTIONS- COMMAND
SECTIONS- COMMAND
...
}
在 SECTIONS 命令格式中,包括以下 SECTIONS-COMMAND 命令:
1、 ENTRY命令;
2、符号赋值语句;
3、输出段描述(output section description);
4、段叠加描述(overlay description)。

如果链接脚本内没有 SECTIONS 命令,那么 ld 将所有同名输人段合成为一个输出段,各段的输入顺序为它们被链接器发现的顺序。esp32 h2 功耗乐鑫科技芯片代理商如果某输人段没有出现在SECTIONS 命令中,则将该段直接复制到输出段


(2) 输出段描述
输出段是目标文件中的块。多个块组成可执行目标程序文件。输出段描述格式
如下:

SECTION_NAME [ADDRESS] [(TYPE)] :[AT(LMA)]
{
OUTPUT - SECTION - COMMAND
OUTPUT - SECTION - COMMAND
...
}

在段描述中,[]中的内容为可选项。大多数情况下,不需要使用可选属性。

SECTION NAME 是输出段的名称,必须符合输出文件格式要求。在仅支持有限段数的格式中,段名称必须是该格式支持的名称之一(例如,a.out 中仅有“.text”.data”或“.bss”段)。段名称可以由任何字符序列组成,但包含任何不寻常字符(如逗号)的名称必须加引号。

[ADDRESS]用于设置输出段的 VMA 地址。如果没有该选项,且有 REGION选项,那么链接器将根据 REGION 设置 VMA。如果也没有 REGION 选项,那么链接器将根据定位符号“”的位置设置该段的 VMA。ld 将调整定位符号的值,以满足输出段对齐的要求。

[(TYPE )] 设置输出段的类型,常用的选项是 NOLOAD,表示在程序运行时不将该段载入内存。esp32 h2 功耗乐鑫科技芯片代理商[AT(LMA)]和[AT]> LMA REGION] 指定该段在 LMA 地址的范围中,主要用于构建 ROM 镜像。

[>REGION]指定 VMA 分配范围。
[:PHDR :PHDR ...] 将输出段放入预先定义的程序段(program segment)内。
[= FILLEXP]设置填充值。
OUTPUT-SECTION-COMMAND 为下列4种之一:
1符号赋值语句;
2、输人段描述;
3、直接包含的数据值;
4、特殊关键字


(3)输入段描述输人段描述表示输人文件中的段,其语法格式如下:
filename([EXCLUDE_FILE (filenamel filename2 ...) SECTION1 SECTION2 ...)

其中:
filename,文件名,是一个特定的文件名称,也可以是一个字符串模式。
EXCLUDE_FILE,排除在外的文件。
SECTION名字,可以是特定的段名字,也可以是一个字符串模式。
例如,“* (.text)”表示所有输人文件的.text 段,“data.o(.data)”表示 data,o文件中的.data 段,“data.o”表示 data.o 文件中的所有段。“*(.text.data)”表示所有文件的.text 段和data 段,排列顺序为:第一个文的.text 段,第一个文件的.data 段,第二个文件的.text 段,第二个文件的.data 段....“*(.text) * (.data)”表示所有文件的.text 段和.data 段。排列顺序为:第~文件的.text 段,第二个文件的.text 段,··,esp32 h2 功耗乐鑫科技芯片代理商后一个文件的.text 段;第一个文件的data 段,第二个文件的.data 段,··,后一个文件的.data 段。


字符串模式常用两种通配符,“*”表示任意多个字符,“?”表示任意一个字符下面是一个简单输出段描述的示例:

SECTIONS
{
. = 0x10000;
.text :{ * (.text) }
. = 0x8000000;
.data :( * (.data)}
.bss :( *(.bss) }
}

在输出段描述示例中:
每一行起始位置的“.”是定位符号,确定本行的起始地址;

“.=0x10000;”把定位符号的地址置为 0x10000(若不指定,则该符号的初始值为 0);
“.text :{ * (.text)}”将所有输入文件的.text 段合并成一个,text 段,该段的地址由定位符号的值指定,即 0x10000;

“.= 0x8000000;”把定位符号的地址置为 0x8000000;
“.data :{*(.data)}”将所有输入文件的.data 段合并成一个.data 段,将该段的起始地址置为 0x8000000;

“.bss :{ * (.bss)}”将所有输入文件的.bss 段合并成一个,bss 段,将该段的起始地址置为 0x8000000+SIZEOF(.data)。


脚本示例

在esp32 h2 功耗乐鑫科技芯片代理商公司发布的 RISC-V 处理器开发平台 HBird-E-SDK 中,提供了一个链接脚本文件 link_flashxip.lds。使用该文件,链接生成映射到 Flash 空间并在Flash 中直接运行的程序。链接脚本文件包含程序入口、目标板内存资源以及段描述。段描述中包含.init、.text 和.data 等输出段描述。

1、程序入口和存储资源描述
ENTRY(_start)    //程序人口为_start标签
MEMORY
{
flash rom(rxai!w):ORIGIN= 0x20000000,LENGTH=4M    //声明 Flash ROM 区域
ram(wxa !ri):ORIGION = 0x90000000,LENGTH= 64K    //声明 RAM区域
}
将目标系统中 Flash 区域命名为 flash_rom,该区域起始地址为 0x20000000,长度4 MB,只读(r,!w)、可分配(a)、需初始化(i)和可执行(x)。

将目标系统中 RAM 区域命名为 ram,该区域起始地址是 0x90000000,长度64 KB,可分配(a)、无须初始化(!i)、可执行(x)和可读/写(!r,w)。

2.段描述

SECTIONS 中有两个程序指令输出段.init 和text。装载和运行时,程序指令都在 Flash 中。而SECTIONS 中的程序数据输出段data,esp32 h2 功耗乐鑫科技芯片代理商装载时在 Flash 中,运行时在 RAM中。
link flashxip.lds 文件内容:

SECTIONS
{/* 定义栈和堆的大小 * /
__stack size = DEFINED( __stack_size) ?__stack_size:2K;
__heap_size= DEFINED( __heap_size) ?_ heap_size;2K;
*代码输出段 */
.init:
{
KEEP ( *(SORT NONE(.init)))
}>flash_rom AT>flash_rom    //装载和运行都在 flash rom 中
//创建标签
.ilalign :
{
.= ALIGN(4);    //4字节对齐
PROVIDE( itcm Ima =.);    //创建标签_itcm_Ima
}>flash_rom AT>flash rom    //装载和运行都在 flash_rom 中
/*代码输出段*/
.text:
{
*(.text.startup .text.startup. * )    //所有输人文件的段及其子段
*(.text .text.*)    //所有输人文件的.text 段及其子段
}>flash rom AT>flash rom    //装载和运行都在 flash_rom 中
/* 数据输出段 */
.data :
{
*(.rdata)    //所有输人文件的.rdata 段
* (.rodata .rodata. * )    //所有输人文件的.rodata 段及其子段
.= ALIGN(8);
PROVIDE( global pointer$ =,+ 0x800);        //创建标签__global_pointer
*(.sdata .sdata.*)    //所有输人文件的.sdata 段
*(.srodata .srodata.*)    //所有输人文件的.srodata 段及其子段
}>ram AT>flash rom    //装载时在 flash rom 中,运行时在 ram中
}

地址:深圳市宝安区西乡街道麻布社区宝安互联网产业基地A区6栋7栋7706

邮箱:Sales@ferry-semi.com

版权所有©2020  深圳市飞睿科技有限公司  粤ICP备2020098907号    飞睿科技微波雷达wifi模块网站地图