this code will not work yet because the necessary relocations are not
supported, and cannot be supported without some internal changes to
how relocation processing works (coming soon).
struct pthread {
struct pthread *self;
- void *dtv, *unused1, *unused2;
+ void **dtv, *unused1, *unused2;
uintptr_t sysinfo;
uintptr_t canary;
pid_t tid, pid;
return mem;
}
+void *__tls_get_addr(size_t *p)
+{
+ pthread_t self = __pthread_self();
+ if ((size_t)self->dtv[0] < p[0]) {
+ // FIXME: obtain new DTV and TLS from the DSO
+ a_crash();
+ }
+ return (char *)self->dtv[p[0]] + p[1];
+}
+
void *__dynlink(int argc, char **argv)
{
size_t aux[AUX_CNT] = {0};
--- /dev/null
+.text
+.global ___tls_get_addr
+.type ___tls_get_addr,@function
+___tls_get_addr:
+ push %eax
+ call __tls_get_addr
+ pop %edx
+ ret