打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ld链接脚本文件解析之七

输出节LMA

..................

每一个节有一个虚地址(VMA)和一个载入地址(LMA);出现在输出节描述中的地址表达式设置VMS

连接器通常把LMA跟VMA设成相等。你可以通过使用‘AT’关键字改变这个。跟在关键字‘AT’后面的表达式LMA指定节的载入地址。或者,通过`AT>LMA_REGION'表达式,你可以为节的载入地址指定一个内存区域。

这个特性是为了便于建立ROM映像而设计的。比如,下面的连接脚本创建了三个输出节:一个叫做‘.text’从地址‘0x1000’处开始,一个叫‘.mdata’,尽管它的VMA是'0x2000',它会被载入到'.text'节的后面,最后一个叫做‘.bss’是用来放置未初始化的数据的,其地址从'0x3000'处开始。符号'_data'被定义为值'0x2000', 它表示定位计数器的值是VMA的值,而不是LMA。

SECTIONS

{

.text 0x1000 : { *(.text) _etext = . ; }

.mdata 0x2000 :

AT ( ADDR (.text) + SIZEOF (.text) )

{ _data = . ; *(.data); _edata = . ; }

.bss 0x3000 :

{ _bstart = . ; *(.bss) *(COMMON) ; _bend = . ;}

}

这个连接脚本产生的程序使用的运行时初始化代码会包含象下面所示的一些东西,以把初始化后的数据从ROM映像中拷贝到它的运行时地址中去。注意这节代码是如何利用好连接脚本定义的符号的。

extern char _etext, _data, _edata, _bstart, _bend;

char *src = &_etext;

char *dst = &_data;

/* ROM has data at end of text; copy it. */

while (dst REGION'把一个节赋给前面已经定义的一个内存区域。

这里有一个简单的例子:

MEMORY { rom : ORIGIN = 0x1000, LENGTH = 0x1000 }

SECTIONS { ROM : { *(.text) } >rom }

输出节Phdr  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux下的lds链接脚本基础
From Zero to main(): Demystifying Firmware Linker Scripts | Interrupt
【转载】非常经典的一片介绍 linker script的文章 - linux kernel...
GNU-ld连接脚本 Linker Scripts
GCC-LD 连接脚本分析--uboot.ld
VMA与LMA
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服