Kaynağa Gözat

beginnings of full TLS support in shared libraries

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).
Rich Felker 12 yıl önce
ebeveyn
işleme
9b153c043e
4 değiştirilmiş dosya ile 19 ekleme ve 1 silme
  1. 1 1
      src/internal/pthread_impl.h
  2. 10 0
      src/ldso/dynlink.c
  3. 8 0
      src/thread/i386/tls.s
  4. 0 0
      src/thread/tls.c

+ 1 - 1
src/internal/pthread_impl.h

@@ -22,7 +22,7 @@
 
 struct pthread {
 	struct pthread *self;
-	void *dtv, *unused1, *unused2;
+	void **dtv, *unused1, *unused2;
 	uintptr_t sysinfo;
 	uintptr_t canary;
 	pid_t tid, pid;

+ 10 - 0
src/ldso/dynlink.c

@@ -654,6 +654,16 @@ void *__copy_tls(unsigned char *mem, size_t cnt)
 	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};

+ 8 - 0
src/thread/i386/tls.s

@@ -0,0 +1,8 @@
+.text
+.global ___tls_get_addr
+.type ___tls_get_addr,@function
+___tls_get_addr:
+	push %eax
+	call __tls_get_addr
+	pop %edx
+	ret

+ 0 - 0
src/thread/tls.c