<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, May 19, 2021 at 12:27 AM Sebastian Huber <<a href="mailto:sebastian.huber@embedded-brains.de">sebastian.huber@embedded-brains.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello Joel,<br>
<br>
On 18/05/2021 23:40, Joel Sherrill wrote:<br>
> Hi<br>
> <br>
> In working with Alex to reduce the minimum on his new BSP, we noticed <br>
> that it is easy for a BSP to accidentally trip up and end up with a <br>
> minimum.exe that is as much as 2x over what it should be. I have looked <br>
> at a few BSPs and seen a handful of issues so far. I have patches <br>
> pending for some. This particular issue I think indicates a dependency <br>
> path that is too heavy. I spotted this on powerpc/psim and likely <br>
> impacts a number of BSPs. I made two minor changes reduced the size of <br>
> minimum.exe as shown below<br>
> <br>
>       text    data     bss     dec     hex filename<br>
>    66616   11848 268356980 268435444     ffffff4 minimum.exe<br>
>    45064    5884 268384476 268435424     fffffe0 minimum.exe<br>
> <br>
> FWIW That 45K is larger than the ARM or MIPS BSPs I looked at but seems <br>
> reasonable due to all the PPC helper and IRQ code pulled in.<br>
> <br>
> psim  does two things that the arm and mips BSPs I looked at do not. It <br>
> uses the powerpc shared sbrk.c and it calls malloc() from its <br>
> irq_init.c. malloc() and sbrk() set errno. Commenting out setting errno <br>
> in those two methods is what resulted in 21.5K text and 6K data saved.<br>
<br>
we have an rtems_malloc() and rtems_calloc() which do not set errno.<br></blockquote><div><br></div><div>OK. This and not setting errno in the PPC sbrk() are sufficient to break this</div><div>particular chain. </div><div><br></div><div>This means that BSPs and device drivers need to be careful not to call </div><div>malloc(). </div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> <br>
> I think setting errno doesn't directly add this much code but the <br>
> sysinit dependency chain it trips ends up pulling in getreent, <br>
> rtems_libio_init, rtems_libio_post_driver (opening /dev/console), open, <br>
> atexit(), close(), rtems_filesystem_do_unmount() and a host of other <br>
> things. I am not sure of the exact order of the chain but that's the end <br>
> result.I do think it starts with getreent though.<br>
<br>
Yes, if you use __getreent() with<br>
<br>
#define CONFIGURE_DISABLE_NEWLIB_REENTRANCY<br>
<br>
then a lot of stuff is pulled in.<br>
<br>
If you don't use this option, then a lot of stuff is pulled in by the <br>
Newlib extensions.<br></blockquote><div><br></div><div>Yeah. But if you use any method with errno, you get all this. I know the </div><div>reent structure has to be initialized but why did it trigger opening </div><div>/dev/console? The console device wasn't configured. Can the post driver </div><div>hook dependency be cleaved from this chain? </div><div><br></div><div><a href="https://git.rtems.org/rtems/tree/cpukit/libcsupport/src/libio_init.c#n69">https://git.rtems.org/rtems/tree/cpukit/libcsupport/src/libio_init.c#n69</a><br></div><div><br></div><div>I think that dependency is only needed if you configure the console </div><div>device driver. Shouldn't the sysinit for the post driver hook be part of</div><div>configuring the console or simple console?<br><br><a href="https://git.rtems.org/rtems/tree/cpukit/include/rtems/confdefs/console.h">https://git.rtems.org/rtems/tree/cpukit/include/rtems/confdefs/console.h</a><br></div><div><a href="https://git.rtems.org/rtems/tree/cpukit/include/rtems/confdefs/iodrivers.h">https://git.rtems.org/rtems/tree/cpukit/include/rtems/confdefs/iodrivers.h</a><br></div><div><br></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> <br>
> It would be nice to call a method that uses errno without automatically <br>
> pulling in this much baggage via a long dependency chain.<br>
> <br>
> Alternatively, the BSPs should use a malloc alternative that does not <br>
> set errno. And our sbrk is only used in one place so it could simply not <br>
> set errno.<br>
> <br>
> Fixing the dependency chain is the preferred solution.<br>
<br>
I am not sure how the dependency chain can be fixed with the current <br>
struct _reent approach of Newlib. A modern approach would be to replace <br>
this structure with individual thread-local objects. This would be <br>
technically feasible, however, a lot of work.<br></blockquote><div><br></div><div>How about just not opening /dev/console? This will eliminate a lot of the</div><div>chain. </div><div><br></div><div><a href="https://git.rtems.org/rtems/tree/cpukit/libcsupport/src/open_dev_console.c">https://git.rtems.org/rtems/tree/cpukit/libcsupport/src/open_dev_console.c</a><br></div><div><br></div><div>That pulls in open, atexit, and close as a starting point. libio_init by itself</div><div>without the link to the post driver open(/dev/console) doesn't look that bad</div><div><br></div><div>--joel</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
-- <br>
embedded brains GmbH<br>
Herr Sebastian HUBER<br>
Dornierstr. 4<br>
82178 Puchheim<br>
Germany<br>
email: <a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-brains.de</a><br>
phone: +49-89-18 94 741 - 16<br>
fax:   +49-89-18 94 741 - 08<br>
<br>
Registergericht: Amtsgericht München<br>
Registernummer: HRB 157899<br>
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler<br>
Unsere Datenschutzerklärung finden Sie hier:<br>
<a href="https://embedded-brains.de/datenschutzerklaerung/" rel="noreferrer" target="_blank">https://embedded-brains.de/datenschutzerklaerung/</a><br>
</blockquote></div></div>