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 <maxlogaev@proton.me>
This commit is contained in:
2026-01-04 20:38:37 +03:00
parent ab6d0d9469
commit a315fb4ae5
8 changed files with 100 additions and 45 deletions

View File

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

View File

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

View File

@@ -0,0 +1,54 @@
/*
* SPDX-License-Identifier: GPL-2.0-only
*
* Headers for KolibriOS executable files.
*
* Copyright (C) 2026 KolibriOS team
* Author: Maxim Logaev <maxlogaev@proton.me>
*/
#ifndef _KOLIBRIOS_APP_H_
#define _KOLIBRIOS_APP_H_
#include <stdint.h>
/*
* 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_ */

View File

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

View File

@@ -8,13 +8,10 @@
#include <_syslist.h>
#include <kolibrios/syscall.h>
#include <kolibrios/tls.h>
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 ();
}

View File

@@ -0,0 +1,28 @@
/*
* SPDX-License-Identifier: GPL-2.0-only
* Copyright (C) 2026 KolibriOS team.
* Author: Maxim Logaev <maxlogaev@proton.me>
*/
#include <stdlib.h>
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 ();
}

View File

@@ -3,17 +3,10 @@
* Copyright (C) 2026 KolibriOS team
*/
#include <kolibrios/tls.h>
#include <stdlib.h>
extern int main (void);
extern int __init_reent (void);
void
__libc_init (void)
{
__init_reent ();
int ret = main ();
exit (ret);
__builtin_unreachable ();
}

View File

@@ -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/ :