public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Alejandro Colomar <alx.manpages@gmail.com>
To: Joseph Myers <joseph@codesourcery.com>, libc-alpha@sourceware.org
Subject: Re: C2x strtol binary constant handling
Date: Thu, 15 Dec 2022 13:25:26 +0100	[thread overview]
Message-ID: <4001418e-e9cb-af7e-047c-3731dd20574c@gmail.com> (raw)
In-Reply-To: <9dd1d581-2684-43cc-3d44-3d866b226c20@codesourcery.com>


[-- Attachment #1.1: Type: text/plain, Size: 115961 bytes --]

Hi Joseph,

On 12/15/22 02:37, Joseph Myers wrote:
> C2x adds binary integer constants starting with 0b or 0B, and supports
> those constants in strtol-family functions when the base passed is 0
> or 2.  Implement that strtol support for glibc.
> 
> As discussed at
> <https://sourceware.org/pipermail/libc-alpha/2020-December/120414.html>,
> this is incompatible with previous C standard versions, in that such
> an input string starting with 0b or 0B was previously required to be
> parsed as 0 (with the rest of the string unprocessed).  Thus, as
> proposed there, this patch adds 20 new __isoc23_* functions with
> appropriate header redirection support.  This patch does *not* do
> anything about scanf %i (which will need 12 new functions per long
> double variant, so 12, 24 or 36 depending on the glibc configuration),
> instead leaving that for a future patch.  The function names would
> remain as __isoc23_* even if C2x ends up published in 2024 rather than
> 2023.
> 
> Making this change leads to the question of what should happen to
> internal uses of these functions in glibc and its tests.  The header
> redirection (which applies for _GNU_SOURCE or any other feature test
> macros enabling C2x features) has the effect of redirecting internal
> uses but without those uses then ending up at a hidden alias (see the
> comment in include/stdio.h about interaction with libc_hidden_proto).
> It seems desirable for the default for internal uses to be the same
> versions used by normal code using _GNU_SOURCE, so rather than doing
> anything to disable that redirection, similar macro definitions to
> those in include/stdio.h are added to the include/ headers for the new
> functions.

The changes of atoi->strtol seem to be severable from this patch into a 
pre-patch, since they have little to do with base-2 changes.  I'd separate the 
patches.

Cheers,

Alex

> 
> In one case, this does not suffice to avoid a localplt test failure:
> the atoi inline function is defined in the public stdlib.h header
> before the macro-based redirections in the include/ header can take
> effect, resulting in localplt test failures where atoi is used in libc
> (the redirection to __isoc23_strtol from the public header takes
> effect, not the macro-based on from the include/ header, and so there
> is no redirection to a hidden symbol).
> 
> atoi has undefined behavior on out-of-range input, which certainly
> makes its use questionable in argp-help.c (shared with gnulib, so
> shouldn't depend on glibc implementation details, and processing
> user-provided input), and maybe also in argp-parse.c (I'm not sure
> what that code in argp-parse.c is meant to be used for), so I changed
> those places to use strtol instead, so avoiding that undefined
> behavior as well as avoiding the localplt test failure.  I also
> changed inet/rexec.c and resolv/res_init.c similarly to use strtol to
> avoid such localplt failures, although given those files (in those
> versions) are only used in glibc it's not problematic for them to rely
> on the specific behavior of glibc's atoi on out-of-range input in the
> same way it's problematic for gnulib code to do so.
> 
> Given that the default for uses in glibc is for the redirections to
> apply, the next question is whether the C2x semantics are correct for
> all those uses.  Uses with the base fixed to 10, 16 or any other value
> other than 0 or 2 can be ignored.  I think this leaves the following
> internal uses to consider (an important consideration for review of
> this patch will be both whether this list is complete and whether my
> conclusions on all entries in it are correct):
> 
> benchtests/bench-malloc-simple.c
> benchtests/bench-string.h
> elf/sotruss-lib.c
> math/libm-test-support.c
> nptl/perf.c
> nscd/nscd_conf.c
> nss/nss_files/files-parse.c
> posix/tst-fnmatch.c
> posix/wordexp.c
> resolv/inet_addr.c
> rt/tst-mqueue7.c
> soft-fp/testit.c
> stdlib/fmtmsg.c
> support/support_test_main.c
> support/test-container.c
> sysdeps/pthread/tst-mutex10.c
> 
> I think all of these places are OK with the new semantics, except for
> resolv/inet_addr.c, where the POSIX semantics of inet_addr do not
> allow for binary constants; thus, I changed that file (to use
> __strtoul_internal, whose semantics are unchanged) and added a test
> for this case.  In the case of posix/wordexp.c I think accepting
> binary constants is OK since POSIX explicitly allows additional forms
> of shell arithmetic expressions, and in stdlib/fmtmsg.c SEV_LEVEL is
> not in POSIX so again I think accepting binary constants is OK.
> 
> Functions such as __strtol_internal, which are only exported for
> compatibility with old binaries from when those were used in inline
> functions in headers, have unchanged semantics; the __*_l_internal
> versions (purely internal to libc and not exported) have a new
> argument to specify whether to accept binary constants.
> 
> As well as for the standard functions, the header redirection also
> applies to the *_l versions (GNU extensions), and to legacy functions
> such as strtoq, to avoid confusing inconsistency (the *q functions
> redirect to __isoc23_*ll rather than needing their own __isoc23_*
> entry points).  For the functions that are only declared with
> _GNU_SOURCE, this means the old versions are no longer available for
> normal user programs at all.  An internal __GLIBC_USE_C2X_STRTOL macro
> is used to control the redirections in the headers, and cases in glibc
> that wish to avoid the redirections - the function implementations
> themselves and the tests of the old versions of the GNU functions -
> then undefine and redefine that macro to allow the old versions to be
> accessed.  (There would of course be greater complexity should we wish
> to make any of the old versions into compat symbols / avoid them being
> defined at all for new glibc ABIs.)
> 
> strtol_l.c has some similarity to strtol.c in gnulib, but has already
> diverged some way (and isn't listed at all at
> https://sourceware.org/glibc/wiki/SharedSourceFiles unlike strtoll.c
> and strtoul.c); I haven't made any attempts at gnulib compatibility in
> the changes to that file.
> 
> I note incidentally that inttypes.h and wchar.h are missing the
> __nonnull present on declarations of this family of functions in
> stdlib.h; I didn't make any changes in that regard for the new
> declarations added.
> 
> Tested for x86_64 and x86.
> 
> diff --git a/NEWS b/NEWS
> index a10bb08fb0..75b69169b6 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -14,6 +14,13 @@ Major new features:
>     configured on the current host i.e. as-if you had not passed
>     AI_ADDRCONFIG to getaddrinfo calls.
>   
> +* When C2X features are enabled and the base argument is 0 or 2, the
> +  following functions support binary integers prefixed by 0b or 0B as
> +  input: strtol, strtoll, strtoul, strtoull, strtol_l, strtoll_l,
> +  strtoul_l, strtoull_l, strtoimax, strtoumax, strtoq, strtouq, wcstol,
> +  wcstoll, wcstoul, wcstoull, wcstol_l, wcstoll_l, wcstoul_l,
> +  wcstoull_l, wcstoimax, wcstoumax, wcstoq, wcstouq.
> +
>   Deprecated and removed features, and other changes affecting compatibility:
>   
>   * The dynamic linker no longer loads shared objects from the "tls"
> diff --git a/argp/argp-help.c b/argp/argp-help.c
> index 90a2795cef..328b981374 100644
> --- a/argp/argp-help.c
> +++ b/argp/argp-help.c
> @@ -210,7 +210,7 @@ fill_in_uparams (const struct argp_state *state)
>   	      }
>   	    else if (isdigit ((unsigned char) *arg))
>   	      {
> -		val = atoi (arg);
> +		val = strtol (arg, NULL, 10);
>   		while (isdigit ((unsigned char) *arg))
>   		  arg++;
>   		SKIPWS (arg);
> diff --git a/argp/argp-parse.c b/argp/argp-parse.c
> index 68dc45417b..1533b43aaf 100644
> --- a/argp/argp-parse.c
> +++ b/argp/argp-parse.c
> @@ -147,7 +147,7 @@ argp_default_parser (int key, char *arg, struct argp_state *state)
>         break;
>   
>       case OPT_HANG:
> -      _argp_hang = atoi (arg ? arg : "3600");
> +      _argp_hang = arg ? strtol (arg, NULL, 10) : 3600;
>         while (_argp_hang-- > 0)
>   	__sleep (1);
>         break;
> diff --git a/include/features.h b/include/features.h
> index 123de9fd47..378608e626 100644
> --- a/include/features.h
> +++ b/include/features.h
> @@ -150,6 +150,7 @@
>   #undef	__GLIBC_USE_ISOC2X
>   #undef	__GLIBC_USE_DEPRECATED_GETS
>   #undef	__GLIBC_USE_DEPRECATED_SCANF
> +#undef	__GLIBC_USE_C2X_STRTOL
>   
>   /* Suppress kernel-name space pollution unless user expressedly asks
>      for it.  */
> @@ -463,6 +464,17 @@
>   # define __GLIBC_USE_DEPRECATED_SCANF 0
>   #endif
>   
> +/* ISO C2X added support for a 0b or 0B prefix on binary constants as
> +   inputs to strtol-family functions (base 0 or 2).  This macro is
> +   used to condition redirection in headers to allow that redirection
> +   to be disabled when building those functions, despite _GNU_SOURCE
> +   being defined.  */
> +#if __GLIBC_USE (ISOC2X)
> +# define __GLIBC_USE_C2X_STRTOL 1
> +#else
> +# define __GLIBC_USE_C2X_STRTOL 0
> +#endif
> +
>   /* Get definitions of __STDC_* predefined macros, if the compiler has
>      not preincluded this header automatically.  */
>   #include <stdc-predef.h>
> diff --git a/include/stdlib.h b/include/stdlib.h
> index db51f4a4f6..92d64ca12d 100644
> --- a/include/stdlib.h
> +++ b/include/stdlib.h
> @@ -35,6 +35,45 @@ libc_hidden_proto (__strtod_l)
>   libc_hidden_proto (__strtof_l)
>   libc_hidden_proto (__strtold_l)
>   
> +extern __typeof (strtol) __isoc23_strtol __attribute_copy__ (strtol);
> +extern __typeof (strtoul) __isoc23_strtoul __attribute_copy__ (strtoul);
> +extern __typeof (strtoll) __isoc23_strtoll __attribute_copy__ (strtoll);
> +extern __typeof (strtoull) __isoc23_strtoull __attribute_copy__ (strtoull);
> +extern __typeof (strtol_l) __isoc23_strtol_l __attribute_copy__ (strtol_l);
> +extern __typeof (strtoul_l) __isoc23_strtoul_l __attribute_copy__ (strtoul_l);
> +extern __typeof (strtoll_l) __isoc23_strtoll_l __attribute_copy__ (strtoll_l);
> +extern __typeof (strtoull_l) __isoc23_strtoull_l __attribute_copy__ (strtoull_l);
> +libc_hidden_proto (__isoc23_strtol)
> +libc_hidden_proto (__isoc23_strtoul)
> +libc_hidden_proto (__isoc23_strtoll)
> +libc_hidden_proto (__isoc23_strtoull)
> +libc_hidden_proto (__isoc23_strtol_l)
> +libc_hidden_proto (__isoc23_strtoul_l)
> +libc_hidden_proto (__isoc23_strtoll_l)
> +libc_hidden_proto (__isoc23_strtoull_l)
> +
> +#if __GLIBC_USE (C2X_STRTOL)
> +/* Redirect internal uses of these functions to the C2X versions; the
> +   redirection in the installed header does not work with
> +   libc_hidden_proto.  */
> +# undef strtol
> +# define strtol __isoc23_strtol
> +# undef strtoul
> +# define strtoul __isoc23_strtoul
> +# undef strtoll
> +# define strtoll __isoc23_strtoll
> +# undef strtoull
> +# define strtoull __isoc23_strtoull
> +# undef strtol_l
> +# define strtol_l __isoc23_strtol_l
> +# undef strtoul_l
> +# define strtoul_l __isoc23_strtoul_l
> +# undef strtoll_l
> +# define strtoll_l __isoc23_strtoll_l
> +# undef strtoull_l
> +# define strtoull_l __isoc23_strtoull_l
> +#endif
> +
>   libc_hidden_proto (exit)
>   libc_hidden_proto (abort)
>   libc_hidden_proto (getenv)
> @@ -202,23 +241,25 @@ extern long double ____strtold_l_internal (const char *__restrict __nptr,
>   extern long int ____strtol_l_internal (const char *__restrict __nptr,
>   				       char **__restrict __endptr,
>   				       int __base, int __group,
> -				       locale_t __loc);
> +				       int __bin_cst, locale_t __loc);
>   extern unsigned long int ____strtoul_l_internal (const char *
>   						 __restrict __nptr,
>   						 char **__restrict __endptr,
>   						 int __base, int __group,
> +						 int __bin_cst,
>   						 locale_t __loc);
>   __extension__
>   extern long long int ____strtoll_l_internal (const char *__restrict __nptr,
>   					     char **__restrict __endptr,
>   					     int __base, int __group,
> -					     locale_t __loc);
> +					     int __bin_cst, locale_t __loc);
>   __extension__
>   extern unsigned long long int ____strtoull_l_internal (const char *
>   						       __restrict __nptr,
>   						       char **
>   						       __restrict __endptr,
>   						       int __base, int __group,
> +						       int __bin_cst,
>   						       locale_t __loc);
>   
>   libc_hidden_proto (____strtof_l_internal)
> diff --git a/include/wchar.h b/include/wchar.h
> index db83297bca..5fa821ac3f 100644
> --- a/include/wchar.h
> +++ b/include/wchar.h
> @@ -34,6 +34,45 @@ libc_hidden_proto (__wcstof_l)
>   libc_hidden_proto (__wcstold_l)
>   libc_hidden_proto (__wcsftime_l)
>   
> +extern __typeof (wcstol) __isoc23_wcstol __attribute_copy__ (wcstol);
> +extern __typeof (wcstoul) __isoc23_wcstoul __attribute_copy__ (wcstoul);
> +extern __typeof (wcstoll) __isoc23_wcstoll __attribute_copy__ (wcstoll);
> +extern __typeof (wcstoull) __isoc23_wcstoull __attribute_copy__ (wcstoull);
> +extern __typeof (wcstol_l) __isoc23_wcstol_l __attribute_copy__ (wcstol_l);
> +extern __typeof (wcstoul_l) __isoc23_wcstoul_l __attribute_copy__ (wcstoul_l);
> +extern __typeof (wcstoll_l) __isoc23_wcstoll_l __attribute_copy__ (wcstoll_l);
> +extern __typeof (wcstoull_l) __isoc23_wcstoull_l __attribute_copy__ (wcstoull_l);
> +libc_hidden_proto (__isoc23_wcstol)
> +libc_hidden_proto (__isoc23_wcstoul)
> +libc_hidden_proto (__isoc23_wcstoll)
> +libc_hidden_proto (__isoc23_wcstoull)
> +libc_hidden_proto (__isoc23_wcstol_l)
> +libc_hidden_proto (__isoc23_wcstoul_l)
> +libc_hidden_proto (__isoc23_wcstoll_l)
> +libc_hidden_proto (__isoc23_wcstoull_l)
> +
> +#if __GLIBC_USE (C2X_STRTOL)
> +/* Redirect internal uses of these functions to the C2X versions; the
> +   redirection in the installed header does not work with
> +   libc_hidden_proto.  */
> +# undef wcstol
> +# define wcstol __isoc23_wcstol
> +# undef wcstoul
> +# define wcstoul __isoc23_wcstoul
> +# undef wcstoll
> +# define wcstoll __isoc23_wcstoll
> +# undef wcstoull
> +# define wcstoull __isoc23_wcstoull
> +# undef wcstol_l
> +# define wcstol_l __isoc23_wcstol_l
> +# undef wcstoul_l
> +# define wcstoul_l __isoc23_wcstoul_l
> +# undef wcstoll_l
> +# define wcstoll_l __isoc23_wcstoll_l
> +# undef wcstoull_l
> +# define wcstoull_l __isoc23_wcstoull_l
> +#endif
> +
>   
>   extern double __wcstod_internal (const wchar_t *__restrict __nptr,
>   				 wchar_t **__restrict __endptr, int __group)
> @@ -63,7 +102,7 @@ extern unsigned long long int __wcstoull_internal (const wchar_t *
>   						   int __group) __THROW;
>   extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
>   						       wchar_t **, int, int,
> -						       locale_t);
> +						       int, locale_t);
>   libc_hidden_proto (__wcstof_internal)
>   libc_hidden_proto (__wcstod_internal)
>   libc_hidden_proto (__wcstold_internal)
> @@ -86,17 +125,17 @@ extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int,
>   extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **,
>   					   int, locale_t) attribute_hidden;
>   extern long int ____wcstol_l_internal (const wchar_t *, wchar_t **, int,
> -				       int, locale_t) attribute_hidden;
> +				       int, int, locale_t) attribute_hidden;
>   extern unsigned long int ____wcstoul_l_internal (const wchar_t *,
>   						 wchar_t **,
> -						 int, int, locale_t)
> +						 int, int, int, locale_t)
>        attribute_hidden;
>   extern long long int ____wcstoll_l_internal (const wchar_t *, wchar_t **,
> -					     int, int, locale_t)
> +					     int, int, int, locale_t)
>        attribute_hidden;
>   extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
>   						       wchar_t **, int, int,
> -						       locale_t)
> +						       int, locale_t)
>        attribute_hidden;
>   
>   #if __HAVE_DISTINCT_FLOAT128
> diff --git a/inet/inet6_scopeid_pton.c b/inet/inet6_scopeid_pton.c
> index 13d3eabdc1..8000963364 100644
> --- a/inet/inet6_scopeid_pton.c
> +++ b/inet/inet6_scopeid_pton.c
> @@ -49,7 +49,7 @@ __inet6_scopeid_pton (const struct in6_addr *address, const char *scope,
>         char *end;
>         unsigned long long number
>           = ____strtoull_l_internal (scope, &end, /*base */ 10, /* group */ 0,
> -                                   _nl_C_locobj_ptr);
> +                                   /* bin_cst */ 0, _nl_C_locobj_ptr);
>         if (*end == '\0' && number <= UINT32_MAX)
>           {
>             *result = number;
> diff --git a/inet/rexec.c b/inet/rexec.c
> index 064e979d68..c647b7ac34 100644
> --- a/inet/rexec.c
> +++ b/inet/rexec.c
> @@ -134,7 +134,7 @@ retry:
>   		if (!getnameinfo(&sa2.sa, sa2len,
>   				 NULL, 0, servbuff, sizeof(servbuff),
>   				 NI_NUMERICSERV))
> -			port = atoi(servbuff);
> +			port = strtol(servbuff, NULL, 10);
>   		(void) sprintf(num, "%u", port);
>   		(void) __write(s, num, strlen(num)+1);
>   		{ socklen_t len = sizeof (from);
> diff --git a/locale/Versions b/locale/Versions
> index 72119349c1..fe525c94a6 100644
> --- a/locale/Versions
> +++ b/locale/Versions
> @@ -66,6 +66,12 @@ libc {
>       wcstoll_l; wcstoul_l; wcstoull_l; wcsxfrm_l; wctype_l;
>       wctrans_l; nl_langinfo_l;
>     }
> +  GLIBC_2.37 {
> +    __isoc23_strtol_l; __isoc23_strtoll_l;
> +    __isoc23_strtoul_l; __isoc23_strtoull_l;
> +    __isoc23_wcstol_l; __isoc23_wcstoll_l;
> +    __isoc23_wcstoul_l; __isoc23_wcstoull_l;
> +  }
>     GLIBC_PRIVATE {
>       # global variables
>       __collate_element_hash; __collate_element_strings;
> diff --git a/manual/arith.texi b/manual/arith.texi
> index edb9cfdafb..002621f11e 100644
> --- a/manual/arith.texi
> +++ b/manual/arith.texi
> @@ -2656,12 +2656,15 @@ A nonempty sequence of digits in the radix specified by @var{base}.
>   
>   If @var{base} is zero, decimal radix is assumed unless the series of
>   digits begins with @samp{0} (specifying octal radix), or @samp{0x} or
> -@samp{0X} (specifying hexadecimal radix); in other words, the same
> -syntax used for integer constants in C.
> +@samp{0X} (specifying hexadecimal radix), or @samp{0b} or @samp{0B}
> +(specifying binary radix; only supported when C2X features are
> +enabled); in other words, the same syntax used for integer constants in C.
>   
>   Otherwise @var{base} must have a value between @code{2} and @code{36}.
>   If @var{base} is @code{16}, the digits may optionally be preceded by
> -@samp{0x} or @samp{0X}.  If base has no legal value the value returned
> +@samp{0x} or @samp{0X}.  If @var{base} is @code{2}, and C2X features
> +are enabled, the digits may optionally be preceded by
> +@samp{0b} or @samp{0B}.  If base has no legal value the value returned
>   is @code{0l} and the global variable @code{errno} is set to @code{EINVAL}.
>   
>   @item
> diff --git a/resolv/Makefile b/resolv/Makefile
> index d9d887a0d0..6b58877b74 100644
> --- a/resolv/Makefile
> +++ b/resolv/Makefile
> @@ -105,6 +105,7 @@ tests += \
>     tst-resolv-res_init-multi \
>     tst-resolv-search \
>     tst-resolv-trailing \
> +  tst-inet_addr-binary \
>   
>   # This test calls __res_context_send directly, which is not exported
>   # from libresolv.
> diff --git a/resolv/inet_addr.c b/resolv/inet_addr.c
> index 8059a23ec9..e737f5bae8 100644
> --- a/resolv/inet_addr.c
> +++ b/resolv/inet_addr.c
> @@ -130,7 +130,7 @@ inet_aton_end (const char *cp, struct in_addr *addr, const char **endp)
>   	goto ret_0;
>         {
>   	char *endp;
> -	unsigned long ul = strtoul (cp, &endp, 0);
> +	unsigned long ul = __strtoul_internal (cp, &endp, 0, 0);
>   	if (ul == ULONG_MAX && errno == ERANGE)
>   	  goto ret_0;
>   	if (ul > 0xfffffffful)
> diff --git a/resolv/res_init.c b/resolv/res_init.c
> index 2c0bea658e..61b958a437 100644
> --- a/resolv/res_init.c
> +++ b/resolv/res_init.c
> @@ -654,7 +654,7 @@ res_setoptions (struct resolv_conf_parser *parser, const char *options)
>         /* Search for and process individual options.  */
>         if (!strncmp (cp, "ndots:", sizeof ("ndots:") - 1))
>           {
> -          int i = atoi (cp + sizeof ("ndots:") - 1);
> +          int i = strtol (cp + sizeof ("ndots:") - 1, NULL, 10);
>             if (i <= RES_MAXNDOTS)
>               parser->template.ndots = i;
>             else
> @@ -662,7 +662,7 @@ res_setoptions (struct resolv_conf_parser *parser, const char *options)
>           }
>         else if (!strncmp (cp, "timeout:", sizeof ("timeout:") - 1))
>           {
> -          int i = atoi (cp + sizeof ("timeout:") - 1);
> +          int i = strtol (cp + sizeof ("timeout:") - 1, NULL, 10);
>             if (i <= RES_MAXRETRANS)
>               parser->template.retrans = i;
>             else
> @@ -670,7 +670,7 @@ res_setoptions (struct resolv_conf_parser *parser, const char *options)
>           }
>         else if (!strncmp (cp, "attempts:", sizeof ("attempts:") - 1))
>           {
> -          int i = atoi (cp + sizeof ("attempts:") - 1);
> +          int i = strtol (cp + sizeof ("attempts:") - 1, NULL, 10);
>             if (i <= RES_MAXRETRY)
>               parser->template.retry = i;
>             else
> diff --git a/resolv/tst-inet_addr-binary.c b/resolv/tst-inet_addr-binary.c
> new file mode 100644
> index 0000000000..945d836359
> --- /dev/null
> +++ b/resolv/tst-inet_addr-binary.c
> @@ -0,0 +1,30 @@
> +/* Test inet_addr does not accept C2X binary constants.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <arpa/inet.h>
> +
> +#include <support/check.h>
> +
> +static int
> +do_test (void)
> +{
> +  TEST_COMPARE (inet_addr ("0b101"), (in_addr_t) -1);
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/stdlib/Makefile b/stdlib/Makefile
> index 417d525d8e..cdef153ff5 100644
> --- a/stdlib/Makefile
> +++ b/stdlib/Makefile
> @@ -243,6 +243,10 @@ tests := \
>     tst-width \
>     tst-width-stdint \
>     tst-xpg-basename \
> +  tst-strtol-binary-c11 \
> +  tst-strtol-binary-c2x \
> +  tst-strtol-binary-gnu11 \
> +  tst-strtol-binary-gnu2x \
>     # tests
>   
>   tests-internal := \
> @@ -394,6 +398,14 @@ CFLAGS-tst-makecontext2.c += $(stack-align-test-flags)
>   
>   CFLAGS-testmb.c += -D_FORTIFY_SOURCE=2 -Wall -Werror
>   
> +# Some versions of GCC supported for building glibc do not support -std=c2x
> +# or -std=gnu2x, so the tests for those versions use -std=c11 and -std=gnu11
> +# and then _ISOC2X_SOURCE is defined in the test as needed.
> +CFLAGS-tst-strtol-binary-c11.c += -std=c11
> +CFLAGS-tst-strtol-binary-c2x.c += -std=c11
> +CFLAGS-tst-strtol-binary-c11.c += -std=gnu11
> +CFLAGS-tst-strtol-binary-c2x.c += -std=gnu11
> +
>   
>   # Run a test on the header files we use.
>   tests-special += $(objpfx)isomac.out
> diff --git a/stdlib/Versions b/stdlib/Versions
> index ebc43263d6..5a856c7f8f 100644
> --- a/stdlib/Versions
> +++ b/stdlib/Versions
> @@ -142,6 +142,8 @@ libc {
>       arc4random_uniform;
>     }
>     GLIBC_2.37 {
> +    __isoc23_strtol; __isoc23_strtoll; __isoc23_strtoul; __isoc23_strtoull;
> +    __isoc23_strtoimax; __isoc23_strtoumax;
>     }
>     GLIBC_PRIVATE {
>       # functions which have an additional interface since they are
> diff --git a/stdlib/inttypes.h b/stdlib/inttypes.h
> index d550769f2a..26dbc77b1d 100644
> --- a/stdlib/inttypes.h
> +++ b/stdlib/inttypes.h
> @@ -311,6 +311,46 @@ extern uintmax_t wcstoumax (const __gwchar_t *__restrict __nptr,
>   			    __gwchar_t ** __restrict __endptr, int __base)
>        __THROW;
>   
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> +   in base 0 or 2.  */
> +#if __GLIBC_USE (C2X_STRTOL)
> +# ifdef __REDIRECT
> +extern intmax_t __REDIRECT_NTH (strtoimax, (const char *__restrict __nptr,
> +					    char **__restrict __endptr,
> +					    int __base), __isoc23_strtoimax);
> +extern uintmax_t __REDIRECT_NTH (strtoumax, (const char *__restrict __nptr,
> +					     char **__restrict __endptr,
> +					     int __base), __isoc23_strtoumax);
> +extern intmax_t __REDIRECT_NTH (wcstoimax,
> +				(const __gwchar_t *__restrict __nptr,
> +				 __gwchar_t **__restrict __endptr, int __base),
> +				__isoc23_wcstoimax);
> +extern uintmax_t __REDIRECT_NTH (wcstoumax,
> +				 (const __gwchar_t *__restrict __nptr,
> +				  __gwchar_t **__restrict __endptr, int __base),
> +				 __isoc23_wcstoumax);
> +# else
> +extern intmax_t __isoc23_strtoimax (const char *__restrict __nptr,
> +				    char **__restrict __endptr, int __base)
> +     __THROW;
> +extern uintmax_t __isoc23_strtoumax (const char *__restrict __nptr,
> +				     char ** __restrict __endptr, int __base)
> +     __THROW;
> +extern intmax_t __isoc23_wcstoimax (const __gwchar_t *__restrict __nptr,
> +				    __gwchar_t **__restrict __endptr,
> +				    int __base)
> +     __THROW;
> +extern uintmax_t __isoc23_wcstoumax (const __gwchar_t *__restrict __nptr,
> +				     __gwchar_t ** __restrict __endptr,
> +				     int __base)
> +     __THROW;
> +# define strtoimax __isoc23_strtoimax
> +# define strtoumax __isoc23_strtoumax
> +# define wcstoimax __isoc23_wcstoimax
> +# define wcstoumax __isoc23_wcstoumax
> +# endif
> +#endif
> +
>   __END_DECLS
>   
>   #endif /* inttypes.h */
> diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
> index 3a630a0ce8..58355beb56 100644
> --- a/stdlib/stdlib.h
> +++ b/stdlib/stdlib.h
> @@ -208,6 +208,71 @@ extern unsigned long long int strtoull (const char *__restrict __nptr,
>        __THROW __nonnull ((1));
>   #endif /* ISO C99 or use MISC.  */
>   
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> +   in base 0 or 2.  */
> +#if __GLIBC_USE (C2X_STRTOL)
> +# ifdef __REDIRECT
> +extern long int __REDIRECT_NTH (strtol, (const char *__restrict __nptr,
> +					 char **__restrict __endptr,
> +					 int __base), __isoc23_strtol)
> +     __nonnull ((1));
> +extern unsigned long int __REDIRECT_NTH (strtoul,
> +					 (const char *__restrict __nptr,
> +					  char **__restrict __endptr,
> +					  int __base), __isoc23_strtoul)
> +     __nonnull ((1));
> +#  ifdef __USE_MISC
> +__extension__
> +extern long long int __REDIRECT_NTH (strtoq, (const char *__restrict __nptr,
> +					      char **__restrict __endptr,
> +					      int __base), __isoc23_strtoll)
> +     __nonnull ((1));
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (strtouq,
> +					      (const char *__restrict __nptr,
> +					       char **__restrict __endptr,
> +					       int __base), __isoc23_strtoull)
> +     __nonnull ((1));
> +#  endif
> +__extension__
> +extern long long int __REDIRECT_NTH (strtoll, (const char *__restrict __nptr,
> +					       char **__restrict __endptr,
> +					       int __base), __isoc23_strtoll)
> +     __nonnull ((1));
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (strtoull,
> +					      (const char *__restrict __nptr,
> +					       char **__restrict __endptr,
> +					       int __base), __isoc23_strtoull)
> +     __nonnull ((1));
> +# else
> +extern long int __isoc23_strtol (const char *__restrict __nptr,
> +				 char **__restrict __endptr, int __base)
> +     __THROW __nonnull ((1));
> +extern unsigned long int __isoc23_strtoul (const char *__restrict __nptr,
> +					   char **__restrict __endptr,
> +					   int __base)
> +     __THROW __nonnull ((1));
> +__extension__
> +extern long long int __isoc23_strtoll (const char *__restrict __nptr,
> +				       char **__restrict __endptr, int __base)
> +     __THROW __nonnull ((1));
> +__extension__
> +extern unsigned long long int __isoc23_strtoull (const char *__restrict __nptr,
> +						 char **__restrict __endptr,
> +						 int __base)
> +     __THROW __nonnull ((1));
> +#  define strtol __isoc23_strtol
> +#  define strtoul __isoc23_strtoul
> +#  ifdef __USE_MISC
> +#   define strtoq __isoc23_strtoll
> +#   define strtouq __isoc23_strtoull
> +#  endif
> +#  define strtoll __isoc23_strtoll
> +#  define strtoull __isoc23_strtoull
> +# endif
> +#endif
> +
>   /* Convert a floating-point number to a string.  */
>   #if __GLIBC_USE (IEC_60559_BFP_EXT_C2X)
>   extern int strfromd (char *__dest, size_t __size, const char *__format,
> @@ -293,6 +358,60 @@ extern unsigned long long int strtoull_l (const char *__restrict __nptr,
>   					  int __base, locale_t __loc)
>        __THROW __nonnull ((1, 4));
>   
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> +   in base 0 or 2.  */
> +# if __GLIBC_USE (C2X_STRTOL)
> +#  ifdef __REDIRECT
> +extern long int __REDIRECT_NTH (strtol_l, (const char *__restrict __nptr,
> +					   char **__restrict __endptr,
> +					   int __base, locale_t __loc),
> +				__isoc23_strtol_l)
> +     __nonnull ((1, 4));
> +extern unsigned long int __REDIRECT_NTH (strtoul_l,
> +					 (const char *__restrict __nptr,
> +					  char **__restrict __endptr,
> +					  int __base, locale_t __loc),
> +					 __isoc23_strtoul_l)
> +     __nonnull ((1, 4));
> +__extension__
> +extern long long int __REDIRECT_NTH (strtoll_l, (const char *__restrict __nptr,
> +						 char **__restrict __endptr,
> +						 int __base,
> +						 locale_t __loc),
> +				     __isoc23_strtoll_l)
> +     __nonnull ((1, 4));
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (strtoull_l,
> +					      (const char *__restrict __nptr,
> +					       char **__restrict __endptr,
> +					       int __base, locale_t __loc),
> +					      __isoc23_strtoull_l)
> +     __nonnull ((1, 4));
> +#  else
> +extern long int __isoc23_strtol_l (const char *__restrict __nptr,
> +				   char **__restrict __endptr, int __base,
> +				   locale_t __loc) __THROW __nonnull ((1, 4));
> +extern unsigned long int __isoc23_strtoul_l (const char *__restrict __nptr,
> +					     char **__restrict __endptr,
> +					     int __base, locale_t __loc)
> +     __THROW __nonnull ((1, 4));
> +__extension__
> +extern long long int __isoc23_strtoll_l (const char *__restrict __nptr,
> +					 char **__restrict __endptr,
> +					 int __base, locale_t __loc)
> +     __THROW __nonnull ((1, 4));
> +__extension__
> +extern unsigned long long int __isoc23_strtoull_l (const char *__restrict __nptr,
> +						   char **__restrict __endptr,
> +						   int __base, locale_t __loc)
> +     __THROW __nonnull ((1, 4));
> +#   define strtol_l __isoc23_strtol_l
> +#   define strtoul_l __isoc23_strtoul_l
> +#   define strtoll_l __isoc23_strtoll_l
> +#   define strtoull_l __isoc23_strtoull_l
> +#  endif
> +# endif
> +
>   extern double strtod_l (const char *__restrict __nptr,
>   			char **__restrict __endptr, locale_t __loc)
>        __THROW __nonnull ((1, 3));
> diff --git a/stdlib/strtod_nan_narrow.h b/stdlib/strtod_nan_narrow.h
> index 3d4aac5497..d591e5994e 100644
> --- a/stdlib/strtod_nan_narrow.h
> +++ b/stdlib/strtod_nan_narrow.h
> @@ -19,4 +19,4 @@
>   #define STRING_TYPE char
>   #define L_(Ch) Ch
>   #define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0,	\
> -						   _nl_C_locobj_ptr)
> +						   0, _nl_C_locobj_ptr)
> diff --git a/stdlib/strtod_nan_wide.h b/stdlib/strtod_nan_wide.h
> index c06e91afa2..48a324dd92 100644
> --- a/stdlib/strtod_nan_wide.h
> +++ b/stdlib/strtod_nan_wide.h
> @@ -19,4 +19,4 @@
>   #define STRING_TYPE wchar_t
>   #define L_(Ch) L##Ch
>   #define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0,	\
> -						   _nl_C_locobj_ptr)
> +						   0, _nl_C_locobj_ptr)
> diff --git a/stdlib/strtol.c b/stdlib/strtol.c
> index be7719f493..e9479a6a34 100644
> --- a/stdlib/strtol.c
> +++ b/stdlib/strtol.c
> @@ -16,6 +16,9 @@
>      License along with the GNU C Library; if not, see
>      <https://www.gnu.org/licenses/>.  */
>   
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>   #include <stdlib.h>
>   #include <wchar.h>
>   #include <locale/localeinfo.h>
> @@ -32,17 +35,21 @@
>   #  ifdef QUAD
>   #   define strtol wcstoull
>   #   define __strtol_l __wcstoull_l
> +#   define __isoc23_strtol __isoc23_wcstoull
>   #  else
>   #   define strtol wcstoul
>   #   define __strtol_l __wcstoul_l
> +#   define __isoc23_strtol __isoc23_wcstoul
>   #  endif
>   # else
>   #  ifdef QUAD
>   #   define strtol strtoull
>   #   define __strtol_l __strtoull_l
> +#   define __isoc23_strtol __isoc23_strtoull
>   #  else
>   #   define strtol strtoul
>   #   define __strtol_l __strtoul_l
> +#   define __isoc23_strtol __isoc23_strtoul
>   #  endif
>   # endif
>   #else
> @@ -50,14 +57,17 @@
>   #  ifdef QUAD
>   #   define strtol wcstoll
>   #   define __strtol_l __wcstoll_l
> +#   define __isoc23_strtol __isoc23_wcstoll
>   #  else
>   #   define strtol wcstol
>   #   define __strtol_l __wcstol_l
> +#   define __isoc23_strtol __isoc23_wcstol
>   #  endif
>   # else
>   #  ifdef QUAD
>   #   define strtol strtoll
>   #   define __strtol_l __strtoll_l
> +#   define __isoc23_strtol __isoc23_strtoll
>   #  endif
>   # endif
>   #endif
> @@ -88,14 +98,15 @@
>   
>   
>   extern INT INTERNAL (__strtol_l) (const STRING_TYPE *, STRING_TYPE **, int,
> -				  int, locale_t);
> +				  int, int, locale_t);
>   
>   
>   INT
>   INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
>   		   int base, int group)
>   {
> -  return INTERNAL (__strtol_l) (nptr, endptr, base, group, _NL_CURRENT_LOCALE);
> +  return INTERNAL (__strtol_l) (nptr, endptr, base, group, 0,
> +				_NL_CURRENT_LOCALE);
>   }
>   libc_hidden_def (INTERNAL (strtol))
>   
> @@ -103,7 +114,14 @@ libc_hidden_def (INTERNAL (strtol))
>   INT
>   __strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr, int base)
>   {
> -  return INTERNAL (__strtol_l) (nptr, endptr, base, 0, _NL_CURRENT_LOCALE);
> +  return INTERNAL (__strtol_l) (nptr, endptr, base, 0, 0, _NL_CURRENT_LOCALE);
>   }
>   weak_alias (__strtol, strtol)
>   libc_hidden_weak (strtol)
> +
> +INT
> +__isoc23_strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr, int base)
> +{
> +  return INTERNAL (__strtol_l) (nptr, endptr, base, 0, 1, _NL_CURRENT_LOCALE);
> +}
> +libc_hidden_def (__isoc23_strtol)
> diff --git a/stdlib/strtol_l.c b/stdlib/strtol_l.c
> index 3e310e91fb..b652de9497 100644
> --- a/stdlib/strtol_l.c
> +++ b/stdlib/strtol_l.c
> @@ -16,6 +16,9 @@
>      License along with the GNU C Library; if not, see
>      <https://www.gnu.org/licenses/>.  */
>   
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>   
>   #if HAVE_CONFIG_H
>   # include <config.h>
> @@ -61,28 +64,36 @@
>   # ifdef USE_WIDE_CHAR
>   #  ifdef QUAD
>   #   define strtol_l wcstoull_l
> +#   define __isoc23_strtol_l __isoc23_wcstoull_l
>   #  else
>   #   define strtol_l wcstoul_l
> +#   define __isoc23_strtol_l __isoc23_wcstoul_l
>   #  endif
>   # else
>   #  ifdef QUAD
>   #   define strtol_l strtoull_l
> +#   define __isoc23_strtol_l __isoc23_strtoull_l
>   #  else
>   #   define strtol_l strtoul_l
> +#   define __isoc23_strtol_l __isoc23_strtoul_l
>   #  endif
>   # endif
>   #else
>   # ifdef USE_WIDE_CHAR
>   #  ifdef QUAD
>   #   define strtol_l wcstoll_l
> +#   define __isoc23_strtol_l __isoc23_wcstoll_l
>   #  else
>   #   define strtol_l wcstol_l
> +#   define __isoc23_strtol_l __isoc23_wcstol_l
>   #  endif
>   # else
>   #  ifdef QUAD
>   #   define strtol_l strtoll_l
> +#   define __isoc23_strtol_l __isoc23_strtoll_l
>   #  else
>   #   define strtol_l strtol_l
> +#   define __isoc23_strtol_l __isoc23_strtol_l
>   #  endif
>   # endif
>   #endif
> @@ -216,12 +227,14 @@ extern const unsigned char __strtol_ull_rem_tab[] attribute_hidden;
>      If BASE is 0 the base is determined by the presence of a leading
>      zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
>      If BASE is < 2 or > 36, it is reset to 10.
> +   If BIN_CST is nonzero, binary constants starting "0b" or "0B" are accepted
> +   in base 0 and 2.
>      If ENDPTR is not NULL, a pointer to the character after the last
>      one converted is stored in *ENDPTR.  */
>   
>   INT
>   INTERNAL (__strtol_l) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
> -		       int base, int group, locale_t loc)
> +		       int base, int group, int bin_cst, locale_t loc)
>   {
>     int negative;
>     unsigned LONG int cutoff;
> @@ -311,6 +324,11 @@ INTERNAL (__strtol_l) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
>   	  s += 2;
>   	  base = 16;
>   	}
> +      else if (bin_cst && (base == 0 || base == 2) && TOUPPER (s[1]) == L_('B'))
> +	{
> +	  s += 2;
> +	  base = 2;
> +	}
>         else if (base == 0)
>   	base = 8;
>       }
> @@ -543,7 +561,15 @@ weak_function
>   __strtol_l (const STRING_TYPE *nptr, STRING_TYPE **endptr,
>   	    int base, locale_t loc)
>   {
> -  return INTERNAL (__strtol_l) (nptr, endptr, base, 0, loc);
> +  return INTERNAL (__strtol_l) (nptr, endptr, base, 0, 0, loc);
>   }
>   libc_hidden_def (__strtol_l)
>   weak_alias (__strtol_l, strtol_l)
> +
> +INT
> +__isoc23_strtol_l (const STRING_TYPE *nptr, STRING_TYPE **endptr,
> +		   int base, locale_t loc)
> +{
> +  return INTERNAL (__strtol_l) (nptr, endptr, base, 0, 1, loc);
> +}
> +libc_hidden_def (__isoc23_strtol_l)
> diff --git a/stdlib/strtoll.c b/stdlib/strtoll.c
> index ad1bce12d6..684985243e 100644
> --- a/stdlib/strtoll.c
> +++ b/stdlib/strtoll.c
> @@ -31,4 +31,5 @@ compat_symbol (libc, __strtoll_internal, __strtoq_internal, GLIBC_2_0);
>   # endif
>   weak_alias (strtoll, strtoq)
>   weak_alias (strtoll, strtoimax)
> +weak_alias (__isoc23_strtoll, __isoc23_strtoimax)
>   #endif
> diff --git a/stdlib/strtoll_l.c b/stdlib/strtoll_l.c
> index 310497f523..2ca4e23146 100644
> --- a/stdlib/strtoll_l.c
> +++ b/stdlib/strtoll_l.c
> @@ -18,9 +18,12 @@
>   
>   #define QUAD	1
>   
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>   #include <locale.h>
>   
>   extern long long int ____strtoll_l_internal (const char *, char **, int, int,
> -					     locale_t);
> +					     int, locale_t);
>   
>   #include <strtol_l.c>
> diff --git a/stdlib/strtoul_l.c b/stdlib/strtoul_l.c
> index 29c075d7eb..650972750f 100644
> --- a/stdlib/strtoul_l.c
> +++ b/stdlib/strtoul_l.c
> @@ -18,9 +18,12 @@
>   
>   #define UNSIGNED	1
>   
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>   #include <locale.h>
>   
>   extern unsigned long int ____strtoul_l_internal (const char *, char **, int,
> -						 int, locale_t);
> +						 int, int, locale_t);
>   
>   #include "strtol_l.c"
> diff --git a/stdlib/strtoull.c b/stdlib/strtoull.c
> index 20e97a0a56..466524bcf8 100644
> --- a/stdlib/strtoull.c
> +++ b/stdlib/strtoull.c
> @@ -31,4 +31,5 @@ compat_symbol (libc, __strtoull_internal, __strtouq_internal, GLIBC_2_0);
>   # endif
>   weak_alias (strtoull, strtouq)
>   weak_alias (strtoull, strtoumax)
> +weak_alias (__isoc23_strtoull, __isoc23_strtoumax)
>   #endif
> diff --git a/stdlib/strtoull_l.c b/stdlib/strtoull_l.c
> index c680d629d3..3c57b0c092 100644
> --- a/stdlib/strtoull_l.c
> +++ b/stdlib/strtoull_l.c
> @@ -19,9 +19,13 @@
>   #define QUAD		1
>   #define UNSIGNED	1
>   
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>   #include <locale.h>
>   
>   extern unsigned long long int ____strtoull_l_internal (const char *, char **,
> -						       int, int, locale_t);
> +						       int, int, int,
> +						       locale_t);
>   
>   #include <strtol_l.c>
> diff --git a/stdlib/tst-strtol-binary-c11.c b/stdlib/tst-strtol-binary-c11.c
> new file mode 100644
> index 0000000000..7dcd711e3b
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-c11.c
> @@ -0,0 +1,29 @@
> +/* Test strtol functions with C2X binary integers (narrow strings,
> +   no extensions to C11).
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#undef _GNU_SOURCE
> +
> +#define CHAR char
> +#define FNPFX strto
> +#define L_(C) C
> +#define TEST_C2X 0
> +#define TEST_Q 0
> +#define TEST_LOCALE 0
> +
> +#include <tst-strtol-binary-main.c>
> diff --git a/stdlib/tst-strtol-binary-c2x.c b/stdlib/tst-strtol-binary-c2x.c
> new file mode 100644
> index 0000000000..185193ea75
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-c2x.c
> @@ -0,0 +1,32 @@
> +/* Test strtol functions with C2X binary integers (narrow strings,
> +   no extensions).
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +/* Some versions of GCC supported for building glibc do not support
> +   -std=c2x.  */
> +#undef _GNU_SOURCE
> +#define _ISOC2X_SOURCE
> +
> +#define CHAR char
> +#define FNPFX strto
> +#define L_(C) C
> +#define TEST_C2X 1
> +#define TEST_Q 0
> +#define TEST_LOCALE 0
> +
> +#include <tst-strtol-binary-main.c>
> diff --git a/stdlib/tst-strtol-binary-gnu11.c b/stdlib/tst-strtol-binary-gnu11.c
> new file mode 100644
> index 0000000000..89575a5f8f
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-gnu11.c
> @@ -0,0 +1,34 @@
> +/* Test strtol functions with C2X binary integers (narrow strings, GNU
> +   extensions, C2X strtol features disabled).
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <features.h>
> +/* This file tests the old versions of GNU extension functions, which
> +   are not normally available to new binaries because GNU extensions
> +   normally imply C2X strtol features.  */
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> +
> +#define CHAR char
> +#define FNPFX strto
> +#define L_(C) C
> +#define TEST_C2X 0
> +#define TEST_Q 1
> +#define TEST_LOCALE 1
> +
> +#include <tst-strtol-binary-main.c>
> diff --git a/stdlib/tst-strtol-binary-gnu2x.c b/stdlib/tst-strtol-binary-gnu2x.c
> new file mode 100644
> index 0000000000..cad4dfb670
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-gnu2x.c
> @@ -0,0 +1,27 @@
> +/* Test strtol functions with C2X binary integers (narrow strings, GNU
> +   extensions).
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define CHAR char
> +#define FNPFX strto
> +#define L_(C) C
> +#define TEST_C2X 1
> +#define TEST_Q 1
> +#define TEST_LOCALE 1
> +
> +#include <tst-strtol-binary-main.c>
> diff --git a/stdlib/tst-strtol-binary-main.c b/stdlib/tst-strtol-binary-main.c
> new file mode 100644
> index 0000000000..4b0ceed78d
> --- /dev/null
> +++ b/stdlib/tst-strtol-binary-main.c
> @@ -0,0 +1,123 @@
> +/* Test strtol functions with C2X binary integers.
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <inttypes.h>
> +#include <locale.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <wchar.h>
> +
> +#include <support/check.h>
> +
> +#define CONCAT_(X, Y) X ## Y
> +#define CONCAT(X, Y) CONCAT_ (X, Y)
> +#define FNX(FN) CONCAT (FNPFX, FN)
> +
> +#define CHECK_RES(ARG, RES, EP, EXPECTED)				\
> +  do									\
> +    {									\
> +      if (TEST_C2X)							\
> +	{								\
> +	  TEST_COMPARE ((RES), EXPECTED);				\
> +	  TEST_COMPARE (*(EP), 0);					\
> +	}								\
> +      else								\
> +	{								\
> +	  TEST_COMPARE ((RES), 0);					\
> +	  TEST_VERIFY ((EP) == ((ARG)[0] == L_('-')			\
> +				? (ARG) + 2				\
> +				: (ARG) + 1));				\
> +	}								\
> +    }									\
> +  while (0)
> +
> +static void
> +one_check (const CHAR *s, int expected)
> +{
> +  CHAR *ep;
> +  long int ret_l;
> +  unsigned long int ret_ul;
> +  long long int ret_ll;
> +  unsigned long long int ret_ull;
> +  ret_l = FNX (l) (s, &ep, 0);
> +  CHECK_RES (s, ret_l, ep, (long int) expected);
> +  ret_l = FNX (l) (s, &ep, 2);
> +  CHECK_RES (s, ret_l, ep, (long int) expected);
> +  ret_ul = FNX (ul) (s, &ep, 0);
> +  CHECK_RES (s, ret_ul, ep, (unsigned long int) expected);
> +  ret_ul = FNX (ul) (s, &ep, 2);
> +  CHECK_RES (s, ret_ul, ep, (unsigned long int) expected);
> +  ret_ll = FNX (ll) (s, &ep, 0);
> +  CHECK_RES (s, ret_ll, ep, (long long int) expected);
> +  ret_ll = FNX (ll) (s, &ep, 2);
> +  CHECK_RES (s, ret_ll, ep, (long long int) expected);
> +  ret_ull = FNX (ull) (s, &ep, 0);
> +  CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +  ret_ull = FNX (ull) (s, &ep, 2);
> +  CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +  ret_ll = FNX (imax) (s, &ep, 0);
> +  CHECK_RES (s, ret_ll, ep, (long long int) expected);
> +  ret_ll = FNX (imax) (s, &ep, 2);
> +  CHECK_RES (s, ret_ll, ep, (long long int) expected);
> +  ret_ull = FNX (umax) (s, &ep, 0);
> +  CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +  ret_ull = FNX (umax) (s, &ep, 2);
> +  CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +#if TEST_Q
> +  ret_ll = FNX (q) (s, &ep, 0);
> +  CHECK_RES (s, ret_ll, ep, (long long int) expected);
> +  ret_ll = FNX (q) (s, &ep, 2);
> +  CHECK_RES (s, ret_ll, ep, (long long int) expected);
> +  ret_ull = FNX (uq) (s, &ep, 0);
> +  CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +  ret_ull = FNX (uq) (s, &ep, 2);
> +  CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +#endif
> +#if TEST_LOCALE
> +  locale_t loc = newlocale (LC_NUMERIC_MASK, "C", (locale_t) 0);
> +  TEST_VERIFY_EXIT (loc != (locale_t) 0);
> +  ret_l = FNX (l_l) (s, &ep, 0, loc);
> +  CHECK_RES (s, ret_l, ep, (long int) expected);
> +  ret_l = FNX (l_l) (s, &ep, 2, loc);
> +  CHECK_RES (s, ret_l, ep, (long int) expected);
> +  ret_ul = FNX (ul_l) (s, &ep, 0, loc);
> +  CHECK_RES (s, ret_ul, ep, (unsigned long int) expected);
> +  ret_ul = FNX (ul_l) (s, &ep, 2, loc);
> +  CHECK_RES (s, ret_ul, ep, (unsigned long int) expected);
> +  ret_ll = FNX (ll_l) (s, &ep, 0, loc);
> +  CHECK_RES (s, ret_ll, ep, (long long int) expected);
> +  ret_ll = FNX (ll_l) (s, &ep, 2, loc);
> +  CHECK_RES (s, ret_ll, ep, (long long int) expected);
> +  ret_ull = FNX (ull_l) (s, &ep, 0, loc);
> +  CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +  ret_ull = FNX (ull_l) (s, &ep, 2, loc);
> +  CHECK_RES (s, ret_ull, ep, (unsigned long long int) expected);
> +#endif
> +}
> +
> +static int
> +do_test (void)
> +{
> +  one_check (L_("0b101"), 5);
> +  one_check (L_("0B101"), 5);
> +  one_check (L_("-0b11111"), -31);
> +  one_check (L_("-0B11111"), -31);
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
> index 4e3200ef55..340d330352 100644
> --- a/sysdeps/mach/hurd/i386/libc.abilist
> +++ b/sysdeps/mach/hurd/i386/libc.abilist
> @@ -2294,6 +2294,26 @@ GLIBC_2.36 arc4random_buf F
>   GLIBC_2.36 arc4random_uniform F
>   GLIBC_2.36 c8rtomb F
>   GLIBC_2.36 mbrtoc8 F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
>   GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index b66fadef40..0b7d5bfd0a 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -2633,3 +2633,23 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index f918bb2d48..70f8f457f3 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -2730,6 +2730,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.4 _IO_fprintf F
>   GLIBC_2.4 _IO_printf F
>   GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
> index 093043a533..5ecb023dcf 100644
> --- a/sysdeps/unix/sysv/linux/arc/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
> @@ -2394,3 +2394,23 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> index f28402fe03..84b380c8e5 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> @@ -513,6 +513,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 _Exit F
>   GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> index e2f56880ed..a32367ffb3 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> @@ -510,6 +510,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 _Exit F
>   GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
> index 319d92356e..915e490b43 100644
> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
> @@ -2669,4 +2669,24 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index 6450e17ebe..51241bae74 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -2618,6 +2618,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index 0a24ec9afd..79f1435daa 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -2802,6 +2802,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> index 02c65b6482..d4ebdf48d3 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> @@ -2568,6 +2568,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
>   GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> index 62faaf4c00..acc324b44e 100644
> --- a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> @@ -2154,3 +2154,23 @@ GLIBC_2.36 wprintf F
>   GLIBC_2.36 write F
>   GLIBC_2.36 writev F
>   GLIBC_2.36 wscanf F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index 16243a7a92..7ecf9323e8 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -514,6 +514,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 _Exit F
>   GLIBC_2.4 _IO_2_1_stderr_ D 0x98
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index 564a553b27..3ef3564853 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -2745,6 +2745,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> index e850f47b21..251981d9bb 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> @@ -2718,4 +2718,24 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> index 37178c503f..577cd189cb 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> @@ -2715,4 +2715,24 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index 3b30b31466..3feb978017 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -2710,6 +2710,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index 0e358570a2..32f6411658 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -2708,6 +2708,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index 59c598b98f..cc8329c0d8 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -2716,6 +2716,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index 2f7f1ccaf7..6cac0c3c4d 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -2619,6 +2619,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
>   GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> index 463e01ab84..923eae8e9e 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> @@ -2757,4 +2757,24 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
> diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> index ffdb8819d5..da607a3cc0 100644
> --- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> @@ -2140,3 +2140,23 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index 405d40d11c..bf4be05150 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -2772,6 +2772,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 _IO_fprintf F
>   GLIBC_2.4 _IO_printf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index ce89602b93..a5e1f40c79 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -2805,6 +2805,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 _IO_fprintf F
>   GLIBC_2.4 _IO_printf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> index 849863e639..25938d48ad 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> @@ -2527,6 +2527,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.4 _IO_fprintf F
>   GLIBC_2.4 _IO_printf F
>   GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> index b2ccee08c6..98666d8293 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> @@ -2829,3 +2829,23 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> index ff90d1bff2..96e503b850 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> @@ -2396,3 +2396,23 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> index f1017f6ec5..13d9b2414b 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> @@ -2596,3 +2596,23 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> index 5ca051a9eb..a38ff8cdd3 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> @@ -2770,6 +2770,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 _IO_fprintf F
>   GLIBC_2.4 _IO_printf F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> index 0e0b3df973..cf4e85e4e5 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> @@ -2564,6 +2564,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.4 _IO_fprintf F
>   GLIBC_2.4 _IO_printf F
>   GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> index 5b48168ec6..cd4ed8377b 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> @@ -2625,6 +2625,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> index c42b39cea8..27cb9532b9 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> @@ -2622,6 +2622,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index 5a0a662dee..4bfb40d957 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -2765,6 +2765,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.37 __ppoll64_chk F
>   GLIBC_2.4 _IO_fprintf F
>   GLIBC_2.4 _IO_printf F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index 9ec4a0bc7f..36d2262766 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -2591,6 +2591,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
>   GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index 367c8d0a03..e86bc7cbd4 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -2542,6 +2542,26 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
>   GLIBC_2.4 __confstr_chk F
>   GLIBC_2.4 __fgets_chk F
>   GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index 6a614efb62..ee95b6a2b6 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -2648,3 +2648,23 @@ GLIBC_2.36 pidfd_open F
>   GLIBC_2.36 pidfd_send_signal F
>   GLIBC_2.36 process_madvise F
>   GLIBC_2.36 process_mrelease F
> +GLIBC_2.37 __isoc23_strtoimax F
> +GLIBC_2.37 __isoc23_strtol F
> +GLIBC_2.37 __isoc23_strtol_l F
> +GLIBC_2.37 __isoc23_strtoll F
> +GLIBC_2.37 __isoc23_strtoll_l F
> +GLIBC_2.37 __isoc23_strtoul F
> +GLIBC_2.37 __isoc23_strtoul_l F
> +GLIBC_2.37 __isoc23_strtoull F
> +GLIBC_2.37 __isoc23_strtoull_l F
> +GLIBC_2.37 __isoc23_strtoumax F
> +GLIBC_2.37 __isoc23_wcstoimax F
> +GLIBC_2.37 __isoc23_wcstol F
> +GLIBC_2.37 __isoc23_wcstol_l F
> +GLIBC_2.37 __isoc23_wcstoll F
> +GLIBC_2.37 __isoc23_wcstoll_l F
> +GLIBC_2.37 __isoc23_wcstoul F
> +GLIBC_2.37 __isoc23_wcstoul_l F
> +GLIBC_2.37 __isoc23_wcstoull F
> +GLIBC_2.37 __isoc23_wcstoull_l F
> +GLIBC_2.37 __isoc23_wcstoumax F
> diff --git a/sysdeps/wordsize-64/strtol.c b/sysdeps/wordsize-64/strtol.c
> index a1b2374153..a21fa8da10 100644
> --- a/sysdeps/wordsize-64/strtol.c
> +++ b/sysdeps/wordsize-64/strtol.c
> @@ -2,12 +2,14 @@
>   #define __strtoll_internal __strtoll_internal_XXX
>   #define strtoll strtoll_XXX
>   #define strtoq strtoq_XXX
> +#define __isoc23_strtoll __isoc23_strtoll_XXX
>   
>   #include <stdlib/strtol.c>
>   
>   #undef __strtoll_internal
>   #undef strtoll
>   #undef strtoq
> +#undef __isoc23_strtoll
>   strong_alias (__strtol_internal, __strtoll_internal)
>   libc_hidden_ver (__strtol_internal, __strtoll_internal)
>   weak_alias (strtol, strtoll)
> @@ -15,3 +17,6 @@ libc_hidden_ver (strtol, strtoll)
>   weak_alias (strtol, strtoq)
>   libc_hidden_ver (strtol, strtoq)
>   weak_alias (strtol, strtoimax)
> +weak_alias (__isoc23_strtol, __isoc23_strtoll)
> +libc_hidden_ver (__isoc23_strtol, __isoc23_strtoll)
> +weak_alias (__isoc23_strtol, __isoc23_strtoimax)
> diff --git a/sysdeps/wordsize-64/strtol_l.c b/sysdeps/wordsize-64/strtol_l.c
> index b2cd102add..a44afa2e44 100644
> --- a/sysdeps/wordsize-64/strtol_l.c
> +++ b/sysdeps/wordsize-64/strtol_l.c
> @@ -2,13 +2,17 @@
>   #define ____strtoll_l_internal ____strtoll_l_internal_XXX
>   #define __strtoll_l __strtoll_l_XXX
>   #define strtoll_l strtoll_l_XXX
> +#define __isoc23_strtoll_l __isoc23_strtoll_l_XXX
>   
>   #include <stdlib/strtol_l.c>
>   
>   #undef ____strtoll_l_internal
>   #undef __strtoll_l
>   #undef strtoll_l
> +#undef __isoc23_strtoll_l
>   strong_alias (____strtol_l_internal, ____strtoll_l_internal)
>   libc_hidden_ver (____strtol_l_internal, ____strtoll_l_internal)
>   weak_alias (__strtol_l, __strtoll_l)
>   weak_alias (__strtol_l, strtoll_l)
> +weak_alias (__isoc23_strtol_l, __isoc23_strtoll_l)
> +libc_hidden_ver (__isoc23_strtol_l, __isoc23_strtoll_l)
> diff --git a/sysdeps/wordsize-64/strtoul.c b/sysdeps/wordsize-64/strtoul.c
> index 856aa11dee..60c82b89d9 100644
> --- a/sysdeps/wordsize-64/strtoul.c
> +++ b/sysdeps/wordsize-64/strtoul.c
> @@ -2,14 +2,19 @@
>   #define __strtoull_internal __strtoull_internal_XXX
>   #define strtoull strtoull_XXX
>   #define strtouq strtouq_XXX
> +#define __isoc23_strtoull __isoc23_strtoull_XXX
>   
>   #include <stdlib/strtoul.c>
>   
>   #undef __strtoull_internal
>   #undef strtoull
>   #undef strtouq
> +#undef __isoc23_strtoull
>   strong_alias (__strtoul_internal, __strtoull_internal)
>   libc_hidden_ver (__strtoul_internal, __strtoull_internal)
>   weak_alias (strtoul, strtoull)
>   weak_alias (strtoul, strtouq)
>   weak_alias (strtoul, strtoumax)
> +weak_alias (__isoc23_strtoul, __isoc23_strtoull)
> +libc_hidden_ver (__isoc23_strtoul, __isoc23_strtoull)
> +weak_alias (__isoc23_strtoul, __isoc23_strtoumax)
> diff --git a/sysdeps/wordsize-64/strtoul_l.c b/sysdeps/wordsize-64/strtoul_l.c
> index 80cca332b1..b3b74f44b3 100644
> --- a/sysdeps/wordsize-64/strtoul_l.c
> +++ b/sysdeps/wordsize-64/strtoul_l.c
> @@ -2,13 +2,17 @@
>   #define ____strtoull_l_internal ____strtoull_l_internal_XXX
>   #define __strtoull_l __strtoull_l_XXX
>   #define strtoull_l strtoull_l_XXX
> +#define __isoc23_strtoull_l __isoc23_strtoull_l_XXX
>   
>   #include <stdlib/strtoul_l.c>
>   
>   #undef ____strtoull_l_internal
>   #undef __strtoull_l
>   #undef strtoull_l
> +#undef __isoc23_strtoull_l
>   strong_alias (____strtoul_l_internal, ____strtoull_l_internal)
>   libc_hidden_ver (____strtoul_l_internal, ____strtoull_l_internal)
>   weak_alias (__strtoul_l, __strtoull_l)
>   weak_alias (__strtoul_l, strtoull_l)
> +weak_alias (__isoc23_strtoul_l, __isoc23_strtoull_l)
> +libc_hidden_ver (__isoc23_strtoul_l, __isoc23_strtoull_l)
> diff --git a/sysdeps/wordsize-64/wcstol.c b/sysdeps/wordsize-64/wcstol.c
> index f99c273d95..557c763941 100644
> --- a/sysdeps/wordsize-64/wcstol.c
> +++ b/sysdeps/wordsize-64/wcstol.c
> @@ -2,14 +2,19 @@
>   #define __wcstoll_internal __wcstoll_internal_XXX
>   #define wcstoll wcstoll_XXX
>   #define wcstoq wcstoq_XXX
> +#define __isoc23_wcstoll __isoc23_wcstoll_XXX
>   
>   #include <wcsmbs/wcstol.c>
>   
>   #undef __wcstoll_internal
>   #undef wcstoll
>   #undef wcstoq
> +#undef __isoc23_wcstoll
>   strong_alias (__wcstol_internal, __wcstoll_internal)
>   libc_hidden_ver (__wcstol_internal, __wcstoll_internal)
>   weak_alias (wcstol, wcstoll)
>   weak_alias (wcstol, wcstoq)
>   weak_alias (wcstol, wcstoimax)
> +weak_alias (__isoc23_wcstol, __isoc23_wcstoll)
> +libc_hidden_ver (__isoc23_wcstol, __isoc23_wcstoll)
> +weak_alias (__isoc23_wcstol, __isoc23_wcstoimax)
> diff --git a/sysdeps/wordsize-64/wcstol_l.c b/sysdeps/wordsize-64/wcstol_l.c
> index 4f48f60c65..b402790fdd 100644
> --- a/sysdeps/wordsize-64/wcstol_l.c
> +++ b/sysdeps/wordsize-64/wcstol_l.c
> @@ -2,12 +2,16 @@
>   #define ____wcstoll_l_internal ____wcstoll_l_internal_XXX
>   #define __wcstoll_l ___wcstoll_l_XXX
>   #define wcstoll_l __wcstoll_l_XX
> +#define __isoc23_wcstoll_l __isoc23_wcstoll_l_XXX
>   
>   #include <wcsmbs/wcstol_l.c>
>   
>   #undef ____wcstoll_l_internal
>   #undef __wcstoll_l
>   #undef wcstoll_l
> +#undef __isoc23_wcstoll_l
>   strong_alias (____wcstol_l_internal, ____wcstoll_l_internal)
>   weak_alias (__wcstol_l, __wcstoll_l)
>   weak_alias (__wcstol_l, wcstoll_l)
> +weak_alias (__isoc23_wcstol_l, __isoc23_wcstoll_l)
> +libc_hidden_ver (__isoc23_wcstol_l, __isoc23_wcstoll_l)
> diff --git a/sysdeps/wordsize-64/wcstoul.c b/sysdeps/wordsize-64/wcstoul.c
> index e1458e17f3..9b48ca6ab2 100644
> --- a/sysdeps/wordsize-64/wcstoul.c
> +++ b/sysdeps/wordsize-64/wcstoul.c
> @@ -2,14 +2,19 @@
>   #define __wcstoull_internal __wcstoull_internal_XXX
>   #define wcstoull wcstoull_XXX
>   #define wcstouq wcstouq_XXX
> +#define __isoc23_wcstoull __isoc23_wcstoull_XXX
>   
>   #include <wcsmbs/wcstoul.c>
>   
>   #undef __wcstoull_internal
>   #undef wcstoull
>   #undef wcstouq
> +#undef __isoc23_wcstoull
>   strong_alias (__wcstoul_internal, __wcstoull_internal)
>   libc_hidden_ver (__wcstoul_internal, __wcstoull_internal)
>   weak_alias (wcstoul, wcstoull)
>   weak_alias (wcstoul, wcstouq)
>   weak_alias (wcstoul, wcstoumax)
> +weak_alias (__isoc23_wcstoul, __isoc23_wcstoull)
> +libc_hidden_ver (__isoc23_wcstoul, __isoc23_wcstoull)
> +weak_alias (__isoc23_wcstoul, __isoc23_wcstoumax)
> diff --git a/sysdeps/wordsize-64/wcstoul_l.c b/sysdeps/wordsize-64/wcstoul_l.c
> index c376fa0e81..a5001ba83f 100644
> --- a/sysdeps/wordsize-64/wcstoul_l.c
> +++ b/sysdeps/wordsize-64/wcstoul_l.c
> @@ -2,12 +2,16 @@
>   #define ____wcstoull_l_internal ____wcstoull_l_internal_XXX
>   #define __wcstoull_l ___wcstoull_l_XXX
>   #define wcstoull_l __wcstoull_l_XXX
> +#define __isoc23_wcstoull_l __isoc23_wcstoull_l_XXX
>   
>   #include <wcsmbs/wcstoul_l.c>
>   
>   #undef ____wcstoull_l_internal
>   #undef __wcstoull_l
>   #undef wcstoull_l
> +#undef __isoc23_wcstoull_l
>   strong_alias (____wcstoul_l_internal, ____wcstoull_l_internal)
>   weak_alias (__wcstoul_l, __wcstoull_l)
>   weak_alias (__wcstoul_l, wcstoull_l)
> +weak_alias (__isoc23_wcstoul_l, __isoc23_wcstoull_l)
> +libc_hidden_ver (__isoc23_wcstoul_l, __isoc23_wcstoull_l)
> diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
> index aaa067fc69..6448b826fb 100644
> --- a/wcsmbs/Makefile
> +++ b/wcsmbs/Makefile
> @@ -55,7 +55,8 @@ tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
>   	 tst-wcstod-nan-sign tst-c16-surrogate tst-c32-state \
>   	 test-mbrtoc8 test-c8rtomb \
>   	 $(addprefix test-,$(strop-tests)) tst-mbstowcs \
> -	 tst-wprintf-binary
> +	 tst-wprintf-binary tst-wcstol-binary-c11 tst-wcstol-binary-c2x \
> +	 tst-wcstol-binary-gnu11 tst-wcstol-binary-gnu2x
>   
>   include ../Rules
>   
> @@ -122,3 +123,11 @@ CPPFLAGS-wcstold_l.c += -I../stdlib
>   
>   $(objpfx)tst-wcstod-nan-locale: $(libm)
>   $(objpfx)tst-wcstod-nan-sign: $(libm)
> +
> +# Some versions of GCC supported for building glibc do not support -std=c2x
> +# or -std=gnu2x, so the tests for those versions use -std=c11 and -std=gnu11
> +# and then _ISOC2X_SOURCE is defined in the test as needed.
> +CFLAGS-tst-wcstol-binary-c11.c += -std=c11
> +CFLAGS-tst-wcstol-binary-c2x.c += -std=c11
> +CFLAGS-tst-wcstol-binary-c11.c += -std=gnu11
> +CFLAGS-tst-wcstol-binary-c2x.c += -std=gnu11
> diff --git a/wcsmbs/Versions b/wcsmbs/Versions
> index ec28acfb73..90c730abde 100644
> --- a/wcsmbs/Versions
> +++ b/wcsmbs/Versions
> @@ -52,4 +52,8 @@ libc {
>     GLIBC_2.36 {
>       c8rtomb; mbrtoc8;
>     }
> +  GLIBC_2.37 {
> +    __isoc23_wcstol; __isoc23_wcstoll; __isoc23_wcstoul; __isoc23_wcstoull;
> +    __isoc23_wcstoimax; __isoc23_wcstoumax;
> +  }
>   }
> diff --git a/wcsmbs/tst-wcstol-binary-c11.c b/wcsmbs/tst-wcstol-binary-c11.c
> new file mode 100644
> index 0000000000..8333df3c66
> --- /dev/null
> +++ b/wcsmbs/tst-wcstol-binary-c11.c
> @@ -0,0 +1,29 @@
> +/* Test wcstol functions with C2X binary integers (wide strings,
> +   no extensions to C11).
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#undef _GNU_SOURCE
> +
> +#define CHAR wchar_t
> +#define FNPFX wcsto
> +#define L_(C) L ## C
> +#define TEST_C2X 0
> +#define TEST_Q 0
> +#define TEST_LOCALE 0
> +
> +#include "../stdlib/tst-strtol-binary-main.c"
> diff --git a/wcsmbs/tst-wcstol-binary-c2x.c b/wcsmbs/tst-wcstol-binary-c2x.c
> new file mode 100644
> index 0000000000..aa36315f30
> --- /dev/null
> +++ b/wcsmbs/tst-wcstol-binary-c2x.c
> @@ -0,0 +1,32 @@
> +/* Test wcstol functions with C2X binary integers (wide strings,
> +   no extensions).
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +/* Some versions of GCC supported for building glibc do not support
> +   -std=c2x.  */
> +#undef _GNU_SOURCE
> +#define _ISOC2X_SOURCE
> +
> +#define CHAR wchar_t
> +#define FNPFX wcsto
> +#define L_(C) L ## C
> +#define TEST_C2X 1
> +#define TEST_Q 0
> +#define TEST_LOCALE 0
> +
> +#include "../stdlib/tst-strtol-binary-main.c"
> diff --git a/wcsmbs/tst-wcstol-binary-gnu11.c b/wcsmbs/tst-wcstol-binary-gnu11.c
> new file mode 100644
> index 0000000000..1a04233629
> --- /dev/null
> +++ b/wcsmbs/tst-wcstol-binary-gnu11.c
> @@ -0,0 +1,34 @@
> +/* Test wcstol functions with C2X binary integers (wide strings, GNU
> +   extensions, C2X wcstol features disabled).
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <features.h>
> +/* This file tests the old versions of GNU extension functions, which
> +   are not normally available to new binaries because GNU extensions
> +   normally imply C2X wcstol features.  */
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
> +
> +#define CHAR wchar_t
> +#define FNPFX wcsto
> +#define L_(C) L ## C
> +#define TEST_C2X 0
> +#define TEST_Q 1
> +#define TEST_LOCALE 1
> +
> +#include "../stdlib/tst-strtol-binary-main.c"
> diff --git a/wcsmbs/tst-wcstol-binary-gnu2x.c b/wcsmbs/tst-wcstol-binary-gnu2x.c
> new file mode 100644
> index 0000000000..36bc075025
> --- /dev/null
> +++ b/wcsmbs/tst-wcstol-binary-gnu2x.c
> @@ -0,0 +1,27 @@
> +/* Test wcstol functions with C2X binary integers (wide strings, GNU
> +   extensions).
> +   Copyright (C) 2022 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define CHAR wchar_t
> +#define FNPFX wcsto
> +#define L_(C) L ## C
> +#define TEST_C2X 1
> +#define TEST_Q 1
> +#define TEST_LOCALE 1
> +
> +#include "../stdlib/tst-strtol-binary-main.c"
> diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
> index c1321c7518..44d493a56c 100644
> --- a/wcsmbs/wchar.h
> +++ b/wcsmbs/wchar.h
> @@ -467,6 +467,67 @@ extern unsigned long long int wcstouq (const wchar_t *__restrict __nptr,
>   				       int __base) __THROW;
>   #endif /* Use GNU.  */
>   
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> +   in base 0 or 2.  */
> +#if __GLIBC_USE (C2X_STRTOL)
> +# ifdef __REDIRECT
> +extern long int __REDIRECT_NTH (wcstol, (const wchar_t *__restrict __nptr,
> +					 wchar_t **__restrict __endptr,
> +					 int __base), __isoc23_wcstol);
> +extern unsigned long int __REDIRECT_NTH (wcstoul,
> +					 (const wchar_t *__restrict __nptr,
> +					  wchar_t **__restrict __endptr,
> +					  int __base), __isoc23_wcstoul);
> +__extension__
> +extern long long int __REDIRECT_NTH (wcstoll,
> +				     (const wchar_t *__restrict __nptr,
> +				      wchar_t **__restrict __endptr,
> +				      int __base), __isoc23_wcstoll);
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (wcstoull,
> +					      (const wchar_t *__restrict __nptr,
> +					       wchar_t **__restrict __endptr,
> +					       int __base), __isoc23_wcstoull);
> +#  ifdef __USE_GNU
> +__extension__
> +extern long long int __REDIRECT_NTH (wcstoq, (const wchar_t *__restrict __nptr,
> +					      wchar_t **__restrict __endptr,
> +					      int __base), __isoc23_wcstoll);
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (wcstouq,
> +					      (const wchar_t *__restrict __nptr,
> +					       wchar_t **__restrict __endptr,
> +					       int __base), __isoc23_wcstoull);
> +#  endif
> +# else
> +extern long int __isoc23_wcstol (const wchar_t *__restrict __nptr,
> +				 wchar_t **__restrict __endptr, int __base)
> +     __THROW;
> +extern unsigned long int __isoc23_wcstoul (const wchar_t *__restrict __nptr,
> +					   wchar_t **__restrict __endptr,
> +					   int __base)
> +     __THROW;
> +__extension__
> +extern long long int __isoc23_wcstoll (const wchar_t *__restrict __nptr,
> +				       wchar_t **__restrict __endptr,
> +				       int __base)
> +     __THROW;
> +__extension__
> +extern unsigned long long int __isoc23_wcstoull (const wchar_t *__restrict __nptr,
> +						 wchar_t **__restrict __endptr,
> +						 int __base)
> +     __THROW;
> +#  define wcstol __isoc23_wcstol
> +#  define wcstoul __isoc23_wcstoul
> +#  define wcstoll __isoc23_wcstoll
> +#  define wcstoull __isoc23_wcstoull
> +#  ifdef __USE_GNU
> +#   define wcstoq __isoc23_wcstoll
> +#   define wcstouq __isoc23_wcstoull
> +#  endif
> +# endif
> +#endif
> +
>   #ifdef __USE_GNU
>   /* Parallel versions of the functions above which take the locale to
>      use as an additional parameter.  These are GNU extensions inspired
> @@ -490,6 +551,56 @@ extern unsigned long long int wcstoull_l (const wchar_t *__restrict __nptr,
>   					  int __base, locale_t __loc)
>        __THROW;
>   
> +/* Versions of the above functions that handle '0b' and '0B' prefixes
> +   in base 0 or 2.  */
> +# if __GLIBC_USE (C2X_STRTOL)
> +#  ifdef __REDIRECT
> +extern long int __REDIRECT_NTH (wcstol_l, (const wchar_t *__restrict __nptr,
> +					   wchar_t **__restrict __endptr,
> +					   int __base, locale_t __loc),
> +				__isoc23_wcstol_l);
> +extern unsigned long int __REDIRECT_NTH (wcstoul_l,
> +					 (const wchar_t *__restrict __nptr,
> +					  wchar_t **__restrict __endptr,
> +					  int __base, locale_t __loc),
> +					 __isoc23_wcstoul_l);
> +__extension__
> +extern long long int __REDIRECT_NTH (wcstoll_l,
> +				     (const wchar_t *__restrict __nptr,
> +				      wchar_t **__restrict __endptr,
> +				      int __base, locale_t __loc),
> +				     __isoc23_wcstoll_l);
> +__extension__
> +extern unsigned long long int __REDIRECT_NTH (wcstoull_l,
> +					      (const wchar_t *__restrict __nptr,
> +					       wchar_t **__restrict __endptr,
> +					       int __base, locale_t __loc),
> +					      __isoc23_wcstoull_l);
> +#  else
> +extern long int __isoc23_wcstol_l (const wchar_t *__restrict __nptr,
> +				   wchar_t **__restrict __endptr, int __base,
> +				   locale_t __loc) __THROW;
> +extern unsigned long int __isoc23_wcstoul_l (const wchar_t *__restrict __nptr,
> +					     wchar_t **__restrict __endptr,
> +					     int __base, locale_t __loc)
> +     __THROW;
> +__extension__
> +extern long long int __isoc23_wcstoll_l (const wchar_t *__restrict __nptr,
> +					 wchar_t **__restrict __endptr,
> +					 int __base, locale_t __loc)
> +     __THROW;
> +__extension__
> +extern unsigned long long int __isoc23_wcstoull_l (const wchar_t *__restrict __nptr,
> +						   wchar_t **__restrict __endptr,
> +						   int __base, locale_t __loc)
> +     __THROW;
> +#   define wcstol_l __isoc23_wcstol_l
> +#   define wcstoul_l __isoc23_wcstoul_l
> +#   define wcstoll_l __isoc23_wcstoll_l
> +#   define wcstoull_l __isoc23_wcstoull_l
> +#  endif
> +# endif
> +
>   extern double wcstod_l (const wchar_t *__restrict __nptr,
>   			wchar_t **__restrict __endptr, locale_t __loc)
>        __THROW;
> diff --git a/wcsmbs/wcstol_l.c b/wcsmbs/wcstol_l.c
> index 2325808b23..2d6226184b 100644
> --- a/wcsmbs/wcstol_l.c
> +++ b/wcsmbs/wcstol_l.c
> @@ -16,6 +16,9 @@
>      License along with the GNU C Library; if not, see
>      <https://www.gnu.org/licenses/>.  */
>   
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>   #define __need_wchar_t
>   #include <stddef.h>
>   #include <locale.h>
> diff --git a/wcsmbs/wcstoll.c b/wcsmbs/wcstoll.c
> index 2a926c0fa7..c6ca59a2b3 100644
> --- a/wcsmbs/wcstoll.c
> +++ b/wcsmbs/wcstoll.c
> @@ -22,3 +22,4 @@
>   
>   weak_alias (wcstoll, wcstoq)
>   weak_alias (wcstoll, wcstoimax)
> +weak_alias (__isoc23_wcstoll, __isoc23_wcstoimax)
> diff --git a/wcsmbs/wcstoll_l.c b/wcsmbs/wcstoll_l.c
> index 67288a0b27..0742385038 100644
> --- a/wcsmbs/wcstoll_l.c
> +++ b/wcsmbs/wcstoll_l.c
> @@ -16,6 +16,9 @@
>      License along with the GNU C Library; if not, see
>      <https://www.gnu.org/licenses/>.  */
>   
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>   #define __need_wchar_t
>   #include <stddef.h>
>   #include <locale.h>
> diff --git a/wcsmbs/wcstoul_l.c b/wcsmbs/wcstoul_l.c
> index 3b342a6d7a..08996c067c 100644
> --- a/wcsmbs/wcstoul_l.c
> +++ b/wcsmbs/wcstoul_l.c
> @@ -16,6 +16,9 @@
>      License along with the GNU C Library; if not, see
>      <https://www.gnu.org/licenses/>.  */
>   
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>   #define __need_wchar_t
>   #include <stddef.h>
>   #include <locale.h>
> diff --git a/wcsmbs/wcstoull.c b/wcsmbs/wcstoull.c
> index b8aa018c47..e7561ed57b 100644
> --- a/wcsmbs/wcstoull.c
> +++ b/wcsmbs/wcstoull.c
> @@ -22,3 +22,4 @@
>   
>   weak_alias (wcstoull, wcstouq)
>   weak_alias (wcstoull, wcstoumax)
> +weak_alias (__isoc23_wcstoull, __isoc23_wcstoumax)
> diff --git a/wcsmbs/wcstoull_l.c b/wcsmbs/wcstoull_l.c
> index 84746b1d87..9204f3c0a2 100644
> --- a/wcsmbs/wcstoull_l.c
> +++ b/wcsmbs/wcstoull_l.c
> @@ -16,6 +16,9 @@
>      License along with the GNU C Library; if not, see
>      <https://www.gnu.org/licenses/>.  */
>   
> +#include <features.h>
> +#undef __GLIBC_USE_C2X_STRTOL
> +#define __GLIBC_USE_C2X_STRTOL 0
>   #define __need_wchar_t
>   #include <stddef.h>
>   #include <locale.h>
> 

-- 
<http://www.alejandro-colomar.es/>

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2022-12-15 12:25 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-15  1:37 Joseph Myers
2022-12-15 12:25 ` Alejandro Colomar [this message]
2022-12-15 19:09   ` Adhemerval Zanella Netto
2022-12-19 16:02 ` [v2] " Joseph Myers
2022-12-22  0:10   ` [v3] " Joseph Myers
2022-12-30 15:24     ` Ping " Joseph Myers
2023-01-16 13:52     ` Adhemerval Zanella Netto
2023-01-16 19:23       ` Joseph Myers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4001418e-e9cb-af7e-047c-3731dd20574c@gmail.com \
    --to=alx.manpages@gmail.com \
    --cc=joseph@codesourcery.com \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).