编译报错—undefined reference to `_sbrk‘

背景:在cortex_M3使用freeRTOS开启启用运行时间统计功能时。

在编译阶段编译报错:

/data/user_home//build_tools/gcc-arm-none-eabi-/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v7-m/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':

sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'

collect2: error: ld returned 1 exit status

Makefile:155: recipe for target 'all' failed

make: *** [all] Error 1


原因:ARM gcc默认是使用startfiles,导致调用底层未实现的某些函数(malloc free sprintf…)时,编译链接失败。

推广:如果编译报undefined reference to `_sbrk' `_read' `_write' `_lseek' `_isatty' `_fstat' 也是相同原因。


解决方案:

方案一:如果项目不需要这些函数,找到直接屏蔽函数即可。

方案二:一劳永逸。链接失败是因为未实现这些,所以可以自己重写这些底层函数或者添加有这些函数的库文件,比如libnosys.a 添加编译参数 --specs=nosys.specs 即可使用。

添加后如果编译报以下错误:

/data/user_home/ /build_tools/gcc-arm-none-eabi-/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/thumb/v7-m/libnosys.a(sbrk.o): In function `_sbrk':

sbrk.c:(.text._sbrk+0x18): undefined reference to `end'

collect2: error: ld returned 1 exit status

Makefile:155: recipe for target 'all' failed

make: *** [all] Error 1

这是由于’end’ symbol.lds链接器脚本中未定义,所以找到项目的xx.lds文件设置该脚本用于堆位置,例如:

  .heap :

  {

    . = ALIGN(4);

    __HEAP_START = .;

    . += 0x2000; __HEAP_MAX = .;

    end = __HEAP_MAX;

     PROVIDE(end = .);

  } > ram

C:\Users\fan_cuo\Desktop\arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi\bin\arm-none-eabi-gcc.exe C:\Users\fan_cuo\CLionProjects\untitled5\main.c -o main C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/bin/ld.exe: C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/lib\libc.a(libc_a-exit.o): in function `exit': exit.c:(.text.exit+0x28): undefined reference to `_exit' C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/bin/ld.exe: C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/lib\libc.a(libc_a-closer.o): in function `_close_r': closer.c:(.text._close_r+0x18): undefined reference to `_close' C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/bin/ld.exe: C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/lib\libc.a(libc_a-lseekr.o): in function `_lseek_r': lseekr.c:(.text._lseek_r+0x24): undefined reference to `_lseek' C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/bin/ld.exe: C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/lib\libc.a(libc_a-readr.o): in function `_read_r': readr.c:(.text._read_r+0x24): undefined reference to `_read' C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/bin/ld.exe: C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/lib\libc.a(libc_a-writer.o): in function `_write_r': writer.c:(.text._write_r+0x24): undefined reference to `_write' C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/bin/ld.exe: C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/lib\libc.a(libc_a-sbrkr.o): in function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk' C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/bin/ld.exe: C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/lib\libc.a(libc_a-fstatr.o): in function `_fstat_r': fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat' C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/bin/ld.exe: C:/Users/fan_cuo/Desktop/arm-gnu-toolchain-14.3.rel1-mingw-w64-i686-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.3.1/../../../../arm-none-eabi/lib\libc.a(libc_a-isattyr.o): in function `_isatty_r': isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty' collect2.exe: error: ld returned 1 exit status 还是报错
11-01
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值