Trying to build newlib with -DMALLOC_PROVIDED

Stephan Mühlstrasser stephan.muehlstrasser@web.de
Wed Apr 19 19:40:00 GMT 2017


Hello Jeff,

Am 19.04.2017 um 20:27 schrieb Jeff Johnston:
> Stephan,
>
> From newlib/libc/include/reent.h:
>
>    The target may provide the needed syscalls by any of the following:
>
>    1) Define the reentrant versions of the syscalls directly.
>       (eg: _open_r, _close_r, etc.).  Please keep the namespace clean.
>       When you do this, set "syscall_dir" to "syscalls" and add
>       -DREENTRANT_SYSCALLS_PROVIDED to newlib_cflags in configure.host.
>
>    2) Define namespace clean versions of the system calls by prefixing
>       them with '_' (eg: _open, _close, etc.).  Technically, there won't be
>       true reentrancy at the syscall level, but the library will be
> namespace
>       clean.
>       When you do this, set "syscall_dir" to "syscalls" in configure.host.
>
>    3) Define or otherwise provide the regular versions of the syscalls
>       (eg: open, close, etc.).  The library won't be reentrant nor namespace
>       clean, but at least it will work.
>       When you do this, add -DMISSING_SYSCALL_NAMES to newlib_cflags in
>       configure.host.
>
>    4) Define or otherwise provide the regular versions of the syscalls,
>       and do not supply functional interfaces for any of the reentrant
>       calls. With this method, the reentrant syscalls are redefined to
>       directly call the regular system call without the reentrancy argument.
>       When you do this, specify both -DREENTRANT_SYSCALLS_PROVIDED and
>       -DMISSING_SYSCALL_NAMES via newlib_cflags in configure.host and do
>       not specify "syscall_dir".

thanks for the pointer. I had read this, but I hadn't understood that 
"system calls" here also applies to the memory management functions.

I'm sorry, I still don't get it. Could you please explain briefly what I 
need to do in the following context:

- For a start I want to compile newlib without implementing any of the 
system calls now. This should give me the dummy implementations from 
libnosys, right?

- I have reentrant versions of malloc(), free(), realloc(), calloc() in 
a separate library of the target environment.

Thank you
Stephan

> Regards,
>
> -- Jeff J.
>
> On Wed, Apr 19, 2017 at 2:15 PM, Stephan Mühlstrasser
> <stephan.muehlstrasser@web.de <mailto:stephan.muehlstrasser@web.de>> wrote:
>
>     Hi,
>
>     I'm making my first attempt to build newlib for an ARM bare-metal
>     environment from the current master branch. malloc(), free() etc.
>     come from the bare-metal library, therefore I'm trying to build
>     newlib with -DMALLOC_PROVIDED, using other configurations in
>     newlib/configure.host as a blueprint.
>
>     I made this modification in newlib/configure.host for my target:
>
>       arm*-*-circleraspi0)
>         syscall_dir=syscalls
>         newlib_cflags="${newlib_cflags} -DMALLOC_PROVIDED"
>         ;;
>
>     I can successfully build newlib, and when I try to link a test
>     application that just calls printf() I get the following unresolved
>     symbols:
>
>     E:/Users/stm/Documents/GIT/newlib-raspi0/arm-none-circleraspi0/lib/libc.a(lib_a-vfprintf.o):
>     In function `_vfprintf_r':
>     vfprintf.c:(.text+0x1fcc): undefined reference to `_free_r'
>     vfprintf.c:(.text+0x215c): undefined reference to `_free_r'
>     E:/Users/stm/Documents/GIT/newlib-raspi0/arm-none-circleraspi0/lib/libc.a(lib_a-wsetup.o):
>     In function `__swsetup_r':
>     wsetup.c:(.text+0xcc): undefined reference to `_free_r'
>     E:/Users/stm/Documents/GIT/newlib-raspi0/arm-none-circleraspi0/lib/libc.a(lib_a-fflush.o):
>     In function `__sflush_r':
>     fflush.c:(.text+0x24c): undefined reference to `_free_r'
>     E:/Users/stm/Documents/GIT/newlib-raspi0/arm-none-circleraspi0/lib/libc.a(lib_a-findfp.o):
>     In function `__sfmoreglue':
>     findfp.c:(.text+0x130): undefined reference to `_malloc_r'
>
>     and also
>
>     E:/Users/stm/Documents/GIT/newlib-raspi0/arm-none-circleraspi0/lib/libc.a(lib_a-syscalls.o):
>     In function `_sbrk':
>     syscalls.c:(.text+0x984): undefined reference to `end'
>
>     I read various tutorials about porting newlib, and they suggest that
>     it should be possible to build without the reentrant versions of the
>     memory management functions. But I don't understand how that is
>     supposed to work in the source. For example in malloc.h:
>
>     extern _PTR malloc _PARAMS ((size_t));
>     #ifdef __CYGWIN__
>     #undef _malloc_r
>     #define _malloc_r(r, s) malloc (s)
>     #else
>     extern _PTR _malloc_r _PARAMS ((struct _reent *, size_t));
>     #endif
>
>     This looks like that only for __CYGWIN__ the reentrant variants are
>     defined away.
>
>     How can I build newlib for an environment that provides the memory
>     management functions that are already thread-safe?
>
>     Thanks in advance for any suggestions!
>
>     Best regards
>     Stephan
>
>



More information about the Newlib mailing list