我有以下连接脚本:
.data
和 .bss
被放置在 RAM 中,然后一个 .heap
段填充了剩余的内存。
现在我想添加一个 .noinit
段,它总是被放置在内存的末尾。这样 bootloaders 等程序会忽略它。
我仍然希望我的 .heap
段占据 .bss
和 .noinit
之间的所有可用空间,但为此我需要知道 .noinit
段的大小。
一种天真的方法失败了:
/* .bss section which is used for uninitialized data */
.bss (NOLOAD) :
{
. = ALIGN(4);
_sbss = . ;
_szero = .;
*(.bss .bss.*)
*(COMMON)
. = ALIGN(4);
_ebss = . ;
_ezero = .;
} > ram
/* heap section */
.heap (NOLOAD) :
{
. = ALIGN(4);
_sheap = . ;
. = ORIGIN(ram) + LENGTH(ram) - SIZEOF(.noinit);
_eheap = . ;
} > ram
/*
* collect all uninitialized sections that go into RAM
*/
.noinit (NOLOAD) :
{
. = ALIGN(4);
__noinit_start = .;
*(.noinit)
__noinit_end = .;
} > ram
这里SIZEOF(.noinit)
总是0,因为该语句之后才定义该节。
但实际上我想要的是SIZEOF(*(.noinit))
- 但这是一个语法错误。
那么,如何在不先将其放入输出节中的情况下获取输入节的大小呢?