From fe09d8d4d3c8c663217be1d1db49fb579bfdadbe Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Fri, 14 Feb 2020 15:16:46 +1100 Subject: libcsupport/newlib: Call newlib's __sinit to force reent initialisation - Newlib overtites any FILE pointers set in stdin, stdout or stderr. Closes #3870 --- cpukit/libcsupport/src/newlibc_reent.c | 5 ++++- testsuites/libtests/newlib01/init.c | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/cpukit/libcsupport/src/newlibc_reent.c b/cpukit/libcsupport/src/newlibc_reent.c index 430157cf0f..6dc0b1eeaa 100644 --- a/cpukit/libcsupport/src/newlibc_reent.c +++ b/cpukit/libcsupport/src/newlibc_reent.c @@ -44,7 +44,10 @@ bool newlib_create_hook( } #endif - _REENT_INIT_PTR((creating_task->libc_reent)); /* GCC extension: structure constants */ + extern void __sinit (struct _reent *s); + struct _reent *reent = (struct _reent *) creating_task->libc_reent; + _REENT_INIT_PTR((reent)); /* GCC extension: structure constants */ + __sinit( reent ); return true; } diff --git a/testsuites/libtests/newlib01/init.c b/testsuites/libtests/newlib01/init.c index f9d39368d2..a8e5b3926c 100644 --- a/testsuites/libtests/newlib01/init.c +++ b/testsuites/libtests/newlib01/init.c @@ -245,6 +245,10 @@ static void test(void) int rv; rtems_resource_snapshot snapshot; + rtems_test_assert(fileno(stdout) >= 0); + rtems_test_assert(fileno(stdin) >= 0); + rtems_test_assert(fileno(stderr) >= 0); + ctx->main_task_id = rtems_task_self(); rtems_resource_snapshot_take(&snapshot); @@ -275,6 +279,10 @@ static void test(void) sc = rtems_task_delete(ctx->worker_task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(fileno(stdout) >= 0); + rtems_test_assert(fileno(stdin) >= 0); + rtems_test_assert(fileno(stderr) >= 0); + rv = unlink(&file_path[0]); rtems_test_assert(rv == 0); -- cgit v1.2.3