From 8322ec954b2473c3f5e20573d2a2636f00e5d4da Mon Sep 17 00:00:00 2001 From: Egor00f Date: Sat, 10 Jan 2026 23:20:18 +0500 Subject: [PATCH] libc.obj: add `void abort()`, `int atexit( void (*func)(void) )`, EXIT_ SUCCESS/FAILURE --- programs/develop/ktcc/trunk/bin/lib/libc.def | 3 ++ .../develop/ktcc/trunk/libc.obj/.gitignore | 6 +++ .../ktcc/trunk/libc.obj/include/stdlib.h | 11 +++++- .../ktcc/trunk/libc.obj/samples/Makefile | 7 ++-- .../ktcc/trunk/libc.obj/samples/atexit_test.c | 18 +++++++++ .../ktcc/trunk/libc.obj/samples/whois.c | 3 -- .../develop/ktcc/trunk/libc.obj/source/libc.c | 5 +++ .../ktcc/trunk/libc.obj/source/stdlib/_exit.c | 16 ++++++++ .../ktcc/trunk/libc.obj/source/stdlib/abort.c | 12 ++++++ .../trunk/libc.obj/source/stdlib/atexit.c | 38 +++++++++++++++++++ .../ktcc/trunk/libc.obj/source/stdlib/exit.c | 10 ++--- 11 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 programs/develop/ktcc/trunk/libc.obj/.gitignore create mode 100644 programs/develop/ktcc/trunk/libc.obj/samples/atexit_test.c create mode 100644 programs/develop/ktcc/trunk/libc.obj/source/stdlib/_exit.c create mode 100644 programs/develop/ktcc/trunk/libc.obj/source/stdlib/abort.c create mode 100644 programs/develop/ktcc/trunk/libc.obj/source/stdlib/atexit.c diff --git a/programs/develop/ktcc/trunk/bin/lib/libc.def b/programs/develop/ktcc/trunk/bin/lib/libc.def index 37549fcf3..ecf4268a4 100644 --- a/programs/develop/ktcc/trunk/bin/lib/libc.def +++ b/programs/develop/ktcc/trunk/bin/lib/libc.def @@ -52,7 +52,10 @@ atol atoll atof calloc +_exit exit +atexit +abort free itoa labs diff --git a/programs/develop/ktcc/trunk/libc.obj/.gitignore b/programs/develop/ktcc/trunk/libc.obj/.gitignore new file mode 100644 index 000000000..fd5e6730b --- /dev/null +++ b/programs/develop/ktcc/trunk/libc.obj/.gitignore @@ -0,0 +1,6 @@ +.vscode/* +.tup/* + +*.o +*.kex +*.obj diff --git a/programs/develop/ktcc/trunk/libc.obj/include/stdlib.h b/programs/develop/ktcc/trunk/libc.obj/include/stdlib.h index bd868f070..c65fca478 100644 --- a/programs/develop/ktcc/trunk/libc.obj/include/stdlib.h +++ b/programs/develop/ktcc/trunk/libc.obj/include/stdlib.h @@ -11,6 +11,10 @@ #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) + +#define EXIT_SUCCESS 0 // Successful execution of a program +#define EXIT_FAILURE 1 // Unsuccessful execution of a program + typedef struct { int quot; int rem; @@ -48,8 +52,13 @@ DLLAPI void free(void* ptr); DLLAPI long int strtol(const char* str, char** endptr, int base); -DLLAPI void exit(int status); +DLLAPI void _exit(int status); +#define _Exit(status) _exit(status) +DLLAPI void abort(); +DLLAPI void exit(int status); +DLLAPI int atexit( void (*func)(void) ); + DLLAPI void srand(unsigned s); DLLAPI int rand(void); diff --git a/programs/develop/ktcc/trunk/libc.obj/samples/Makefile b/programs/develop/ktcc/trunk/libc.obj/samples/Makefile index 49725be3d..36def36d0 100644 --- a/programs/develop/ktcc/trunk/libc.obj/samples/Makefile +++ b/programs/develop/ktcc/trunk/libc.obj/samples/Makefile @@ -27,17 +27,18 @@ BIN = \ libc_test.kex \ pipe.kex \ defgen.kex \ - futex.kex + futex.kex \ + atexit_test.kex all: $(BIN) %.kex : %.c $(KTCC) $(CFLAGS) $(LDFLAGS) $< -o $@ $(LIBS) - $(KPACK) --nologo $@ +# $(KPACK) --nologo $@ %.kex : %.asm $(FASM) $< $@ - $(KPACK) --nologo $@ +# $(KPACK) --nologo $@ clean: rm *.kex clayer/*.kex diff --git a/programs/develop/ktcc/trunk/libc.obj/samples/atexit_test.c b/programs/develop/ktcc/trunk/libc.obj/samples/atexit_test.c new file mode 100644 index 000000000..63f72bcf9 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc.obj/samples/atexit_test.c @@ -0,0 +1,18 @@ +#include +#include + +void f() +{ + static int c = 1; + printf("exit #%d\n", c); + c++; +} + +int main() +{ + atexit(&f); + atexit(&f); + atexit(&f); + + exit(0); +} diff --git a/programs/develop/ktcc/trunk/libc.obj/samples/whois.c b/programs/develop/ktcc/trunk/libc.obj/samples/whois.c index 88efc8f6f..477972826 100644 --- a/programs/develop/ktcc/trunk/libc.obj/samples/whois.c +++ b/programs/develop/ktcc/trunk/libc.obj/samples/whois.c @@ -19,9 +19,6 @@ FILE* out = stdout; FILE* out = stderr; #endif -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 - #define fprintf fprintf void show_help() diff --git a/programs/develop/ktcc/trunk/libc.obj/source/libc.c b/programs/develop/ktcc/trunk/libc.obj/source/libc.c index 5f1123eca..1c352739f 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/libc.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/libc.c @@ -89,6 +89,8 @@ #include "stdlib/atol.c" #include "stdlib/atoll.c" #include "stdlib/calloc.c" +#include "stdlib/atexit.c" // должно быть до exit.c +#include "stdlib/_exit.c" #include "stdlib/exit.c" #include "stdlib/free.c" #include "stdlib/itoa.c" @@ -100,6 +102,7 @@ #include "stdlib/realloc.c" #include "stdlib/strtod.c" #include "stdlib/strtol.c" +#include "stdlib/abort.c" #include "math/acosh.c" #include "math/asinh.c" @@ -170,6 +173,7 @@ ksys_dll_t EXPORTS[] = { { "atoll", &atoll }, { "atof", &atof }, { "calloc", &calloc }, + { "atexit", &atexit }, { "exit", &exit }, { "free", &free }, { "itoa", &itoa }, @@ -178,6 +182,7 @@ ksys_dll_t EXPORTS[] = { { "malloc", &malloc }, { "realloc", &realloc }, { "strtol", &strtol }, + { "abort", &abort}, { "srand", &srand }, { "rand", &rand }, { "qsort", &qsort }, diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdlib/_exit.c b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/_exit.c new file mode 100644 index 000000000..5ec2e14f6 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/_exit.c @@ -0,0 +1,16 @@ +#include +#include +#include + +void _exit(int status) +{ + if(status && status != 128) + { + printf("exit code: %d", status); + } + + if (__con_is_load) { + con_exit(status); + } + _ksys_exit(); +} diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdlib/abort.c b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/abort.c new file mode 100644 index 000000000..32921e23a --- /dev/null +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/abort.c @@ -0,0 +1,12 @@ +#include +#include +#include + +void abort() +{ + ksys_thread_t t; + _ksys_thread_info(&t, -1); + printf("\nAbort in %d\n", t.pid); + + _exit(128); +} diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdlib/atexit.c b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/atexit.c new file mode 100644 index 000000000..3e2c3b163 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/atexit.c @@ -0,0 +1,38 @@ +#include + +struct atexit_n +{ + struct atexit_n* last; + void (*func)(void); +}; + +struct atexit_n *__last_n = NULL; + +int atexit( void (*func)(void) ) +{ + struct atexit_n* n = malloc(sizeof(struct atexit_n)); + + if(n == NULL) + { + return 1; + } + + n->last = __last_n; + n->func = func; + + __last_n = n; + + return 0; +} + +void __run_atexit() +{ + struct atexit_n *n = __last_n; + while (n != NULL) + { + n->func(); + struct atexit_n *to_free = n; + n = n->last; + free(to_free); + } +} diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdlib/exit.c b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/exit.c index 1e3bebdc0..116dd8131 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdlib/exit.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/exit.c @@ -1,12 +1,12 @@ /* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ -#include #include void exit(int status) { - if (__con_is_load) { - con_exit(status); - } - _ksys_exit(); + __run_atexit(); + + // fflush & delete tmp files + + _exit(status); }