--- a/src/runtime/thread.c
+++ b/src/runtime/thread.c
@@ -629,13 +629,18 @@
     for(i = 0; i < (dynamic_values_bytes / sizeof(lispobj)); i++)
         per_thread->dynamic_values[i] = NO_TLS_VALUE_MARKER_WIDETAG;
     if (all_threads == 0) {
+      /* FIXME: Should nobody find it necessary to start a slightly older core
+         than expected by the C runtime (a core in which Lisp did not perform
+         these initializations) we can remove everything in this 'if' block */
         if(SymbolValue(FREE_TLS_INDEX,0)==UNBOUND_MARKER_WIDETAG) {
             SetSymbolValue(FREE_TLS_INDEX,tls_index_start << WORD_SHIFT,0);
             SetSymbolValue(TLS_INDEX_LOCK,make_fixnum(0),0);
         }
 #define STATIC_TLS_INIT(sym,field) \
-  ((struct symbol *)(sym-OTHER_POINTER_LOWTAG))->tls_index= \
-  (THREAD_SLOT_OFFSET_WORDS(field) << WORD_SHIFT)
+        if (SYMBOL(sym)->tls_index != (THREAD_SLOT_OFFSET_WORDS(field) << WORD_SHIFT)) { \
+          if (SYMBOL(sym)->tls_index == 0) \
+            SYMBOL(sym)->tls_index = (THREAD_SLOT_OFFSET_WORDS(field) << WORD_SHIFT); \
+          else lose(#sym " TLS index is wrong"); }
 
         STATIC_TLS_INIT(BINDING_STACK_START,binding_stack_start);
 #ifdef BINDING_STACK_POINTER