代码之家  ›  专栏  ›  技术社区  ›  fearless_fool

定义GNU的符号常数。ld脚本源

  •  1
  • fearless_fool  · 技术社区  · 7 年前

    我正在创建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\u地址 是常数吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   user3629249    7 年前

    对于内存,LD手册规定:

    原点是内存区域起始地址的表达式。在执行内存分配之前,该表达式必须求值为常数,这意味着您不能使用任何节相关符号。关键字原点可以缩写为org或o(但不能缩写为org)

    和表达式: BASE_ADDR = 0X4000; 是截面相对符号

    以下文本也适用于:

    然而,其他值(如符号值)直到存储分配后才知道或需要。当其他信息(如输出段的大小)可用于符号分配表达式时,这些值将在以后进行计算

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