diff --git a/conform/data/glob.h-data b/conform/data/glob.h-data
index eca83937af..6268134b35 100644
--- a/conform/data/glob.h-data
+++ b/conform/data/glob.h-data
@@ -1,6 +1,6 @@
 #if !defined ISO && !defined ISO99 && !defined ISO11
 #ifdef POSIX
-# define size_t __size_t
+# define size_t __gsize_t
 #endif
 
 type glob_t
diff --git a/inet/netinet/igmp.h b/inet/netinet/igmp.h
index 451b1abf47..2884db59df 100644
--- a/inet/netinet/igmp.h
+++ b/inet/netinet/igmp.h
@@ -18,7 +18,8 @@
 #ifndef _NETINET_IGMP_H
 #define	_NETINET_IGMP_H 1
 
-#include <sys/cdefs.h>
+#include <features.h>
+
 #include <sys/types.h>
 
 #ifdef __USE_MISC
diff --git a/mach/lock-intern.h b/mach/lock-intern.h
index 1988c89b09..a409abbe62 100644
--- a/mach/lock-intern.h
+++ b/mach/lock-intern.h
@@ -18,7 +18,8 @@
 #ifndef _LOCK_INTERN_H
 #define	_LOCK_INTERN_H
 
-#include <sys/cdefs.h>
+#include <features.h>
+
 #if defined __USE_EXTERN_INLINES && defined _LIBC
 # include <lowlevellock.h>
 #endif
diff --git a/misc/ar.h b/misc/ar.h
index ef2303ecfe..adcfda47e2 100644
--- a/misc/ar.h
+++ b/misc/ar.h
@@ -19,7 +19,7 @@
 #ifndef _AR_H
 #define _AR_H 1
 
-#include <sys/cdefs.h>
+#include <features.h>
 
 /* Archive files start with the ARMAG identifying string.  Then follows a
    `struct ar_hdr', and as many bytes of member file data as its `ar_size'
diff --git a/misc/sys/auxv.h b/misc/sys/auxv.h
index 68363b364d..404da6f400 100644
--- a/misc/sys/auxv.h
+++ b/misc/sys/auxv.h
@@ -19,8 +19,9 @@
 #ifndef _SYS_AUXV_H
 #define _SYS_AUXV_H 1
 
+#include <features.h>
+
 #include <elf.h>
-#include <sys/cdefs.h>
 #include <bits/hwcap.h>
 
 __BEGIN_DECLS
diff --git a/posix/glob.h b/posix/glob.h
index 378b80af8f..e49e6c000d 100644
--- a/posix/glob.h
+++ b/posix/glob.h
@@ -18,21 +18,24 @@
 #ifndef	_GLOB_H
 #define	_GLOB_H	1
 
-#include <sys/cdefs.h>
+#include <features.h>
 
 __BEGIN_DECLS
 
-/* We need `size_t' for the following definitions.  */
-#ifndef __size_t
-typedef __SIZE_TYPE__ __size_t;
-# if defined __USE_XOPEN || defined __USE_XOPEN2K8
-typedef __SIZE_TYPE__ size_t;
-# endif
+/* Structures below have size_t fields, but this header is not supposed to
+   define size_t itself, unless XSI or POSIX.1-2008 features are active.
+   We can't use __size_t as an alternative name, as we do for most types
+   with this kind of constraint, because GCC's stddef.h uses __size_t for
+   a different purpose.  */
+
+#if defined __USE_XOPEN || defined __USE_XOPEN2K8
+# define __need_size_t
+# include <stddef.h>
+typedef size_t __gsize_t;
+#elif defined __SIZE_TYPE__
+typedef __SIZE_TYPE__ __gsize_t;
 #else
-/* The GNU CC stddef.h version defines __size_t as empty.  We need a real
-   definition.  */
-# undef __size_t
-# define __size_t size_t
+# error "Don't know how to define __gsize_t"
 #endif
 
 /* Bits set in the FLAGS argument to `glob'.  */
@@ -81,9 +84,9 @@ struct stat;
 #endif
 typedef struct
   {
-    __size_t gl_pathc;		/* Count of paths matched by the pattern.  */
+    __gsize_t gl_pathc;		/* Count of paths matched by the pattern.  */
     char **gl_pathv;		/* List of matched pathnames.  */
-    __size_t gl_offs;		/* Slots to reserve in `gl_pathv'.  */
+    __gsize_t gl_offs;		/* Slots to reserve in `gl_pathv'.  */
     int gl_flags;		/* Set to FLAGS, maybe | GLOB_MAGCHAR.  */
 
     /* If the GLOB_ALTDIRFUNC flag is set, the following functions
@@ -110,9 +113,9 @@ struct stat64;
 # endif
 typedef struct
   {
-    __size_t gl_pathc;
+    __gsize_t gl_pathc;
     char **gl_pathv;
-    __size_t gl_offs;
+    __gsize_t gl_offs;
     int gl_flags;
 
     /* If the GLOB_ALTDIRFUNC flag is set, the following functions
diff --git a/resolv/resolv.h b/resolv/resolv.h
index 7a8023ae9d..b4ef66fdfa 100644
--- a/resolv/resolv.h
+++ b/resolv/resolv.h
@@ -52,7 +52,8 @@
 #ifndef _RESOLV_H_
 #define _RESOLV_H_
 
-#include <sys/cdefs.h>
+#include <features.h>
+
 #include <sys/param.h>
 #include <sys/types.h>
 #include <stdio.h>
diff --git a/scripts/check-obsolete-constructs.py b/scripts/check-obsolete-constructs.py
index 08534348d7..e383a304db 100755
--- a/scripts/check-obsolete-constructs.py
+++ b/scripts/check-obsolete-constructs.py
@@ -527,11 +527,9 @@ HEADER_ALLOWED_INCLUDES = {
     #           spawn.h -> sched.h
     "aio.h":                       [ "sys/types.h" ],
     "ftw.h":                       [ "sys/stat.h", "sys/types.h" ],
-    "glob.h":                      [ "sys/cdefs.h" ],
     "langinfo.h":                  [ "nl_types.h" ],
     "mqueue.h":                    [ "fcntl.h", "sys/types.h" ],
-    "pthread.h":                   [ "endian.h", "sched.h", "time.h",
-                                     "sys/cdefs.h" ],
+    "pthread.h":                   [ "sched.h", "time.h" ],
     "regex.h":                     [ "limits.h", "sys/types.h" ],
     "sched.h":                     [ "time.h" ],
     "semaphore.h":                 [ "sys/types.h" ],
@@ -550,7 +548,7 @@ HEADER_ALLOWED_INCLUDES = {
     "sys/time.h":                  [ "sys/select.h" ],
     "sys/types.h":                 [ "endian.h", "sys/select.h" ],
     "sys/uio.h":                   [ "sys/types.h" ],
-    "sys/un.h":                    [ "string.h", "sys/cdefs.h" ],
+    "sys/un.h":                    [ "string.h" ],
     "sys/wait.h":                  [ "signal.h" ],
 
     # POSIX networking headers
@@ -565,7 +563,6 @@ HEADER_ALLOWED_INCLUDES = {
 
     # Nonstandardized top-level headers
     "aliases.h":                   [ "sys/types.h" ],
-    "ar.h":                        [ "sys/cdefs.h" ],
     "argp.h":                      [ "ctype.h", "errno.h", "getopt.h",
                                      "limits.h", "stdio.h" ],
     "argz.h":                      [ "errno.h", "string.h" ],
@@ -594,7 +591,7 @@ HEADER_ALLOWED_INCLUDES = {
 
     # Nonstandardized sys/ headers
     "sys/acct.h":                  [ "endian.h", "stdint.h", "sys/types.h" ],
-    "sys/auxv.h":                  [ "elf.h", "sys/cdefs.h" ],
+    "sys/auxv.h":                  [ "elf.h" ],
     "sys/elf.h":                   [ "sys/procfs.h" ],
     "sys/epoll.h":                 [ "stdint.h", "sys/types.h" ],
     "sys/eventfd.h":               [ "stdint.h" ],
@@ -649,16 +646,16 @@ HEADER_ALLOWED_INCLUDES = {
     # Nonstandardized networking headers
     "ifaddrs.h":                   [ "sys/socket.h" ],
     "resolv.h":                    [ "arpa/nameser.h", "netinet/in.h",
-                                     "stdio.h", "sys/cdefs.h", "sys/param.h",\
+                                     "stdio.h", "sys/param.h",
                                      "sys/types.h" ],
 
     "arpa/nameser.h":              [ "arpa/nameser_compat.h", "stdint.h",
                                      "sys/param.h", "sys/types.h" ],
     "arpa/nameser_compat.h":       [ "endian.h" ],
-    "net/ethernet.h":              [ "stdint.h", "sys/types.h", "sys/cdefs.h",
+    "net/ethernet.h":              [ "stdint.h", "sys/types.h",
                                      "net/if_ether.h" ],
     "net/if_arp.h":                [ "stdint.h", "sys/socket.h",
-                                     "sys/types.h", "sys/cdefs.h" ],
+                                     "sys/types.h" ],
     "net/if_ppp.h":                [ "net/if.h", "net/ppp_defs.h", "stdint.h",
                                      "sys/ioctl.h", "sys/types.h" ],
     "net/if_shaper.h":             [ "net/if.h", "stdint.h", "sys/ioctl.h",
@@ -673,8 +670,7 @@ HEADER_ALLOWED_INCLUDES = {
                                      "sys/types.h", "stdint.h" ],
     "netinet/if_fddi.h":           [ "stdint.h", "sys/types.h" ],
     "netinet/if_tr.h":             [ "stdint.h", "sys/types.h" ],
-    "netinet/igmp.h":              [ "netinet/in.h", "sys/cdefs.h",
-                                     "sys/types.h" ],
+    "netinet/igmp.h":              [ "netinet/in.h", "sys/types.h" ],
     "netinet/in_systm.h":          [ "stdint.h", "sys/types.h" ],
     "netinet/ip.h":                [ "netinet/in.h", "sys/types.h" ],
     "netinet/ip6.h":               [ "inttypes.h", "netinet/in.h" ],
diff --git a/socket/sys/un.h b/socket/sys/un.h
index 12683607ce..8c7433a3dc 100644
--- a/socket/sys/un.h
+++ b/socket/sys/un.h
@@ -18,7 +18,7 @@
 #ifndef	_SYS_UN_H
 #define	_SYS_UN_H	1
 
-#include <sys/cdefs.h>
+#include <features.h>
 
 /* Get the definition of the macro to define the common sockaddr members.  */
 #include <bits/sockaddr.h>
diff --git a/sunrpc/rpc/auth_des.h b/sunrpc/rpc/auth_des.h
index 245675ff51..e60e795cad 100644
--- a/sunrpc/rpc/auth_des.h
+++ b/sunrpc/rpc/auth_des.h
@@ -18,7 +18,8 @@
 #ifndef _RPC_AUTH_DES_H
 #define _RPC_AUTH_DES_H	1
 
-#include <sys/cdefs.h>
+#include <features.h>
+
 #include <rpc/auth.h>
 
 __BEGIN_DECLS
diff --git a/sunrpc/rpc/rpc_msg.h b/sunrpc/rpc/rpc_msg.h
index a2cc516cd6..efd9ee4a2f 100644
--- a/sunrpc/rpc/rpc_msg.h
+++ b/sunrpc/rpc/rpc_msg.h
@@ -35,7 +35,7 @@
 #ifndef _RPC_MSG_H
 #define _RPC_MSG_H 1
 
-#include <sys/cdefs.h>
+#include <features.h>
 
 #include <rpc/xdr.h>
 #include <rpc/clnt.h>
diff --git a/sysdeps/generic/memcopy.h b/sysdeps/generic/memcopy.h
index e10d01ea08..de32e56f1a 100644
--- a/sysdeps/generic/memcopy.h
+++ b/sysdeps/generic/memcopy.h
@@ -20,6 +20,8 @@
 #ifndef _MEMCOPY_H
 #define _MEMCOPY_H	1
 
+#include <features.h>
+
 /* The strategy of the memory functions is:
 
      1. Copy bytes until the destination pointer is aligned.
@@ -38,7 +40,6 @@
    exhaustive in the sense that I tried all alignment and length
    combinations, with and without overlap.  */
 
-#include <sys/cdefs.h>
 #include <endian.h>
 #include <pagecopy.h>
 
diff --git a/sysdeps/generic/netinet/tcp.h b/sysdeps/generic/netinet/tcp.h
index 49f1bfbc26..3b59e949d8 100644
--- a/sysdeps/generic/netinet/tcp.h
+++ b/sysdeps/generic/netinet/tcp.h
@@ -30,10 +30,9 @@
  */
 
 #ifndef _NETINET_TCP_H
-
 #define _NETINET_TCP_H	1
-#include <sys/cdefs.h>
 
+#include <features.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/htl/pthread.h b/sysdeps/htl/pthread.h
index a8205519f2..158a095417 100644
--- a/sysdeps/htl/pthread.h
+++ b/sysdeps/htl/pthread.h
@@ -25,7 +25,6 @@
 
 #include <features.h>
 
-#include <sys/cdefs.h>
 #ifndef __extern_inline
 /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
    inline semantics, unless -fgnu89-inline is used.  */
diff --git a/sysdeps/mach/hurd/net/ethernet.h b/sysdeps/mach/hurd/net/ethernet.h
index 4aa67ea347..8956694b59 100644
--- a/sysdeps/mach/hurd/net/ethernet.h
+++ b/sysdeps/mach/hurd/net/ethernet.h
@@ -21,7 +21,8 @@
 #ifndef __NET_ETHERNET_H
 #define __NET_ETHERNET_H 1
 
-#include <sys/cdefs.h>
+#include <features.h>
+
 #include <sys/types.h>
 #include <stdint.h>
 #include <net/if_ether.h>     /* IEEE 802.3 Ethernet constants */
diff --git a/sysdeps/mach/hurd/net/if_arp.h b/sysdeps/mach/hurd/net/if_arp.h
index 6ef93c96dd..9e1b2233ce 100644
--- a/sysdeps/mach/hurd/net/if_arp.h
+++ b/sysdeps/mach/hurd/net/if_arp.h
@@ -20,9 +20,9 @@
 /* Based on the 4.4BSD and Linux version of this file.  */
 
 #ifndef _NET_IF_ARP_H
-
 #define _NET_IF_ARP_H 1
-#include <sys/cdefs.h>
+
+#include <features.h>
 
 #include <sys/types.h>
 #include <sys/socket.h>
