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

问题描述 投票:2回答:1

我一直在阅读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个回答
2
投票

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

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

相当于:

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

同样对于MEMORY

但是,如果链接描述文件可以包含多个SECTIONSMEMORY命令,则可以辅助非平凡的链接器脚本体的可维护性。例如。如果:

foobar.龙斗士 (1)

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

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

它不是那么简单,它可能更好地重构为:

foobar.龙斗士 (2)

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

foo.龙斗士

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

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

把人.龙斗士

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

SECTIONS
{
    .bar : {
        *(.bar)
    } > BARMEM
}

以便foobar.lds(2)被链接器扩展为

foobar.龙斗士 (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

© www.soinside.com 2019 - 2024. All rights reserved.