我一直在阅读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
。
但是,如果链接描述文件可以包含多个SECTIONS
或MEMORY
命令,则可以辅助非平凡的链接器脚本体的可维护性。例如。如果:
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。