Handle __CTOR_LIST__ and __DTOR_LIST__ initialization.

This commit is contained in:
Krystian Bacławski 2016-10-15 09:53:00 +02:00
parent b1c9ff1a73
commit 7ab6f71804
12 changed files with 37 additions and 7 deletions

View File

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

View File

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

View File

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

View File

@ -129,6 +129,7 @@ _geta4: lea ___a4_init,a4
.long ___nocommandline
.long ___initlibraries
.long ___initcpp
.long ___cpucheck
.comm _SysBase,4

View File

@ -116,6 +116,7 @@ _geta4: rts
.long ___nocommandline
.long ___initlibraries
.long ___initcpp
.long ___cpucheck
.comm _SysBase,4

View File

@ -129,6 +129,7 @@ _geta4: lea ___a4_init,a4
.long ___nocommandline
.long ___initlibraries
.long ___initcpp
.long ___cpucheck
.comm _SysBase,4

View File

@ -166,6 +166,7 @@ oldpri: movel a3@+,d0
.long ___nocommandline
.long ___initlibraries
.long ___initcpp
.long ___cpucheck
.comm _SysBase,4

View File

@ -166,6 +166,7 @@ oldpri: movel a3@+,d0
.long ___nocommandline
.long ___initlibraries
.long ___initcpp
.long ___cpucheck
.comm _SysBase,4

View File

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

View File

@ -0,0 +1 @@
void *__CTOR_LIST__[2]={ 0,0 };

View File

@ -0,0 +1 @@
void *__DTOR_LIST__[2]={ 0,0 };

View File

@ -1 +0,0 @@
int __main(void) { return 0; }