【问题标题】:Linker script: mixing memory regions and location assignments链接描述文件:混合内存区域和位置分配
【发布时间】:2022-01-19 19:23:22
【问题描述】:

我一直在研究一些用于嵌入式 ARM 处理器的链接器脚本。其中一个是这样的(最小的例子):

MEMORY {
  REGION : ORIGIN = 0x1000, LENGTH = 0x1000
}
SECTIONS {
  .text : {
    /* ... */
    . = 0x20;
    /* ... */
  } > MEMORY
}

此链接描述文件指出.text 部分应位于内存区域REGION 中,该区域从0x1000 开始。但是,在部分内容中,位置被明确设置为0x20

此位置分配是否相对于该部分所在区域的起点?还是绝对的? 一般来说,区域和位置分配如何协同工作?

【问题讨论】:

  • 链接器手册中说了什么?
  • 我找不到任何关于 SECTIONS 区域与位置分配相关的材料;否则我就不会问了。

标签: embedded linker-scripts


【解决方案1】:

我做了一个测试。我创建了一个包含以下内容的程序集文件:

.text
.word 0x1234

然后我写了一个基本的链接器脚本,如问题中所述:

MEMORY {
    REGION : ORIGIN = 0x100, LENGTH = 0x100
}
SECTIONS {
    .text : {
        . = 0x20;
        *(.text);
    } > REGION
}

我使用 GCC 将程序集文件编译为目标文件,然后使用 ld 将目标文件链接到“可执行文件”中。在结果上运行objdump -s,我发现 0x1234 位于地址 0x120。这意味着位置分配是相对于内存区域的开始

【讨论】:

    猜你喜欢
    • 2017-02-04
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多