<div dir="ltr"><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">Dear developers of </span>

<span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">Newlib</span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">,</span><div><font color="#000000" face="arial, helvetica, sans-serif"><span style="font-size:16px"><br></span></font></div><div><font color="#000000" face="arial, helvetica, sans-serif"><span style="font-size:16px">I think we have a bit of an issue concerning usage of <b>__assert_func </b>function in the current version of the standard library.</span></font></div><div><font color="#000000" face="arial, helvetica, sans-serif"><span style="font-size:16px"><br></span></font><div><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">Let me describe what I've stumbled upon.</span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> </span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">I'm using "Arm GNU Toolchain" for embedded software development. This toolchain is shipped with Newlib's standard library. Up until recently I've been using the old version of the toolchain (released in 2019). When I tried to update to the newer one, I faced a problem. My project is being built without any errors or warnings with the old toolchain, but when I try to build it with the newer version I get these errors:<br></span><div>ld.exe: PathToCompiler/../lib/gcc/arm-none-eabi/13.2.1/thumb/v7e-m+fp/hard\libg.a(libc_a-closer.o): in function `_close_r':<br>closer.c:(.text._close_r+0xc): undefined reference to `_close'<br>PathToCompiler/ld.exe: PathToCompiler/../lib/gcc/arm-none-eabi/13.2.1/thumb/v7e-m+fp/hard\libg.a(libc_a-lseekr.o): in function `_lseek_r':<br>lseekr.c:(.text._lseek_r+0x14): undefined reference to `_lseek'<br>PathToCompiler/ld.exe: PathToCompiler/../lib/gcc/arm-none-eabi/13.2.1/thumb/v7e-m+fp/hard\libg.a(libc_a-readr.o): in function `_read_r':<br>readr.c:(.text._read_r+0x14): undefined reference to `_read'<br>PathToCompiler/ld.exe: PathToCompiler/../lib/gcc/arm-none-eabi/13.2.1/thumb/v7e-m+fp/hard\libg.a(libc_a-writer.o): in function `_write_r':<br>writer.c:(.text._write_r+0x14): undefined reference to `_write'<br>PathToCompiler/ld.exe: PathToCompiler/../lib/gcc/arm-none-eabi/13.2.1/thumb/v7e-m+fp/hard\libg.a(libc_a-fstatr.o): in function `_fstat_r':<br>fstatr.c:(.text._fstat_r+0x12): undefined reference to `_fstat'<br>PathToCompiler/ld.exe: PathToCompiler/../lib/gcc/arm-none-eabi/13.2.1/thumb/v7e-m+fp/hard\libg.a(libc_a-isattyr.o): in function `_isatty_r':<br>isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'<br>PathToCompiler/ld.exe: PathToCompiler/../lib/gcc/arm-none-eabi/13.2.1/thumb/v7e-m+fp/hard\libg.a(libc_a-signalr.o): in function `_kill_r':<br>signalr.c:(.text._kill_r+0x12): undefined reference to `_kill'<br>PathToCompiler/ld.exe: PathToCompiler/../lib/gcc/arm-none-eabi/13.2.1/thumb/v7e-m+fp/hard\libg.a(libc_a-signalr.o): in function `_getpid_r':<br>signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'</div></div></div><div><br></div><div><font color="#000000" face="arial, helvetica, sans-serif"><span style="font-size:16px">The analysis of </span></font><span style="font-size:16px;color:rgb(0,0,0);font-family:arial,helvetica,sans-serif">cross reference table in the .map file showed me the source of these errors. Somehow, in the newer toolchain functions from the standard library </span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">(</span><b style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">strtod</b><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> in my case)</span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> call</span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> </span><b style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">"__assert_func"</b><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> which in turn lead to various system calls</span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">. I downloaded the latest Newlib version on the "main" branch and saw this code in</span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> the </span><i style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">newlib/libc/stdlib/mprec.h</i><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> </span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">file:</span></div><div><div style="color:rgb(204,204,204);background-color:rgb(31,31,31);font-family:Consolas,"Courier New",monospace;font-size:14px;line-height:19px;white-space:pre"><br><div><span style="color:rgb(197,134,192)">#define</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(86,156,214)">eBalloc</span><span style="color:rgb(86,156,214)">(</span><span style="color:rgb(156,220,254)">__reent_ptr</span><span style="color:rgb(86,156,214)">, </span><span style="color:rgb(156,220,254)">__len</span><span style="color:rgb(86,156,214)">) ({ </span><span style="color:rgb(215,186,125)">\</span></div><div><span style="color:rgb(86,156,214)">   void </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(86,156,214)">__ptr </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(86,156,214)">Balloc</span><span style="color:rgb(86,156,214)">(__reent_ptr, __len); </span><span style="color:rgb(215,186,125)">\</span></div><div><span style="color:rgb(86,156,214)">   </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(86,156,214)"> (__ptr </span><span style="color:rgb(212,212,212)">==</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(86,156,214)">NULL</span><span style="color:rgb(86,156,214)">) </span><span style="color:rgb(215,186,125)">\</span></div><div><span style="color:rgb(86,156,214)">     </span><span style="color:rgb(220,220,170)">__assert_func</span><span style="color:rgb(86,156,214)">(</span><span style="color:rgb(86,156,214)">__FILE__</span><span style="color:rgb(86,156,214)">, </span><span style="color:rgb(86,156,214)">__LINE__</span><span style="color:rgb(86,156,214)">, (char </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(86,156,214)">)</span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(86,156,214)">, </span><span style="color:rgb(206,145,120)">"Balloc succeeded"</span><span style="color:rgb(86,156,214)">); </span><span style="color:rgb(215,186,125)">\</span></div><div><span style="color:rgb(86,156,214)">   __ptr; </span><span style="color:rgb(215,186,125)">\</span></div><div><span style="color:rgb(86,156,214)">   })</span></div></div></div><div><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"><br></span></div><div><font color="#000000" face="arial, helvetica, sans-serif"><span style="font-size:16px">According to <i>git log</i> this <b>eBalloc</b> macro was introduced in commit with </span></font>f88aece242178ff0c187d56e34a79645fbc44a23 <font color="#000000" face="arial, helvetica, sans-serif"><span style="font-size:16px">hash on October 4th 2019. This leads to several functions in the standard library calling <b>__assert_func</b> inside them. Standard definition of this function in </span></font><i style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">newlib/libc/stdlib/assert.c</i><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> calls <b>abort</b> and <b>fiprintf</b> functions which in turn drag a lot of system functions (see error log that I mentioned above).</span></div><div><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"><br></span></div><div><font color="#000000" face="arial, helvetica, sans-serif"><span style="font-size:16px">This leads to several issues:</span></font></div><div><ul><li><font color="#000000" face="arial, helvetica, sans-serif"><span style="font-size:16px">If I want to use some functions from the standard library (like <b>strtod</b>) but I don't want any system calls, I need to redefine <b>__assert_func</b> in my project. I have to do it even if I don't use assert's anywhere in my own code.</span></font></li><li><font color="#000000" face="arial, helvetica, sans-serif"><span style="font-size:16px">There is a project where I use <assert.h> and my own implementation of <b>__assert_func. </b>I expect that when I build my project with NDEBUG macro defined (release configuration), I would not see any calls to that function. That is not the case if any function from Newlib's standard library that uses <b>eBalloc</b> macro gets linked.</span></font></li></ul><div><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">I think this behaviour is too implicit and needs to be fixed. </span><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">I suggest removing </span><b style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">__assert_func</b><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> from </span><b style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">eBalloc</b><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"> macro or making some other changes to Newlib that will get rid of the mentioned issues.</span></div></div><div><br></div><div><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">I would really appreciate any feedback on this matter.</span></div><div><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px"><br></span></div><div><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">Kind regards,</span></div><div><span style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:16px">Alexander Tarasov</span></div></div>