我有以下链接脚本:
.data
和 .bss
被放置到内存中,然后 .heap
部分填充剩余的内存。
现在我想添加一个 .noinit
节,它总是被放置在内存的末尾。这样它就会被引导装载程序之类的程序忽略。
我仍然希望我的 .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))
-不过这是一个语法错误。
那么,如何在不首先将输入部分放入输出部分的情况下获得输入部分的大小呢?