undefined reference to ‘end‘
相关问题:
一、undefined reference to `_exit
undefined reference to ‘end‘
warning: _close is not implemented and will always fail
一、环境:
ubuntu24.04实体机、
arm-none-eabi-gcc gcc version 13.2.1 20231009 (15:13.2.rel1-2)
二、问题:
/usr/lib/gcc/arm-none-eabi/13.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/13.2.1/../../../arm-none-eabi/lib/libnosys.a(sbrk.o): in function `_sbrk':
/build/newlib-38V0JC/newlib-4.4.0.20231231/build/arm-none-eabi/libgloss/../../../libgloss/libnosys/sbrk.c:21:(.text+0x28): undefined reference to `end'
三、分析:
这个错误来自 newlib-nano 的 libnosys/sbrk.c
,它试图使用符号 end
来初始化堆的起始地址,但你的链接器脚本里没有定义它。
符号名必须是 _end
(带下划线),因为 sbrk.c
中用的是 extern char end;
,而 GNU LD 默认会把 _end
和 end
视为不同符号。
四、解决:
SECTIONS{
. = 0;
.text : {
user/startup_hc32l13x.o
*(.text)
}
.data : {
*(.data)
}
.bss : {
*(.bss)
}
}
SECTIONS{
. = 0;
.text : { /*写成 .text:{ 不对,要有空格。*/
*(.text) /*写成 *{.text} 不对,要为小括号。*/
}
.data : {
*(.data)
}
.bss : {
_sbss = .; /* define a global symbol at bss start */
__bss_start__ = _sbss;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
_ebss = .; /* define a global symbol at bss end */
__bss_end__ = _ebss;
end = .;
}
}
添加 end = .; 就好了