libcsupport/newlib: Call newlib's __sinit to force reent initialisation

- Newlib overtites any FILE pointers set in stdin, stdout or stderr.

Closes #3870
This commit is contained in:
Chris Johns
2020-02-14 15:16:46 +11:00
parent 33c82ddba1
commit fe09d8d4d3
2 changed files with 12 additions and 1 deletions

View File

@@ -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;
}

View File

@@ -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);