【发布时间】:2019-10-06 07:22:11
【问题描述】:
我有以下链接器脚本:
.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)) - 但是这是一个语法错误。
那么如何在不先将输入部分放入输出部分的情况下获得输入部分的大小?
【问题讨论】:
-
在这里查看一些有趣的答案/cmets:stackoverflow.com/questions/18647590/…
-
回答这里可以得到你想要的:stackoverflow.com/a/55126837/3869724
标签: ld linker-scripts