我有一个使用GCC工具链的微控制器项目。
gcc version 4.7.4 20130913 (release) [ARM/embedded-4_7-branch revision 202601]
控制器有512k闪存。第一个64k由引导加载程序占用,448k仍然用于项目。我定义了一个链接器脚本,其中包含FLASH和RAM的大小。我还添加了部分。这是一段摘录:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00010000, LENGTH = 448K
RAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
}
SECTIONS
{
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
} > FLASH
.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(.fini_array*))
PROVIDE_HIDDEN (__fini_array_end = .);
_eflash = .;
} >FLASH
/* used by the startup to initialize data */
_sidata = .;
.data : AT ( _sidata )
{
*(.data) /* .data sections */
*(.data*) /* .data* sections */
_edata = .; /* define a global symbol at data end */
} >RAM
}
链接器可以很好地将所有部分放在它们的位置。问题是链接器不会检查位置.data
的FLASH中是否有足够的空间用于.data*
和_sidata
部分。结果输出超出内存大小,没有任何警告。
如何调整链接描述文件以便ld在大小计算中使用初始化数据(.data)?
编辑:是否有任何命令行选项来强制执行合理的数据放置?
答案 0 :(得分:3)
使用ASSERT可以显示此链接器故障:
/* used by the startup to initialize data */
_sidata = .;
.data : AT ( _sidata )
{
_sdata = .;
*(.data) /* .data sections */
*(.data*) /* .data* sections */
_edata = .; /* define a global symbol at data end */
} >RAM
/* verify that the initialization data fits in FLASH */
ASSERT(
(_sidata + (_edata - _sdata)) <= (ORIGIN(FLASH) + LENGTH(FLASH)),
"Initialization Data blow up")
}