From 7ab6f718046681efd4ce5c20babdf3fab99cab61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krystian=20Bac=C5=82awski?= Date: Sat, 15 Oct 2016 09:53:00 +0200 Subject: [PATCH] Handle __CTOR_LIST__ and __DTOR_LIST__ initialization. --- manifests/src | 4 +++- sources/Makefile.in | 6 +----- sources/history | 3 +++ sources/startup/nbcrt0.S | 1 + sources/startup/ncrt0.S | 1 + sources/startup/nlbcrt0.S | 1 + sources/startup/nlrcrt0.S | 1 + sources/startup/nrcrt0.S | 1 + sources/stubs/misc/__initcpp.c | 23 +++++++++++++++++++++++ sources/stubs/stubs/__ctor_list__.c | 1 + sources/stubs/stubs/__dtor_list__.c | 1 + sources/stubs/stubs/__main.c | 1 - 12 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 sources/stubs/misc/__initcpp.c create mode 100644 sources/stubs/stubs/__ctor_list__.c create mode 100644 sources/stubs/stubs/__dtor_list__.c delete mode 100644 sources/stubs/stubs/__main.c diff --git a/manifests/src b/manifests/src index e2c6cc5..11952ef 100644 --- a/manifests/src +++ b/manifests/src @@ -381,11 +381,13 @@ sysdep/libnix/sources/stubs/misc/__MathIeeeSingTransBase.c sysdep/libnix/sources/stubs/misc/__UtilityBase.c sysdep/libnix/sources/stubs/misc/__cpucheck.c sysdep/libnix/sources/stubs/misc/__flush_cache.c +sysdep/libnix/sources/stubs/misc/__initcpp.c sysdep/libnix/sources/stubs/misc/__initlibraries.c sysdep/libnix/sources/stubs/stubs/__exit_list__.c sysdep/libnix/sources/stubs/stubs/__init_list__.c +sysdep/libnix/sources/stubs/stubs/__ctor_list__.c +sysdep/libnix/sources/stubs/stubs/__dtor_list__.c sysdep/libnix/sources/stubs/stubs/__lib_list__.c -sysdep/libnix/sources/stubs/stubs/__main.c sysdep/libnix/sources/stubs/stubs/__oslibversion.c sysdep/libnix/sources/stubs/stubs/__priority.c sysdep/libnix/sources/stubs/stubs/__procname.c diff --git a/sources/Makefile.in b/sources/Makefile.in index 07bd7f5..b1c24cc 100644 --- a/sources/Makefile.in +++ b/sources/Makefile.in @@ -50,11 +50,7 @@ filelists: -cd $(srcdir)/stack; $(MAKELIST) SOURCEFILES="*.c" FLDIR=$(CURDIR)/stack $(CURDIR)/stack/filelist -cd $(srcdir)/stubs; $(MAKE) -f $(CURDIR)/Makefile STUBDIR=$(CURDIR)/stubs libbases/dos.c; \ $(MAKELIST) SOURCEFILES=" \ - libbases/*.[cSCh] misc/__DOSBase.c misc/__UtilityBase.c \ - misc/__MathIeeeSingBasBase.c misc/__MathIeeeDoubBasBase.c \ - misc/__MathIeeeSingTransBase.c misc/__MathIeeeDoubTransBase.c \ - misc/__cpucheck.c misc/__flush_cache.c misc/__initlibraries.c \ - libnames/* stubs/*.[cSCh]" \ + libbases/*.[cSCh] misc/*.c libnames/* stubs/*.[cSCh]" \ FLDIR=$(CURDIR)/stubs $(CURDIR)/stubs/filelist -cd $(srcdir)/amiga; $(MAKELIST) SOURCEFILES="*/*.[cSCh]" FLDIR=$(CURDIR)/amiga $(CURDIR)/amiga/filelist diff --git a/sources/history b/sources/history index ee36ff2..581473e 100644 --- a/sources/history +++ b/sources/history @@ -379,3 +379,6 @@ Got rid of GCC 3.x warnings about casting lvalues -- rewrote memset. Removed duplicate files snprintf and vsnprintf -- they were wrong anyways. __request.c -- rewritten in C (Gunther Nikl) +S Constructor (__CTOR_LIST__) and destructor (__DTOR_LIST__) lists from C++ + are now initialized by libnix, instead of libgcc.a. To turn this feature off + use `int __initcpp = 0` in your code. diff --git a/sources/startup/nbcrt0.S b/sources/startup/nbcrt0.S index 4a399aa..2eba2aa 100644 --- a/sources/startup/nbcrt0.S +++ b/sources/startup/nbcrt0.S @@ -129,6 +129,7 @@ _geta4: lea ___a4_init,a4 .long ___nocommandline .long ___initlibraries + .long ___initcpp .long ___cpucheck .comm _SysBase,4 diff --git a/sources/startup/ncrt0.S b/sources/startup/ncrt0.S index f1d9cc1..98e9697 100644 --- a/sources/startup/ncrt0.S +++ b/sources/startup/ncrt0.S @@ -116,6 +116,7 @@ _geta4: rts .long ___nocommandline .long ___initlibraries + .long ___initcpp .long ___cpucheck .comm _SysBase,4 diff --git a/sources/startup/nlbcrt0.S b/sources/startup/nlbcrt0.S index 43ef7fa..fda6ae8 100644 --- a/sources/startup/nlbcrt0.S +++ b/sources/startup/nlbcrt0.S @@ -129,6 +129,7 @@ _geta4: lea ___a4_init,a4 .long ___nocommandline .long ___initlibraries + .long ___initcpp .long ___cpucheck .comm _SysBase,4 diff --git a/sources/startup/nlrcrt0.S b/sources/startup/nlrcrt0.S index 04e62e5..5d64d41 100644 --- a/sources/startup/nlrcrt0.S +++ b/sources/startup/nlrcrt0.S @@ -166,6 +166,7 @@ oldpri: movel a3@+,d0 .long ___nocommandline .long ___initlibraries + .long ___initcpp .long ___cpucheck .comm _SysBase,4 diff --git a/sources/startup/nrcrt0.S b/sources/startup/nrcrt0.S index 7da1eaf..4c4b381 100644 --- a/sources/startup/nrcrt0.S +++ b/sources/startup/nrcrt0.S @@ -166,6 +166,7 @@ oldpri: movel a3@+,d0 .long ___nocommandline .long ___initlibraries + .long ___initcpp .long ___cpucheck .comm _SysBase,4 diff --git a/sources/stubs/misc/__initcpp.c b/sources/stubs/misc/__initcpp.c new file mode 100644 index 0000000..2b5b8fa --- /dev/null +++ b/sources/stubs/misc/__initcpp.c @@ -0,0 +1,23 @@ +#include "stabs.h" + +typedef void (*func_ptr) (void); + +extern func_ptr __CTOR_LIST__[]; +extern func_ptr __DTOR_LIST__[]; + +void __initcpp() { + func_ptr *p0 = __CTOR_LIST__ + 1; + func_ptr *p; + for (p = p0; *p; p++); + while (p > p0) + (*--p)(); +} + +void __exitcpp() { + func_ptr *p = __DTOR_LIST__ + 1; + while (*p) + (*p++)(); +} + +ADD2INIT(__initcpp,100); +ADD2EXIT(__exitcpp,100); diff --git a/sources/stubs/stubs/__ctor_list__.c b/sources/stubs/stubs/__ctor_list__.c new file mode 100644 index 0000000..5b59147 --- /dev/null +++ b/sources/stubs/stubs/__ctor_list__.c @@ -0,0 +1 @@ +void *__CTOR_LIST__[2]={ 0,0 }; diff --git a/sources/stubs/stubs/__dtor_list__.c b/sources/stubs/stubs/__dtor_list__.c new file mode 100644 index 0000000..d07d05c --- /dev/null +++ b/sources/stubs/stubs/__dtor_list__.c @@ -0,0 +1 @@ +void *__DTOR_LIST__[2]={ 0,0 }; diff --git a/sources/stubs/stubs/__main.c b/sources/stubs/stubs/__main.c deleted file mode 100644 index e708b25..0000000 --- a/sources/stubs/stubs/__main.c +++ /dev/null @@ -1 +0,0 @@ -int __main(void) { return 0; }