diff options
author | midipix <writeonce@midipix.org> | 2015-04-25 10:14:19 -0400 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2015-04-25 10:14:19 -0400 |
commit | 5085e91a323072e923f46bad4199e6abd9d12ae7 (patch) | |
tree | 1d007a1140fb6049186e0749a41f615060e834ab /arch/nt32/src | |
parent | 0f5685a2ffe65b6c6154f5500a26983852eaf1f3 (diff) | |
download | mmglue-5085e91a323072e923f46bad4199e6abd9d12ae7.tar.bz2 mmglue-5085e91a323072e923f46bad4199e6abd9d12ae7.tar.xz |
complete/fix support of ctors/dtors and tls.
+ do not build libc.so with -DSHARED for the midipix targets.
+ provide surrogate init/fini arrays that allow invocation of the
ctors/dtors iteration routines.
+ provide a builtin tls for the first thread.
+ update __copy_tls to match the layout of the simplified struct __tls.
signed-off by Z. Gilboa; see copying.midipix (9cd0746c) for additional information.
Diffstat (limited to 'arch/nt32/src')
-rw-r--r-- | arch/nt32/src/crt_glue.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/arch/nt32/src/crt_glue.c b/arch/nt32/src/crt_glue.c index abfd1fe..2559348 100644 --- a/arch/nt32/src/crt_glue.c +++ b/arch/nt32/src/crt_glue.c @@ -8,6 +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 *); @@ -19,6 +22,26 @@ extern int __libc_start_main( int argc, char ** argv); +static struct __tls { + void * pad[16/sizeof(void *)]; + struct pthread pt; +} __builtin_tls = {{0}}; + +void __init_tls (size_t * auxv) +{ + #define T __builtin_tls + + __set_thread_area(&T.pt); + + T.pt.self = &T.pt; + T.pt.locale = &libc.global_locale; + T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.tid); + + libc.can_do_threads = 1; + libc.has_thread_pointer = 1; + libc.tls_size = sizeof(struct __tls); +}; + void __libc_entry_routine( __app_main * __main, __psx_init_routine * __psx_init, @@ -43,9 +66,6 @@ void __libc_entry_routine( else if (envp != argv + (argc + 1)) a_crash(); - /* dso init routines */ - _init(); - /* write once */ __syscall_vtbl = (unsigned long **)ctx.sys_vtbl; __ldso_vtbl = ctx.ldso_vtbl; @@ -53,6 +73,10 @@ void __libc_entry_routine( __teb_sys_idx = ctx.teb_sys_idx; __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; + /* enter libc */ __libc_start_main(__main,argc,argv); |