【发布时间】:2019-01-24 01:51:19
【问题描述】:
简而言之,我需要一个接一个地放置一个部分。一个问题,虽然这些部分应该在不同的虚拟地址空间中。
详细说明: 有两段代码。一个部分(引导)在禁用 MMU 的情况下工作,并且应该被链接以使虚拟地址和物理地址相同。另一部分在启用 MMU(应用程序)并且虚拟地址从物理地址偏移时工作。
实际上这两个部分应该一个接一个地放置。
这是我正在努力解决的链接器脚本的一部分
MEMORY {
DDR_MEMORY : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
APP_VMA : ORIGIN = 0xFF002000, LENGTH = 0xFFFFFF
BOOT_LMA : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
}
SECTIONS
{
.boot : {
*(.startup)
} >BOOT_LMA AT>DDR_MEMORY
.app : {
*(.text)
*(.text*)
} >APP_VMA AT>DDR_MEMORY
}
结果是: 假设“启动”代码是 0x5C 字节。因此引导部分链接为 0x2000 - 0x205C 虚拟和物理。
应用程序代码应该在引导部分之后,我希望它被放置在 0xFF002060(虚拟)和 0x2060(物理)。但是APP_VMA 我得到的是 0xFF002000(没有 0x60 偏移),物理位置是 0x2060(正如预期的那样)。
所以问题是如何向 APP_VMA 添加偏移量,以便获得与物理地址匹配的虚拟地址(例如 0xFF002060)?
谢谢。
PS:我使用的是 clang 链接器,但很确定这也适用于 gcc。
【问题讨论】:
标签: gcc linker clang linker-errors