From a315fb4ae5debba1925fb51ce8b5bb4f9f190e6b Mon Sep 17 00:00:00 2001 From: Maxim Logaev Date: Sun, 4 Jan 2026 20:38:37 +0300 Subject: [PATCH] newlib: Rollback stack allocation in startup code - Removed setting stack boundaries in TLS as libgcc is no longer used; - The startup code (crt0.o) is now universal and can be used without libc; - Fixed linker script: - The stack size is taken from the linker option "--stack". Default is 2MB; - Fixed names of exported symbols. - Added kolibrios/app.h for headers of executable files. Signed-off-by: Maxim Logaev --- libraries/newlib/newlib/Makefile.in | 20 ------- libraries/newlib/newlib/configure.host | 2 +- .../newlib/libc/include/kolibrios/app.h | 54 +++++++++++++++++++ .../newlib/libc/sys/kolibrios/Makefile.inc | 1 - .../newlib/newlib/libc/sys/kolibrios/_exit.c | 3 -- .../newlib/newlib/libc/sys/kolibrios/crt0.c | 28 ++++++++++ .../newlib/libc/sys/kolibrios/libc_init.c | 7 --- toolchain/kos-app.lds | 30 ++++++----- 8 files changed, 100 insertions(+), 45 deletions(-) create mode 100644 libraries/newlib/newlib/libc/include/kolibrios/app.h create mode 100644 libraries/newlib/newlib/libc/sys/kolibrios/crt0.c diff --git a/libraries/newlib/newlib/Makefile.in b/libraries/newlib/newlib/Makefile.in index 44528caad9..9cb9f54702 100644 --- a/libraries/newlib/newlib/Makefile.in +++ b/libraries/newlib/newlib/Makefile.in @@ -651,7 +651,6 @@ check_PROGRAMS = @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/write.c \ @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/getentropy.c \ @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/_exit.c \ -@HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/crt_start.S \ @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/libc_init.c \ @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/reent.c @@ -1957,7 +1956,6 @@ am__objects_51 = libc/ssp/libc_a-chk_fail.$(OBJEXT) \ @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/libc_a-write.$(OBJEXT) \ @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/libc_a-getentropy.$(OBJEXT) \ @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/libc_a-_exit.$(OBJEXT) \ -@HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/libc_a-crt_start.$(OBJEXT) \ @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/libc_a-libc_init.$(OBJEXT) \ @HAVE_LIBC_SYS_KOLIBRIOS_DIR_TRUE@ libc/sys/kolibrios/libc_a-reent.$(OBJEXT) @HAVE_LIBC_MACHINE_AARCH64_TRUE@am__objects_77 = libc/machine/aarch64/libc_a-memchr-stub.$(OBJEXT) \ @@ -8216,9 +8214,6 @@ libc/sys/kolibrios/libc_a-getentropy.$(OBJEXT): \ libc/sys/kolibrios/libc_a-_exit.$(OBJEXT): \ libc/sys/kolibrios/$(am__dirstamp) \ libc/sys/kolibrios/$(DEPDIR)/$(am__dirstamp) -libc/sys/kolibrios/libc_a-crt_start.$(OBJEXT): \ - libc/sys/kolibrios/$(am__dirstamp) \ - libc/sys/kolibrios/$(DEPDIR)/$(am__dirstamp) libc/sys/kolibrios/libc_a-libc_init.$(OBJEXT): \ libc/sys/kolibrios/$(am__dirstamp) \ libc/sys/kolibrios/$(DEPDIR)/$(am__dirstamp) @@ -14095,7 +14090,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@libc/sys/kolibrios/$(DEPDIR)/libc_a-_exit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/sys/kolibrios/$(DEPDIR)/libc_a-chown.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/sys/kolibrios/$(DEPDIR)/libc_a-close.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@libc/sys/kolibrios/$(DEPDIR)/libc_a-crt_start.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/sys/kolibrios/$(DEPDIR)/libc_a-environ.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/sys/kolibrios/$(DEPDIR)/libc_a-execve.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libc/sys/kolibrios/$(DEPDIR)/libc_a-fork.Po@am__quote@ @@ -16992,20 +16986,6 @@ libc/sys/sysvnecv70/libc_a-open.obj: libc/sys/sysvnecv70/open.S @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -c -o libc/sys/sysvnecv70/libc_a-open.obj `if test -f 'libc/sys/sysvnecv70/open.S'; then $(CYGPATH_W) 'libc/sys/sysvnecv70/open.S'; else $(CYGPATH_W) '$(srcdir)/libc/sys/sysvnecv70/open.S'; fi` -libc/sys/kolibrios/libc_a-crt_start.o: libc/sys/kolibrios/crt_start.S -@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -MT libc/sys/kolibrios/libc_a-crt_start.o -MD -MP -MF libc/sys/kolibrios/$(DEPDIR)/libc_a-crt_start.Tpo -c -o libc/sys/kolibrios/libc_a-crt_start.o `test -f 'libc/sys/kolibrios/crt_start.S' || echo '$(srcdir)/'`libc/sys/kolibrios/crt_start.S -@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) libc/sys/kolibrios/$(DEPDIR)/libc_a-crt_start.Tpo libc/sys/kolibrios/$(DEPDIR)/libc_a-crt_start.Po -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='libc/sys/kolibrios/crt_start.S' object='libc/sys/kolibrios/libc_a-crt_start.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -c -o libc/sys/kolibrios/libc_a-crt_start.o `test -f 'libc/sys/kolibrios/crt_start.S' || echo '$(srcdir)/'`libc/sys/kolibrios/crt_start.S - -libc/sys/kolibrios/libc_a-crt_start.obj: libc/sys/kolibrios/crt_start.S -@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -MT libc/sys/kolibrios/libc_a-crt_start.obj -MD -MP -MF libc/sys/kolibrios/$(DEPDIR)/libc_a-crt_start.Tpo -c -o libc/sys/kolibrios/libc_a-crt_start.obj `if test -f 'libc/sys/kolibrios/crt_start.S'; then $(CYGPATH_W) 'libc/sys/kolibrios/crt_start.S'; else $(CYGPATH_W) '$(srcdir)/libc/sys/kolibrios/crt_start.S'; fi` -@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) libc/sys/kolibrios/$(DEPDIR)/libc_a-crt_start.Tpo libc/sys/kolibrios/$(DEPDIR)/libc_a-crt_start.Po -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='libc/sys/kolibrios/crt_start.S' object='libc/sys/kolibrios/libc_a-crt_start.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -c -o libc/sys/kolibrios/libc_a-crt_start.obj `if test -f 'libc/sys/kolibrios/crt_start.S'; then $(CYGPATH_W) 'libc/sys/kolibrios/crt_start.S'; else $(CYGPATH_W) '$(srcdir)/libc/sys/kolibrios/crt_start.S'; fi` - libc/machine/aarch64/libc_a-memchr.o: libc/machine/aarch64/memchr.S @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libc_a_CPPFLAGS) $(CPPFLAGS) $(libc_a_CCASFLAGS) $(CCASFLAGS) -MT libc/machine/aarch64/libc_a-memchr.o -MD -MP -MF libc/machine/aarch64/$(DEPDIR)/libc_a-memchr.Tpo -c -o libc/machine/aarch64/libc_a-memchr.o `test -f 'libc/machine/aarch64/memchr.S' || echo '$(srcdir)/'`libc/machine/aarch64/memchr.S @am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) libc/machine/aarch64/$(DEPDIR)/libc_a-memchr.Tpo libc/machine/aarch64/$(DEPDIR)/libc_a-memchr.Po diff --git a/libraries/newlib/newlib/configure.host b/libraries/newlib/newlib/configure.host index 95fe5e71e6..91fe61b0df 100644 --- a/libraries/newlib/newlib/configure.host +++ b/libraries/newlib/newlib/configure.host @@ -431,7 +431,7 @@ fi case "${host}" in i[3-7]86-*-kolibrios*) sys_dir=kolibrios - have_crt0="no" + have_crt0="yes" ;; *-*-cygwin*) posix_dir=posix diff --git a/libraries/newlib/newlib/libc/include/kolibrios/app.h b/libraries/newlib/newlib/libc/include/kolibrios/app.h new file mode 100644 index 0000000000..c7844be4f4 --- /dev/null +++ b/libraries/newlib/newlib/libc/include/kolibrios/app.h @@ -0,0 +1,54 @@ +/* + * SPDX-License-Identifier: GPL-2.0-only + * + * Headers for KolibriOS executable files. + * + * Copyright (C) 2026 KolibriOS team + * Author: Maxim Logaev + */ + +#ifndef _KOLIBRIOS_APP_H_ +#define _KOLIBRIOS_APP_H_ + +#include + +/* + * Accessing address 0 is undefined behavior. + * Use "-fno-delete-null-pointer-checks" to disable this. + */ +#define MENUETXX_HEADER_ADDR (void *)0; + +/* + * KolibriOS executable: MENUET02 (TLS, HEAP init) + */ +struct menuet02_header +{ + uint8_t magic[8]; /* MENUET02 */ + uint32_t version; + uint32_t entry; + uint32_t image_end; + uint32_t mem_end; + uint32_t stack_top; + uint32_t cmd_line; + uint32_t app_name; + uint32_t subsystem; +}; + +/** + * Symbol exported by the linker script for quick access + */ +__attribute__ ((noreturn)) void ___kosapp_entry (void); +extern char __kosapp_image_end[]; +extern char __kosapp_memsize[]; +extern char __kosapp_stack_low[]; +extern char __kosapp_stack_high[]; +extern char __kosapp_cmdline[]; +extern char __kosapp_name[]; /* Full path */ + +/* + * Win32 PE Subsystem. + * Provided by the GNU LD "--subsystem" option. + */ +extern int __kosapp_subsystem__ __asm__("__subsystem__"); + +#endif /* _KOLIBRIOS_APP_H_ */ diff --git a/libraries/newlib/newlib/libc/sys/kolibrios/Makefile.inc b/libraries/newlib/newlib/libc/sys/kolibrios/Makefile.inc index 3af8f97650..5422c8f055 100644 --- a/libraries/newlib/newlib/libc/sys/kolibrios/Makefile.inc +++ b/libraries/newlib/newlib/libc/sys/kolibrios/Makefile.inc @@ -23,6 +23,5 @@ libc_a_SOURCES += \ %D%/write.c \ %D%/getentropy.c \ %D%/_exit.c \ - %D%/crt_start.S \ %D%/libc_init.c \ %D%/reent.c diff --git a/libraries/newlib/newlib/libc/sys/kolibrios/_exit.c b/libraries/newlib/newlib/libc/sys/kolibrios/_exit.c index 69887c6823..e0fb868da6 100644 --- a/libraries/newlib/newlib/libc/sys/kolibrios/_exit.c +++ b/libraries/newlib/newlib/libc/sys/kolibrios/_exit.c @@ -8,13 +8,10 @@ #include <_syslist.h> #include -#include void _exit (int rc) { - void *low_stack = __kos_tls_get (KOS_TLS_OFF_LOW_STACK); - _ksys (SF_SYS_MISC, SSF_MEM_FREE, (unsigned long)low_stack); _ksys (SF_TERMINATE_PROCESS); __builtin_unreachable (); } diff --git a/libraries/newlib/newlib/libc/sys/kolibrios/crt0.c b/libraries/newlib/newlib/libc/sys/kolibrios/crt0.c new file mode 100644 index 0000000000..ed3d89281a --- /dev/null +++ b/libraries/newlib/newlib/libc/sys/kolibrios/crt0.c @@ -0,0 +1,28 @@ +/* + * SPDX-License-Identifier: GPL-2.0-only + * Copyright (C) 2026 KolibriOS team. + * Author: Maxim Logaev + */ + +#include + +extern int main (int argc, char *argv[], char *envp[]); + +extern void __libc_init (int *argc, char **argv[], char **envp[]); + +__attribute__ ((noreturn)) void +__kosapp_entry (void) +{ + int rc = 0; + + int argc = 0; + char **argv = NULL; + char **envp = NULL; + + __libc_init (&argc, &argv, &envp); + + rc = main (argc, argv, envp); + + exit (rc); + __builtin_unreachable (); +} diff --git a/libraries/newlib/newlib/libc/sys/kolibrios/libc_init.c b/libraries/newlib/newlib/libc/sys/kolibrios/libc_init.c index 28827e2142..f0e8eee53b 100644 --- a/libraries/newlib/newlib/libc/sys/kolibrios/libc_init.c +++ b/libraries/newlib/newlib/libc/sys/kolibrios/libc_init.c @@ -3,17 +3,10 @@ * Copyright (C) 2026 KolibriOS team */ -#include -#include - -extern int main (void); extern int __init_reent (void); void __libc_init (void) { __init_reent (); - int ret = main (); - exit (ret); - __builtin_unreachable (); } diff --git a/toolchain/kos-app.lds b/toolchain/kos-app.lds index 69408f8f27..c6e59113f8 100644 --- a/toolchain/kos-app.lds +++ b/toolchain/kos-app.lds @@ -1,4 +1,7 @@ -ENTRY(__crt_start) +ENTRY(___kosapp_entry) + +STARTUP(crt0.o) + SECTIONS { .text 0x0: @@ -6,12 +9,12 @@ SECTIONS LONG(0x554e454D); LONG(0x32305445); LONG(1); - LONG(__crt_start); - LONG(___iend); - LONG(___memsize); - LONG(___stacktop); - LONG(___cmdline); - LONG(___pgmname); /* full path */ + LONG(___kosapp_entry); + LONG(___kosapp_image_end); + LONG(___kosapp_memsize); + LONG(___kosapp_stack_high); + LONG(___kosapp_cmdline); + LONG(___kosapp_name); /* Full path */ LONG(__subsystem__); *(.init) @@ -73,7 +76,7 @@ SECTIONS LONG(1); PROVIDE ( __data_end__ = .) ; *(.data_cygwin_nocopy) - ___iend = . ; + ___kosapp_image_end = . ; } .eh_frame BLOCK(16) : @@ -89,13 +92,14 @@ SECTIONS *(.bss) *(COMMON) . = ALIGN(16); - ___cmdline = .; + ___kosapp_cmdline = .; . = . + 256; - ___pgmname = .; + ___kosapp_name = .; . = . + 1024 + 16; - /* The stack is allocated in runtime. See newlib (crt_start.S) */ - ___stacktop = .; - ___memsize = . ; + ___kosapp_stack_low = .; + . = . + __size_of_stack_reserve__; + ___kosapp_stack_high = .; + ___kosapp_memsize = . ; } /DISCARD/ :