单片机/MCU论坛
直播中

贺楠

7年用户 828经验值
私信 关注

求助,为什么函数的地址被加载到VMA中?

重置功能被放入文本部分,并在链接器脚本中分配给 rom (LMA)。 反汇编精灵文件后,重置函数的地址为 0x10 (VMA)。 有人能告诉我为什么它的地址不是 0x00 (LMA) 吗?


链接器脚本如下所示:
MEMORY{        rom (rx) : ORIGIN = 0x0, LENGTH = 256        ram (rwx) : ORIGIN = 0x20000000, LENGTH = 16384}SECtiONS{    .text 0x10 : AT(0x00)    {        *(.text)    } >rom        /*. = 0x20000000;*/        abc :        {                *(abc)        } >ram AT>rom        def :        {                *(def)        } >ram AT>rom        /DISCARD/ : { *(.note.gnu.build-id) }        /DISCARD/ : { *(.comment) }}
                                                                                                                                                                                                                                                                                                                                                                                                        
                                                        

回帖(1)

费加罗

2024-1-29 17:45:55
这是因为链接器脚本中的`.text`部分的起始地址被设置为`0x10 : AT(0x00)`。在这个设置中,`0x00`是函数的加载地址(LMA),而`0x10`则是函数的虚拟内存地址(VMA)。这样设置是为了给函数留下一些空间作为冗余,用于其他用途(例如跳转表、异常处理等)。

根据你提供的链接器脚本,`rom`的起始地址是`0x0`,而`.text`部分的起始地址设置为`0x10 : AT(0x00)`,这意味着函数的LMA是`0x00`,但VMA是`0x10`。通过这种设置,函数可以在VMA为`0x10`的位置被加载并执行,而链接器脚本确保了函数的LMA为`0x00`,以便将其正确地从固定的位置加载到内存中。

这种设置通常用于嵌入式系统中的ROM代码,以确保代码在预定的位置上运行,并且还可以为其他用途留下一些空间。

请注意,VMA和LMA是链接器脚本中的概念,用于描述代码在内存中的加载和运行地址。在运行时,函数的实际地址会根据链接器脚本中的设置进行偏移和调整。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分