鉴于部分链接器脚本:
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”命令(每个命令都有自己的部分定义块),而不是要求一般有单独部分的原因。
在链接描述文件中编写多个SECTIONS命令或MEMORY命令并非不可避免。
SECTIONS
{
/* Commands... */
}
SECTIONS
{
/* More commands... */
}
Run Code Online (Sandbox Code Playgroud)
相当于:
SECTIONS
{
/* Commands... */
/* More commands... */
}
Run Code Online (Sandbox Code Playgroud)
同样对于MEMORY.
但是,如果链接描述文件可以包含多个
命令SECTIONS或MEMORY命令,则有助于链接描述文件的重要主体的可维护性。例如,如果:
foobar.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)
比现在更重要的事情,它可能更好地重构为:
foobar.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)被链接器扩展为
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
}
Run Code Online (Sandbox Code Playgroud)
历史注释:在这本过时的 GNUld手册中,我们可以找到约束条件:
您最多可以在一个脚本文件中使用一个 SECTIONS 命令,但是您可以根据需要在其中包含任意数量的语句。
和:
一个命令文件最多可以包含一个 MEMORY 命令的使用;但是,您可以根据需要在其中定义任意数量的内存块。
当前手册中没有。