【问题标题】:Why would a linker script have multiple section commands?为什么链接描述文件会有多个节命令?
【发布时间】:2019-04-11 17:45:57
【问题描述】:

我一直在阅读sections documentation for ld,但有些不清楚。

鉴于部分链接器脚本:

MEMORY
{
  FLASH1 (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
  FLASH2 (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
}

SECTIONS
{
  .some_code :
  {
    KEEP(*(SORT(.some_code*)))
  } > FLASH1
}
SECTIONS
{
  .my_page :
  {
    KEEP(*(SORT(.my_page*)))
  } > FLASH2
}

有没有理由在上面的单个链接器脚本中包含 2 个部分命令,而不是在下面的 1 个部分命令中包含所有命令?

SECTIONS
{
  .some_code :
  {
    KEEP(*(SORT(.some_code*)))
  } > FLASH1
  .my_page :
  {
    KEEP(*(SORT(.my_page*)))
  } > FLASH2
}

或者它们是等价的。是否还有其他情况需要像这样拆分?

补充说明:我要求有单独的“SECTIONS”命令(每个都有自己的部分定义块)的原因,而不是一般情况下要求单独的部分的原因。

【问题讨论】:

    标签: embedded ld


    【解决方案1】:

    编写多个SECTIONS 命令并非不可避免, 或MEMORY 命令,在链接描述文件中。

    SECTIONS
    {
        /* Commands... */
    }
    SECTIONS
    {
        /* More commands... */
    }
    

    相当于:

    SECTIONS
    {
        /* Commands... */
        /* More commands... */
    }
    

    MEMORY 也是如此。

    然而,一个重要的链接器脚本主体的可维护性是 如果链接描述文件可以包含多个 SECTIONSMEMORY 命令。例如。如果:

    foobar.lds (1)

    MEMORY
    {
        FOOMEM (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
        BARMEM (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
    }
    
    SECTIONS
    {
        .foo : {
            *(.foo)
        } > FOOMEM
        .bar : {
            *(.bar)
        } > BARMEM
    }
    

    如果不是那么琐碎的事情,它可能会更好地重构为:

    foobar.lds (2)

    INCLUDE ./foo.lds
    INCLUDE ./bar.lds
    

    foo.lds

    MEMORY
    {
        FOOMEM (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
    }
    
    SECTIONS
    {
        .foo : {
            *(.foo)
        } > FOOMEM
    }
    

    bar.lds

    MEMORY
    {
        BARMEM (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
    }
    
    SECTIONS
    {
        .bar : {
            *(.bar)
        } > BARMEM
    }
    

    这样foobar.lds (2) 被链接器扩展为

    foobar.lds (3)

    MEMORY
    {
        FOOMEM (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
    }
    
    SECTIONS
    {
        .foo : {
            *(.foo)
        } > FOOMEM
    }
    
    MEMORY
    {
        BARMEM (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
    }
    
    SECTIONS
    {
        .bar : {
            *(.bar)
        } > BARMEM
    }
    

    历史记录:在this obselete GNU ld manual from bygone days, 我们可以找到约束:

    您最多可以在一个脚本文件中使用一个 SECTIONS 命令,但您可以在其中包含任意数量的语句。

    和:

    一个命令文件最多可以包含一次 MEMORY 命令的使用;但是,您可以在其中定义任意数量的内存块。

    the current manual 中没有。

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 2015-12-23
      • 1970-01-01
      • 2013-05-17
      • 2019-11-27
      • 1970-01-01
      • 2017-05-12
      • 2012-04-06
      • 2022-06-25
      相关资源
      最近更新 更多