Index: uspace/lib/c/arch/ia32/_link.ld.in
===================================================================
--- uspace/lib/c/arch/ia32/_link.ld.in	(revision 5035ba05f0dcb66a61ad5e5722c225bf1d375437)
+++ uspace/lib/c/arch/ia32/_link.ld.in	(revision 32573ffe2f11f1f46237edf372866632f5d0f7f2)
@@ -12,4 +12,5 @@
 #endif
 	data PT_LOAD FLAGS(6);
+	tls PT_TLS;
 #if defined(SHLIB) || defined(DLEXE)
 	dynamic PT_DYNAMIC;
@@ -95,15 +96,25 @@
 #endif
 	
+	.tdata : {
 #ifndef DLEXE
-	.tdata : {
 		_tdata_start = .;
+#endif
 		*(.tdata);
 		*(.gnu.linkonce.tb.*);
+#ifndef DLEXE
 		_tdata_end = .;
+#endif
+	} :data :tls
+	.tbss : {
+#ifndef DLEXE
 		_tbss_start = .;
+#endif
 		*(.tbss);
+#ifndef DLEXE
 		_tbss_end = .;
-	} :data
+#endif
+	} :data :tls
 	
+#ifndef DLEXE
 	_tls_alignment = ALIGNOF(.tdata);
 #endif
Index: uspace/lib/c/arch/ia32/src/rtld/reloc.c
===================================================================
--- uspace/lib/c/arch/ia32/src/rtld/reloc.c	(revision 5035ba05f0dcb66a61ad5e5722c225bf1d375437)
+++ uspace/lib/c/arch/ia32/src/rtld/reloc.c	(revision 32573ffe2f11f1f46237edf372866632f5d0f7f2)
@@ -171,10 +171,10 @@
 			break;
 
+//		case R_386_TLS_DTPOFF32:
+//			*r_ptr = sym_def->st_value;
+//			break; 
+
 		case R_386_TLS_DTPMOD32:
-			/*
-			 * We can ignore this as long as the only module
-			 * with TLS variables is libc.so.
-			 */
-			DPRINTF("Ignoring R_386_TLS_DTPMOD32\n");
+			*r_ptr = dest->id;
 			break;
 
Index: uspace/lib/c/arch/ia32/src/tls.c
===================================================================
--- uspace/lib/c/arch/ia32/src/tls.c	(revision 5035ba05f0dcb66a61ad5e5722c225bf1d375437)
+++ uspace/lib/c/arch/ia32/src/tls.c	(revision 32573ffe2f11f1f46237edf372866632f5d0f7f2)
@@ -1,4 +1,5 @@
 /*
  * Copyright (c) 2006 Ondrej Palkovsky
+ * Copyright (c) 2016 Jiri Svoboda
  * All rights reserved.
  *
@@ -39,4 +40,8 @@
 #include <align.h>
 
+#ifdef CONFIG_RTLD
+#include <rtld/rtld.h>
+#endif
+
 tcb_t *tls_alloc_arch(void **data, size_t size)
 {
@@ -68,9 +73,15 @@
 
 	/* Calculate size of TLS block */
-	tls_size = ALIGN_UP(&_tbss_end - &_tdata_start, &_tls_alignment);
+	tls_size = tls_get_size();
 
 	/* The TLS block is just before TCB */
 	tls = (uint8_t *)__tcb_get() - tls_size;
 
+#ifdef CONFIG_RTLD
+	if (runtime_env != NULL) {
+		return rtld_tls_get_addr(runtime_env, tls, ti->ti_module,
+		    ti->ti_offset);
+	}
+#endif
 	return tls + ti->ti_offset;
 }
