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

Tom*_*omE 5 embedded ld

我一直在阅读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
}
Run Code Online (Sandbox Code Playgroud)

是否有理由在上述单个链接描述文件中包含 2 个部分命令,而不是将其全部包含在如下所示的 1 个部分命令中?

SECTIONS
{
  .some_code :
  {
    KEEP(*(SORT(.some_code*)))
  } > FLASH1
  .my_page :
  {
    KEEP(*(SORT(.my_page*)))
  } > FLASH2
}
Run Code Online (Sandbox Code Playgroud)

或者它们是等价的。还有其他情况您想像这样拆分吗?

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

Mik*_*han 5

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

SECTIONS
{
    /* Commands... */
}
SECTIONS
{
    /* More commands... */
}
Run Code Online (Sandbox Code Playgroud)

相当于:

SECTIONS
{
    /* Commands... */
    /* More commands... */
}
Run Code Online (Sandbox Code Playgroud)

同样对于MEMORY.

但是,如果链接描述文件可以包含多个 命令SECTIONSMEMORY命令,则有助于链接描述文件的重要主体的可维护性。例如,如果:

foob​​ar.lds (1)

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

SECTIONS
{
    .foo : {
        *(.foo)
    } > FOOMEM
    .bar : {
        *(.bar)
    } > BARMEM
}
Run Code Online (Sandbox Code Playgroud)

比现在更重要的事情,它可能更好地重构为:

foob​​ar.lds (2)

INCLUDE ./foo.lds
INCLUDE ./bar.lds
Run Code Online (Sandbox Code Playgroud)

食物

MEMORY
{
    FOOMEM (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
}

SECTIONS
{
    .foo : {
        *(.foo)
    } > FOOMEM
}
Run Code Online (Sandbox Code Playgroud)

bar.lds

MEMORY
{
    BARMEM (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
}

SECTIONS
{
    .bar : {
        *(.bar)
    } > BARMEM
}
Run Code Online (Sandbox Code Playgroud)

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

foob​​ar.lds (3)

MEMORY
{
    FOOMEM (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
}

SECTIONS
{
    .foo : {
        *(.foo)
    } > FOOMEM
}

MEMORY
{
    BARMEM (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
}

SECTIONS
{
    .bar : {
        *(.bar)
    } > BARMEM
}
Run Code Online (Sandbox Code Playgroud)

历史注释:在这本过时的 GNUld手册中,我们可以找到约束条件:

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

和:

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

当前手册中没有。