summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/env/nt32/__init_tls.s0
-rw-r--r--src/env/nt32/__reset_tls.s0
-rw-r--r--src/env/nt64/__init_tls.s0
-rw-r--r--src/env/nt64/__reset_tls.s0
-rw-r--r--src/ldso/nt32/dynlink.c12
-rw-r--r--src/ldso/nt32/start.s19
-rw-r--r--src/ldso/nt64/dynlink.c12
-rw-r--r--src/ldso/nt64/start.s19
8 files changed, 52 insertions, 10 deletions
diff --git a/src/env/nt32/__init_tls.s b/src/env/nt32/__init_tls.s
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/env/nt32/__init_tls.s
diff --git a/src/env/nt32/__reset_tls.s b/src/env/nt32/__reset_tls.s
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/env/nt32/__reset_tls.s
diff --git a/src/env/nt64/__init_tls.s b/src/env/nt64/__init_tls.s
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/env/nt64/__init_tls.s
diff --git a/src/env/nt64/__reset_tls.s b/src/env/nt64/__reset_tls.s
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/env/nt64/__reset_tls.s
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