【问题标题】:Linker script; add offset to memory region;链接器脚本;向内存区域添加偏移量;
【发布时间】: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


    【解决方案1】:

    简而言之,解决方案是添加一个“假”部分来增加 APP_VMADDR_MEMORY 链接器计数器。

    我添加了一个大小为“引导”部分的新部分,它增加链接器计数器并强制链接器将“应用程序”放置在正确的虚拟地址空间中,并在物理上位于引导部分之后。

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 2011-07-25
      • 1970-01-01
      • 2022-06-10
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多