Re: Correct usage of nosys

Niklas Dusenlund <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <CAAHv3KGHbDD1hHNbtTdt6eH-Kce2_ykdzOBsO1ezpYVaKmZa0g@mail.gmail.com>
I am calling printf and I have an implementation of `_write` (in the same
file that I attempted to add `_fstat`) that works.

I already produce the map file for other purposes. How do I use that to see
the "call trees"?


- Niklas


On Tue, 18 Feb 2025 at 12:54, Richard Earnshaw (lists) <
[email protected]> wrote:

> 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.
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.