【问题标题】:Defining a symbolic constant for GNU .ld script origin为 GNU .ld 脚本来源定义符号常量
【发布时间】:2017-10-18 21:59:05
【问题描述】:

我正在创建一个 GNU .ld 链接器脚本,并且想象征性地定义一些内存部分的起源。以下不起作用:

BASE_ADDR = 0x4000;

MEMORY
{
  m_interrupts        (RX) : ORIGIN = BASE_ADDR, LENGTH = 0x0200
  m_bootloader_config (RX) : ORIGIN = BASE_ADDR + 0x3C0, LENGTH = 0x0040
  m_text              (RX) : ORIGIN = BASE_ADDR + 0x400, LENGTH = 0x10000 - (BASE_ADDR + 0x400)
  m_data              (RW) : ORIGIN = 0x1FFFF000, LENGTH = 0x4000
}

这会导致以下错误:

Invoking: Cross ARM C++ Linker
../MKL27Z64xxx4_flash.ld:67: nonconstant expression for origin
collect2: error: ld returned 1 exit status

错误是指以下行:

m_interrupts        (RX) : ORIGIN = BASE_ADDR, LENGTH = 0x0200

让我感到困惑的是,BASE_ADDR 在我看来相当稳定。我需要调用一些特殊的语法来让ld 相信BASE_ADDR 是不变的吗?

【问题讨论】:

  • 这似乎适用于 binutils 2.26。你用的是什么版本?
  • 根据 Eclipse,它使用的是:“GNU ARM C/C++ Cross Compiler 2.4.1.201704251808 ilg.gnuarmeclipse.managedbuild.cross.feature.group Liviu Ionescu” 不清楚它使用的是哪个特定版本的链接器.

标签: c linker gnu


【解决方案1】:

LD 手册指出,对于 MEMORY :

"origin 是内存区域起始地址的表达式。该表达式必须在执行内存分配之前计算为常量,这意味着您不能使用任何段相关符号。关键字 ORIGIN 可以缩写为org 或 o(但不是,例如 ORG)。"

而表达式:BASE_ADDR = 0X4000; 是一个节相对符号

以下文字也适用:

“但是,其他值(例如符号值)直到存储分配后才知道或不需要。这些值稍后评估,当其他信息(例如输出部分的大小)可用于符号分配时表达式。”

建议在内存分配中使用硬编码值

【讨论】:

  • 叹息。这就是我所担心的——感谢您的清晰解释。
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2016-04-25
  • 2012-01-15
  • 2016-02-05
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
相关资源
最近更新 更多