Re: Correct usage of nosys
"Richard Earnshaw (lists)" <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
On 18/02/2025 08:18, Niklas Dusenlund wrote:
> Hi!
>
> I'm compiling for ARM cortex-m0. When I enable the nosys specs I get the following warnings:
>
> ```
> /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/lib/libc_nano.a(libc_a-fstatr.o): in function `_fstat_r':
> fstatr.c:(.text._fstat_r+0x1c): warning: _fstat is not implemented and will always fail
> /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/lib/libc_nano.a(libc_a-fstatr.o): note: the message above does not take linker garbage collection into account
> /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/lib/libc_nano.a(libc_a-isattyr.o): in function `_isatty_r':
> isattyr.c:(.text._isatty_r+0x18): warning: _isatty is not implemented and will always fail
> /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/lib/libc_nano.a(libc_a-isattyr.o): note: the message above does not take linker garbage collection into account
> ```
>
> I have no intention of using fstat or isatty. But if I implement the missing functions like this:
>
> ```
> int _fstat(int fildes, struct stat *st) {
> errno = ENOSYS;
> return -1;
> }
> int _isatty(int file) { return -1; }
> ```
>
> I get the following errors:
>
> ```
> /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/lib/libc_nano.a(libc_a-isattyr.o): in function `_isatty_r':
> isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'
> /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/bin/../lib/gcc/arm-none-eabi/13.3.1/../../../../arm-none-eabi/lib/libc_nano.a(libc_a-fstatr.o): in function `_fstat_r':
> fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'
> ```
>
> If I remove the nosys specs I also get undefined references to _exit and _sbrk.
>
> In older versions of newlib I could use nano+nosys without warnings. What is the appropriate way with the latest newlib? If I need to link in my own stubs, how do I actually do that?
>
> - Niklas
_fstat_r is the low-level implementation of fstat (), but something else is probably calling that.
This can happen if there is a chain of function calls from your code to this function. To find out why you'll need to get the linker to produce a map file with -Map=<file>. The map will show which function was called that resulted in _fstat_r being needed and you can then recurse back to find which function in your code needed something that resulted in that.
Are you, for example, calling printf somewhere, or using an assert?
R.