diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index ce2e24a..89cb0de 100644
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
@@ -32,6 +32,7 @@
 #include <futex-internal.h>
 #include <kernel-features.h>
 #include <stack-aliasing.h>
+#include <sysdep-cancel.h>
 
 
 #ifndef NEED_SEPARATE_REGISTER_STACK
@@ -456,9 +457,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
 
       /* This is at least the second thread.  */
       pd->header.multiple_threads = 1;
-#ifndef TLS_MULTIPLE_THREADS_IN_TCB
-      __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1;
-#endif
+      SET_SINGLE_THREAD_PTHREAD (1);
 
 #ifndef __ASSUME_PRIVATE_FUTEX
       /* The thread must know when private futexes are supported.  */
@@ -576,9 +575,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
 
 	  /* This is at least the second thread.  */
 	  pd->header.multiple_threads = 1;
-#ifndef TLS_MULTIPLE_THREADS_IN_TCB
-	  __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1;
-#endif
+	  SET_SINGLE_THREAD_PTHREAD (1);
 
 #ifndef __ASSUME_PRIVATE_FUTEX
 	  /* The thread must know when private futexes are supported.  */
diff --git a/nptl/libc_multiple_threads.c b/nptl/libc_multiple_threads.c
index ef6a4be..1ae23e2 100644
--- a/nptl/libc_multiple_threads.c
+++ b/nptl/libc_multiple_threads.c
@@ -18,11 +18,9 @@
 
 #include <pthreadP.h>
 
-#if IS_IN (libc)
-# ifndef TLS_MULTIPLE_THREADS_IN_TCB
+#if IS_IN (libc) && defined (SINGLE_THREAD_BY_GLOBAL)
 /* Variable set to a nonzero value either if more than one thread runs or ran,
    or if a single-threaded process is trying to cancel itself.  See
    nptl/descr.h for more context on the single-threaded process case.  */
 int __libc_multiple_threads attribute_hidden;
-# endif
 #endif
diff --git a/nptl/libc_pthread_init.c b/nptl/libc_pthread_init.c
index 0db7a10..aedd92f 100644
--- a/nptl/libc_pthread_init.c
+++ b/nptl/libc_pthread_init.c
@@ -26,18 +26,12 @@
 #include <libc-lock.h>
 #include <sysdep.h>
 #include <ldsodefs.h>
-
+#include <sysdep-cancel.h>
 
 unsigned long int *__fork_generation_pointer;
 
 
-#ifdef TLS_MULTIPLE_THREADS_IN_TCB
-void
-#else
-extern int __libc_multiple_threads attribute_hidden;
-
 int *
-#endif
 internal_function
 __libc_pthread_init (unsigned long int *ptr, void (*reclaim) (void),
 		     const struct pthread_functions *functions)
@@ -74,8 +68,10 @@ __libc_pthread_init (unsigned long int *ptr, void (*reclaim) (void),
   __libc_pthread_functions_init = 1;
 #endif
 
-#ifndef TLS_MULTIPLE_THREADS_IN_TCB
+#ifdef SINGLE_THREAD_BY_GLOBAL
   return &__libc_multiple_threads;
+# else
+  return NULL;
 #endif
 }
 
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index 2921607..a1320f3 100644
--- a/nptl/nptl-init.c
+++ b/nptl/nptl-init.c
@@ -38,11 +38,9 @@
 #include <kernel-features.h>
 #include <libc-pointer-arith.h>
 #include <pthread-pids.h>
+#include <sysdep-cancel.h>
 
-#ifndef TLS_MULTIPLE_THREADS_IN_TCB
-/* Pointer to the corresponding variable in libc.  */
-int *__libc_multiple_threads_ptr attribute_hidden;
-#endif
+MULTIPLE_THREADS_PTR_DEF;
 
 /* Size and alignment of static TLS block.  */
 size_t __static_tls_size;
@@ -457,11 +455,9 @@ __pthread_initialize_minimal_internal (void)
   GL(dl_wait_lookup_done) = &__wait_lookup_done;
 
   /* Register the fork generation counter with the libc.  */
-#ifndef TLS_MULTIPLE_THREADS_IN_TCB
-  __libc_multiple_threads_ptr =
-#endif
-    __libc_pthread_init (&__fork_generation, __reclaim_stacks,
-			 ptr_pthread_functions);
+  MULTIPLE_THREADS_PTR_SET (__libc_pthread_init (&__fork_generation,
+						 __reclaim_stacks,
+						 ptr_pthread_functions));
 
   /* Determine whether the machine is SMP or not.  */
   __is_smp = is_smp_system ();
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index 6e7d6ff..a79f0b2 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -384,25 +384,11 @@ hidden_proto (__nptl_create_event)
 hidden_proto (__nptl_death_event)
 
 /* Register the generation counter in the libpthread with the libc.  */
-#ifdef TLS_MULTIPLE_THREADS_IN_TCB
-extern void __libc_pthread_init (unsigned long int *ptr,
-				 void (*reclaim) (void),
-				 const struct pthread_functions *functions)
-     internal_function;
-#else
 extern int *__libc_pthread_init (unsigned long int *ptr,
 				 void (*reclaim) (void),
 				 const struct pthread_functions *functions)
      internal_function;
 
-/* Variable set to a nonzero value either if more than one thread runs or ran,
-   or if a single-threaded process is trying to cancel itself.  See
-   nptl/descr.h for more context on the single-threaded process case.  */
-extern int __pthread_multiple_threads attribute_hidden;
-/* Pointer to the corresponding variable in libc.  */
-extern int *__libc_multiple_threads_ptr attribute_hidden;
-#endif
-
 /* Find a thread given its TID.  */
 extern struct pthread *__find_thread_by_id (pid_t tid) attribute_hidden
 #ifdef SHARED
diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c
index 742dfe6..f52ea08 100644
--- a/nptl/pthread_cancel.c
+++ b/nptl/pthread_cancel.c
@@ -19,10 +19,11 @@
 #include <errno.h>
 #include <signal.h>
 #include <stdlib.h>
-#include "pthreadP.h"
 #include <atomic.h>
 #include <sysdep.h>
 #include <unistd.h>
+#include <pthreadP.h>
+#include <sysdep-cancel.h>
 
 int
 __pthread_cancel (pthread_t th)
@@ -88,9 +89,7 @@ __pthread_cancel (pthread_t th)
 	   cannot.  So we set multiple_threads to true so that cancellation
 	   points get executed.  */
 	THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1);
-#ifndef TLS_MULTIPLE_THREADS_IN_TCB
-	__pthread_multiple_threads = *__libc_multiple_threads_ptr = 1;
-#endif
+	SET_SINGLE_THREAD_PTHREAD (1);
     }
   /* Mark the thread as canceled.  This has to be done
      atomically since other bits could be modified as well.  */
diff --git a/nptl/vars.c b/nptl/vars.c
index 198f463..20ebcd5 100644
--- a/nptl/vars.c
+++ b/nptl/vars.c
@@ -30,14 +30,14 @@ int __default_pthread_attr_lock = LLL_LOCK_INITIALIZER;
 /* Flag whether the machine is SMP or not.  */
 int __is_smp attribute_hidden;
 
-#ifndef TLS_MULTIPLE_THREADS_IN_TCB
+/* Table of the key information.  */
+struct pthread_key_struct __pthread_keys[PTHREAD_KEYS_MAX]
+  __attribute__ ((nocommon));
+hidden_data_def (__pthread_keys)
+
+#if IS_IN (libpthread) && defined (SINGLE_THREAD_BY_GLOBAL)
 /* Variable set to a nonzero value either if more than one thread runs or ran,
    or if a single-threaded process is trying to cancel itself.  See
    nptl/descr.h for more context on the single-threaded process case.  */
 int __pthread_multiple_threads attribute_hidden;
 #endif
-
-/* Table of the key information.  */
-struct pthread_key_struct __pthread_keys[PTHREAD_KEYS_MAX]
-  __attribute__ ((nocommon));
-hidden_data_def (__pthread_keys)
diff --git a/sysdeps/unix/sysv/linux/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sysdep-cancel.h
index 821114b..86044de 100644
--- a/sysdeps/unix/sysv/linux/sysdep-cancel.h
+++ b/sysdeps/unix/sysv/linux/sysdep-cancel.h
@@ -30,12 +30,24 @@
    thread check to use global variables instead of the pthread_t
    field.  */
 #ifdef SINGLE_THREAD_BY_GLOBAL
+
+extern int __pthread_multiple_threads attribute_hidden;
+
+/* Variable set to a nonzero value either if more than one thread runs or ran,
+   or if a single-threaded process is trying to cancel itself.  See
+   nptl/descr.h for more context on the single-threaded process case.  */
+# define MULTIPLE_THREADS_PTR_DEF \
+  int *__libc_multiple_threads_ptr attribute_hidden
+
+# define MULTIPLE_THREADS_PTR_SET(__ptr) \
+  __libc_multiple_threads_ptr = (__ptr)
+
 # if IS_IN (libc)
-extern int __libc_multiple_threads;
+extern int __libc_multiple_threads attribute_hidden;
 #  define SINGLE_THREAD_P \
   __glibc_likely (__libc_multiple_threads == 0)
 # elif IS_IN (libpthread)
-extern int __pthread_multiple_threads;
+extern int *__libc_multiple_threads_ptr attribute_hidden;
 #  define SINGLE_THREAD_P \
   __glibc_likely (__pthread_multiple_threads == 0)
 # elif IS_IN (librt)
@@ -46,7 +58,16 @@ extern int __pthread_multiple_threads;
 /* For rtld, et cetera.  */
 #  define SINGLE_THREAD_P (1)
 # endif
+
+# define SET_SINGLE_THREAD_PTHREAD(__value) \
+  *__libc_multiple_threads_ptr = __pthread_multiple_threads = (__value)
+
 #else
+
+# define MULTIPLE_THREADS_PTR_DEF
+
+# define MULTIPLE_THREADS_PTR_SET(__ptr) __ptr
+
 # if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
 #   define SINGLE_THREAD_P					\
   __glibc_likely (THREAD_GETMEM (THREAD_SELF,			\
@@ -55,6 +76,8 @@ extern int __pthread_multiple_threads;
 /* For rtld, et cetera.  */
 #  define SINGLE_THREAD_P (1)
 # endif
+
+# define SET_SINGLE_THREAD_PTHREAD(__value)
 #endif
 
 #define RTLD_SINGLE_THREAD_P \
