链接描述文件;向存储区域添加偏移量;

时间:2019-01-24 01:51:20

标签: gcc linker clang linker-errors

很快,我需要将一个部分放在另一个部分。尽管这些部分应该位于不同的虚拟地址空间中,但这是一个问题。

详细: 有两段代码。一节(引导)在禁用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。

1 个答案:

答案 0 :(得分:0)

很快,解决方案是添加一个“ phony”部分,以递增APP_VMADDR_MEMORY链接器计数器。

我添加了一个新的部分,其大小为'boot'部分,该部分增加了链接器计数器,并强制链接器将'app'放置在正确的虚拟地址空间中并位于引导部分的后面。

MEMORY {
    DDR_MEMORY  : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
    APP_VMA     : ORIGIN = 0xFF002000, LENGTH = 0xFFFFFF
    BOOT_LMA    : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
}

PHDRS
{
    mmu_on      PT_LOAD;
    no_mmu      PT_LOAD;
}

SECTIONS
{
    .boot : {
        *(.startup)
        _boot_sizeof = SIZEOF(.boot);
    } >BOOT_LMA : no_mmu

    .boot_phony : {
        . += _boot_sizeof ;
        /* Reserve a space to adjust counters APP_VMA and DDR_MEMORY */
    } >APP_VMA AT>DDR_MEMORY :no_mmu

    .app : {
        *(.text)
        *(.text*)
    } >APP_VMA AT>DDR_MEMORY : mmu_on
}