为什么链接描述文件会有多个段命令?
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
.
也是如此
但是,链接器脚本的重要主体的可维护性是
如果链接描述文件 可以 包含多个 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
}
比它更简单的东西,它可能会更好地重构为:
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.
中没有
我一直在阅读 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.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.