Why system call stubs in NewLib are needed only on Linux and not on Windows?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Why system call stubs in NewLib are needed only on Linux and not on Windows?

2,828 Views
Vvj232
Contributor I

I have a project in MCUXpresso with a custom linker file. The project builds fine on Windows but it fails on Linux. On Linux, the linker fails with the following error (the compiler paths are shortened):

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'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-writer.o): in function `_write_r':
writer.c:(.text._write_r+0x10): undefined reference to `_write'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-closer.o): in function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-fstatr.o): in function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-isattyr.o): in function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-lseekr.o): in function `_lseek_r':
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-readr.o): in function `_read_r':
readr.c:(.text._read_r+0x10): undefined reference to `_read'

The linker file originally "includes" the following static libraries:

GROUP (
"libgcc.a"
"libc_nano.a"
"libm.a"
"libcr_newlib_none.a"
)

Now, I can get the linker successfully do its job by adding `"libnosys.a"` to the GROUP statement. That's where it gets confusing for me. Why do these new stubs in libnosys.a are needed only on Linux? How and where are they defined in Windows? What am I missing?

GCC version on my Windows and Linux are `8.3.1` and `10.2.1`, respectively, as they come bundled with different versions of MCUXpresso.

Thanks in advance!

0 Kudos
Reply
6 Replies

2,632 Views
james_itl
Contributor I

We have the same issue with an IDE-managed linker script and NewlibNano (none).

  • Windows 10, MCUXpresso v11.2.1 - build succeeds
  • Windows 10, MCUXpresso v11.4.1 - build fails with errors

c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-writer.o): in function `_write_r':
writer.c:(.text._write_r+0x10): undefined reference to `_write'
c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-closer.o): in function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-lseekr.o): in function `_lseek_r':
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-readr.o): in function `_read_r':
readr.c:(.text._read_r+0x10): undefined reference to `_read'
c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-signalr.o): in function `_kill_r':
signalr.c:(.text._kill_r+0xe): undefined reference to `_kill'
c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-signalr.o): in function `_getpid_r':
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-fstatr.o): in function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-isattyr.o): in function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/nxp/mcuxpressoide_11.4.1_6260/ide/plugins/com.nxp.mcuxpresso.tools.win32_11.4.0.202103011116/tools/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-abort.o): in function `abort':
abort.c:(.text.abort+0xa): undefined reference to `_exit'

This happened when we updated to MCUXpresso 11.4.1.

Please look into this and fix the bundled libraries.

0 Kudos
Reply

2,752 Views
Vvj232
Contributor I

Thanks for your reply!

You were right. 

  • The problem was indeed related to version. I was running MCUXpresso `11.4.1` on Linux and `11.1.0` on Windows. I also tried `11.4.1` on Windows and I got the same issue on Windows as well.
  • So the main difference is in either libcr_newlib_none.a  or libc_nano.a that come with MCUXpresso 11.4.1. Either libc_newlib_none.a in version 11.4.1 is not implementing what it used to in 11.1.0 or the libc_nano.a library is requiring additional references that are not present in libcr_newlib_none.a.
  • I also compared the GCC folder that comes with MCUXpresso with the one that I directly downloaded from ARM. The noticeable difference was that libcr_newlib_none.a is not available in the original GCC folder. Is this library specific to NXP? Is it open source? Is there any documentation? What is the side effect of replacing it with libnosys.a?
0 Kudos
Reply

2,738 Views
converse
Senior Contributor V

I’d suggest you create a project, letting the IDE build the linker script and see what it uses. Perhaps libcr_… does not exist on 11.4.1?

0 Kudos
Reply

2,734 Views
Vvj232
Contributor I

libcr_newlib_none.a does exist otherwise GCC linker would complain.

0 Kudos
Reply

2,810 Views
ZhangJennie
NXP TechSupport
NXP TechSupport

 

For Linux project, please create a new project under Linux version or start your project based on a Linux SDK demo.

 

0 Kudos
Reply

2,803 Views
converse
Senior Contributor V

This comment from NXP surprises me.- as it is wrong. The whole point of MCUXpresso is that it is cross platform, and our site uses both Windows and Linux installs and the projects interchangeably. In fact the projects supplied with MCUXPresso can be opened in windows Linux and Mac, so the statement is obviously wrong.

as regards the original question, I would guess it is more to do with using different versions between Linux and Windows and nothing to do with what you are doing. Make sure you are using identical releases on both platforms.

0 Kudos
Reply