From 5085e91a323072e923f46bad4199e6abd9d12ae7 Mon Sep 17 00:00:00 2001 From: midipix Date: Sat, 25 Apr 2015 10:14:19 -0400 Subject: 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. --- src/ldso/nt32/dynlink.c | 12 +++++++----- src/ldso/nt32/start.s | 19 +++++++++++++++++++ src/ldso/nt64/dynlink.c | 12 +++++++----- src/ldso/nt64/start.s | 19 +++++++++++++++++++ 4 files changed, 52 insertions(+), 10 deletions(-) (limited to 'src/ldso') diff --git a/src/ldso/nt32/dynlink.c b/src/ldso/nt32/dynlink.c index c3cb23e..edfa4a8 100644 --- a/src/ldso/nt32/dynlink.c +++ b/src/ldso/nt32/dynlink.c @@ -50,13 +50,15 @@ void *__copy_tls(unsigned char * mem) **/ pthread_t td; - void ** dtv; + uintptr_t addr; - dtv = (void **)mem; - dtv[0] = 0; + addr = (uintptr_t)mem; + addr >>= 4; + addr <<= 4; + addr += 16; - td = (void *)(dtv + 1); - td->dtv = dtv; + td = (struct __pthread *)addr; + td->dtv = 0; return td; } diff --git a/src/ldso/nt32/start.s b/src/ldso/nt32/start.s index 32dc52f..d4815dd 100644 --- a/src/ldso/nt32/start.s +++ b/src/ldso/nt32/start.s @@ -1,2 +1,21 @@ # 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/dynlink.c b/src/ldso/nt64/dynlink.c index c3cb23e..edfa4a8 100644 --- a/src/ldso/nt64/dynlink.c +++ b/src/ldso/nt64/dynlink.c @@ -50,13 +50,15 @@ void *__copy_tls(unsigned char * mem) **/ pthread_t td; - void ** dtv; + uintptr_t addr; - dtv = (void **)mem; - dtv[0] = 0; + addr = (uintptr_t)mem; + addr >>= 4; + addr <<= 4; + addr += 16; - td = (void *)(dtv + 1); - td->dtv = dtv; + td = (struct __pthread *)addr; + td->dtv = 0; return td; } diff --git a/src/ldso/nt64/start.s b/src/ldso/nt64/start.s index 32dc52f..e710319 100644 --- a/src/ldso/nt64/start.s +++ b/src/ldso/nt64/start.s @@ -1,2 +1,21 @@ # 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 -- cgit v1.2.3