为什么链接描述文件会有多个段命令?

Why would a linker script have multiple section commands?

我一直在阅读 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" 命令(每个命令都有自己的部分定义块)的原因,而不是一般情况下有单独部分的原因。

编写多个 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, 我们可以找到约束条件:

You may use at most one SECTIONS command in a script file, but you can have as many statements within it as you wish.

和:

A command file may contain at most one use of the MEMORY command; however, you can define as many blocks of memory within it as you wish.

the current manual.

中没有