MCUXpresso项目Linux编译缺NewLib系统调用桩,为何Windows无需配置?
问题原因与解决方案
这个差异和Windows、Linux操作系统本身无关,是两个版本MCUXpresso自带的arm-none-eabi工具链的newlib库配置不同导致的。
1. Windows端(GCC 8.3.1)无需额外加库的原因
你当前Windows版本MCUXpresso自带的libcr_newlib_none.a已经内置了_exit、_kill、_getpid等newlib依赖的系统调用空桩实现,链接时可以直接找到对应符号,所以不会报未定义错误。
你可以通过以下命令验证这个结论,在Windows端工具链对应库目录下执行:
arm-none-eabi-nm libcr_newlib_none.a | grep "_exit"
输出会显示_exit符号已经在库中定义。
2. Linux端(GCC 10.2.1)需要加libnosys.a的原因
对应GCC 10.2.1版本的MCUXpresso工具链,对newlib相关的静态库做了拆分,libcr_newlib_none.a不再内置系统调用桩的实现,这部分功能被单独拆分到libnosys.a中,所以缺少这部分实现时就会抛出你遇到的未定义符号报错:
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-abort.o): in function `abort': abort.c:(.text.abort+0xa): undefined reference to `_exit' arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-signalr.o): in function `_kill_r': signalr.c:(.text._kill_r+0xe): undefined reference to `_kill' arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-signalr.o): in function `_getpid_r': signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid' ...
你原来的链接脚本GROUP段只包含了以下库,缺少libnosys.a:
GROUP ( "libgcc.a" "libc_nano.a" "libm.a" "libcr_newlib_none.a" )
兼容方案
如果要实现两个版本工具链的跨平台兼容,直接在GROUP段中固定添加"libnosys.a"即可,不会产生额外副作用,libnosys.a中的空桩实现和旧版本libcr_newlib_none.a内置的实现逻辑完全一致。
也可以在MCUXpresso项目配置中操作:
- 打开【C/C++ Build -> Settings -> Tool Settings -> MCU Linker -> Libraries】
- 在库列表中添加
nosys,效果和修改链接脚本一致。
内容的提问来源于stack exchange,提问作者Vala
相关产品推荐
相关产品推荐

