summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--arch/nt32/src/crt_glue.c8
-rw-r--r--arch/nt64/src/crt_glue.c21
-rw-r--r--crt/nt64/crte.s2
-rw-r--r--src/ldso/nt32/dlstart.s18
-rw-r--r--src/ldso/nt64/dlstart.s18
5 files changed, 19 insertions, 48 deletions
diff --git a/arch/nt32/src/crt_glue.c b/arch/nt32/src/crt_glue.c
index 07d38de..b92db1a 100644
--- a/arch/nt32/src/crt_glue.c
+++ b/arch/nt32/src/crt_glue.c
@@ -8,8 +8,8 @@
extern struct __ldso_vtbl * __ldso_vtbl;
extern struct __psx_vtbl * __psx_vtbl;
-extern void * __init_array_start;
-extern void * __fini_array_start;
+extern void * __init_array_start[];
+extern void * __fini_array_start[];
typedef int __app_main();
typedef int __pthread_surrogate_routine(struct pthread *);
@@ -73,8 +73,8 @@ void __libc_entry_routine(
__teb_libc_idx = ctx.teb_libc_idx;
/* surrogate init/fini arrays */
- __init_array_start = ctx.do_global_ctors_fn;
- __fini_array_start = ctx.do_global_dtors_fn;
+ *__init_array_start = ctx.do_global_ctors_fn;
+ *__fini_array_start = ctx.do_global_dtors_fn;
/* enter libc */
__libc_start_main(__main,argc,argv);
diff --git a/arch/nt64/src/crt_glue.c b/arch/nt64/src/crt_glue.c
index 2913b19..7c7d8b2 100644
--- a/arch/nt64/src/crt_glue.c
+++ b/arch/nt64/src/crt_glue.c
@@ -8,13 +8,9 @@
extern struct __ldso_vtbl * __ldso_vtbl;
extern struct __psx_vtbl * __psx_vtbl;
-extern void * __init_array_start;
-extern void * __fini_array_start;
-
typedef int __app_main();
typedef int __pthread_surrogate_routine(struct pthread *);
-extern int _init(void);
static int __pthread_surrogate_init(struct pthread * self);
extern int __libc_start_main(
@@ -22,6 +18,19 @@ extern int __libc_start_main(
int argc,
char ** argv);
+static void (*__global_ctors_fn)();
+static void (*__global_dtors_fn)();
+
+void _init()
+{
+ __global_ctors_fn();
+}
+
+void _fini()
+{
+ __global_dtors_fn();
+}
+
struct __tls {
void * pad[16/sizeof(void *)];
struct pthread pt;
@@ -73,8 +82,8 @@ void __libc_entry_routine(
__teb_libc_idx = ctx.teb_libc_idx;
/* surrogate init/fini arrays */
- __init_array_start = ctx.do_global_ctors_fn;
- __fini_array_start = ctx.do_global_dtors_fn;
+ __global_ctors_fn = ctx.do_global_ctors_fn;
+ __global_dtors_fn = ctx.do_global_dtors_fn;
/* enter libc */
__libc_start_main(__main,argc,argv);
diff --git a/crt/nt64/crte.s b/crt/nt64/crte.s
index 69daee4..118c8e9 100644
--- a/crt/nt64/crte.s
+++ b/crt/nt64/crte.s
@@ -16,5 +16,3 @@ __dso_main_routine:
.section .midipix
.quad dso_main_routine
.quad _so_entry_point
- .quad _init
- .quad _fini
diff --git a/src/ldso/nt32/dlstart.s b/src/ldso/nt32/dlstart.s
index d4815dd..dae467c 100644
--- a/src/ldso/nt32/dlstart.s
+++ b/src/ldso/nt32/dlstart.s
@@ -1,21 +1,3 @@
# standard dynamic loader is not required
# optional dynamic loader [to be] provided by libldso/libpsxscl
-.section .data
-
-.globl ___init_array_start
-.globl ___init_array_end
-.globl ___fini_array_start
-.globl ___fini_array_end
-
-___init_array_start:
- .long 0
-
-___init_array_end:
- .long 0
-
-___fini_array_start:
- .long 0
-
-___fini_array_end:
- .long 0
diff --git a/src/ldso/nt64/dlstart.s b/src/ldso/nt64/dlstart.s
index e710319..dae467c 100644
--- a/src/ldso/nt64/dlstart.s
+++ b/src/ldso/nt64/dlstart.s
@@ -1,21 +1,3 @@
# standard dynamic loader is not required
# optional dynamic loader [to be] provided by libldso/libpsxscl
-.section .data
-
-.globl __init_array_start
-.globl __init_array_end
-.globl __fini_array_start
-.globl __fini_array_end
-
-__init_array_start:
- .quad 0
-
-__init_array_end:
- .quad 0
-
-__fini_array_start:
- .quad 0
-
-__fini_array_end:
- .quad 0