[v2,5/5] Post-cleanup 2: minimize _G_config.h.

Message ID b37ba234e94b8baa6975245ca326cf5c444188cf.1517872307.git.zackw@panix.com
State New
Headers show
Series
  • Don't install libio.h or _G_config.h.
Related show

Commit Message

Zack Weinberg Feb. 5, 2018, 11:35 p.m.
Nearly everything in _G_config.h is either junk or more appropriately
defined elsewhere:

 * _G_fpos_t, _G_fpos64_t, and _G_BUFSIZ are already completely unused.
 * All remaining uses of _G_va_list have been changed to __gnuc_va_list.
 * The definition of _G_HAVE_ST_BLKSIZE/_IO_HAVE_ST_BLKSIZE has
   been inlined into its sole use.
 * The complete definition of _G_iconv_t has been moved to libio.h and
   renamed _IO_iconv_t (all actual users used that name).
 * _G_IO_IO_FILE_VERSION is vestigial; some code cares whether
   _IO_stdin_used exists, but nothing looks at its value.  I've
   preserved the value as a hardwired constant in csu/init.c.
   This means csu/init.c no longer needs to include anything.
 * Many of the headers included by _G_config.h were already being
   included directly by either either libio.h or stdio.h; the
   remaining ones were moved to libio.h.
 * _G_HAVE_MREMAP is still relevant, because mremap genuinely is a
   Linux extension; it's not in POSIX and as far as I can tell it's
   not available on the Hurd either.  I also preserved _G_HAVE_MMAP,
   since it's conceivable someone would want to port glibc to a
   MMU-less, mmap-less environment in the future.  Both are now always
   defined to 1/0 as is the current convention, instead of the older
   1/undef convention.  These are the only symbols still defined in
   _G_config.h.
 * The actual inclusion of _G_config.h moves from libio.h to libioP.h,
   as this is where a potential override of _G_HAVE_MMAP happens.
 * The #ifdef logic in libioP.h controlling _IO_JUMPS_OFFSET has been
   simplified.

After this patch, the only surviving _G_ symbols are the struct tag
names _G_fpos_t and _G_fpos64_t, which are preserved for the sake of
C++ mangled names in applications, and _G_HAVE_MMAP and _G_HAVE_MREMAP,
which do not seem worth renaming.

Installed stripped libraries are unchanged by this patch.

	* bits/_G_config.h: Move back to sysdeps/generic/_G_config.h.
	Delete all contents except for definitions of _G_HAVE_MMAP and
	_G_HAVE_MREMAP.  Add commentary explaining those two symbols.
	* sysdeps/unix/sysv/linux/bits/_G_config.h: Move back to
	sysdeps/unix/sysv/linux/_G_config.h.  Make same content
	change as above.

	* libio/libio.h: Don't include bits/_G_config.h here.
	Include stddef.h with __need_wchar_t defined.  Include
	bits/types/__mbstate_t.h, bits/types/wint_t.h, and gconv.h.
	Define _IO_iconv_t here, directly.
	Don't define _IO_HAVE_ST_BLKSIZE.
	* libio/libioP.h: Include _G_config.h here.  Move include of
	shlib-compat.h up with rest of includes.  Simplify conditionals
	controlling definition of _IO_JUMPS_OFFSET.

	* csu/init.c: Remove always-true #if around entire file.
	Don't include stdio.h.  Set _IO_stdin_used to hardwired
	constant 0x20001, and update commentary.
	* include/stdio.h, sysdeps/ieee754/ldbl-opt/nldbl-compat.h:
	Replace all uses of _G_va_list with __gnuc_va_list.
	* libio/filedoalloc.c: Use #if defined _STATBUF_ST_BLKSIZE
	instead of #if _IO_HAVE_ST_BLKSIZE.
	* libio/fileops.c: Test _G_HAVE_MREMAP with #if, not #ifdef.
	* libio/iofdopen.c, libio/iofopen.c: Test _G_HAVE_MMAP with #if,
	not #ifdef.
---
 bits/_G_config.h                         | 54 -------------------------------
 csu/init.c                               | 13 +++-----
 include/stdio.h                          | 28 ++++++++--------
 libio/filedoalloc.c                      |  2 +-
 libio/fileops.c                          |  2 +-
 libio/iofdopen.c                         |  4 +--
 libio/iofopen.c                          |  2 +-
 libio/libio.h                            | 22 ++++++++++---
 libio/libioP.h                           | 20 ++++++------
 sysdeps/generic/_G_config.h              | 15 +++++++++
 sysdeps/ieee754/ldbl-opt/nldbl-compat.h  | 13 ++++----
 sysdeps/unix/sysv/linux/_G_config.h      | 15 +++++++++
 sysdeps/unix/sysv/linux/bits/_G_config.h | 55 --------------------------------
 13 files changed, 89 insertions(+), 156 deletions(-)
 delete mode 100644 bits/_G_config.h
 create mode 100644 sysdeps/generic/_G_config.h
 create mode 100644 sysdeps/unix/sysv/linux/_G_config.h
 delete mode 100644 sysdeps/unix/sysv/linux/bits/_G_config.h

-- 
2.15.1

Comments

Adhemerval Zanella Feb. 6, 2018, 7:06 p.m. | #1
On 05/02/2018 21:35, Zack Weinberg wrote:
> Nearly everything in _G_config.h is either junk or more appropriately

> defined elsewhere:

> 

>  * _G_fpos_t, _G_fpos64_t, and _G_BUFSIZ are already completely unused.

>  * All remaining uses of _G_va_list have been changed to __gnuc_va_list.

>  * The definition of _G_HAVE_ST_BLKSIZE/_IO_HAVE_ST_BLKSIZE has

>    been inlined into its sole use.

>  * The complete definition of _G_iconv_t has been moved to libio.h and

>    renamed _IO_iconv_t (all actual users used that name).

>  * _G_IO_IO_FILE_VERSION is vestigial; some code cares whether

>    _IO_stdin_used exists, but nothing looks at its value.  I've

>    preserved the value as a hardwired constant in csu/init.c.

>    This means csu/init.c no longer needs to include anything.

>  * Many of the headers included by _G_config.h were already being

>    included directly by either either libio.h or stdio.h; the

>    remaining ones were moved to libio.h.

>  * _G_HAVE_MREMAP is still relevant, because mremap genuinely is a

>    Linux extension; it's not in POSIX and as far as I can tell it's

>    not available on the Hurd either.  I also preserved _G_HAVE_MMAP,

>    since it's conceivable someone would want to port glibc to a

>    MMU-less, mmap-less environment in the future.  Both are now always

>    defined to 1/0 as is the current convention, instead of the older

>    1/undef convention.  These are the only symbols still defined in

>    _G_config.h.

>  * The actual inclusion of _G_config.h moves from libio.h to libioP.h,

>    as this is where a potential override of _G_HAVE_MMAP happens.

>  * The #ifdef logic in libioP.h controlling _IO_JUMPS_OFFSET has been

>    simplified.

> 

> After this patch, the only surviving _G_ symbols are the struct tag

> names _G_fpos_t and _G_fpos64_t, which are preserved for the sake of

> C++ mangled names in applications, and _G_HAVE_MMAP and _G_HAVE_MREMAP,

> which do not seem worth renaming.

> 

> Installed stripped libraries are unchanged by this patch.


LGTM in general with just _IO_HAVE_ST_BLKSIZE suggestion below.

> 

> 	* bits/_G_config.h: Move back to sysdeps/generic/_G_config.h.

> 	Delete all contents except for definitions of _G_HAVE_MMAP and

> 	_G_HAVE_MREMAP.  Add commentary explaining those two symbols.

> 	* sysdeps/unix/sysv/linux/bits/_G_config.h: Move back to

> 	sysdeps/unix/sysv/linux/_G_config.h.  Make same content

> 	change as above.

> 

> 	* libio/libio.h: Don't include bits/_G_config.h here.

> 	Include stddef.h with __need_wchar_t defined.  Include

> 	bits/types/__mbstate_t.h, bits/types/wint_t.h, and gconv.h.

> 	Define _IO_iconv_t here, directly.

> 	Don't define _IO_HAVE_ST_BLKSIZE.

> 	* libio/libioP.h: Include _G_config.h here.  Move include of

> 	shlib-compat.h up with rest of includes.  Simplify conditionals

> 	controlling definition of _IO_JUMPS_OFFSET.

> 

> 	* csu/init.c: Remove always-true #if around entire file.

> 	Don't include stdio.h.  Set _IO_stdin_used to hardwired

> 	constant 0x20001, and update commentary.

> 	* include/stdio.h, sysdeps/ieee754/ldbl-opt/nldbl-compat.h:

> 	Replace all uses of _G_va_list with __gnuc_va_list.

> 	* libio/filedoalloc.c: Use #if defined _STATBUF_ST_BLKSIZE

> 	instead of #if _IO_HAVE_ST_BLKSIZE.

> 	* libio/fileops.c: Test _G_HAVE_MREMAP with #if, not #ifdef.

> 	* libio/iofdopen.c, libio/iofopen.c: Test _G_HAVE_MMAP with #if,

> 	not #ifdef.

> ---

>  bits/_G_config.h                         | 54 -------------------------------

>  csu/init.c                               | 13 +++-----

>  include/stdio.h                          | 28 ++++++++--------

>  libio/filedoalloc.c                      |  2 +-

>  libio/fileops.c                          |  2 +-

>  libio/iofdopen.c                         |  4 +--

>  libio/iofopen.c                          |  2 +-

>  libio/libio.h                            | 22 ++++++++++---

>  libio/libioP.h                           | 20 ++++++------

>  sysdeps/generic/_G_config.h              | 15 +++++++++

>  sysdeps/ieee754/ldbl-opt/nldbl-compat.h  | 13 ++++----

>  sysdeps/unix/sysv/linux/_G_config.h      | 15 +++++++++

>  sysdeps/unix/sysv/linux/bits/_G_config.h | 55 --------------------------------

>  13 files changed, 89 insertions(+), 156 deletions(-)

>  delete mode 100644 bits/_G_config.h

>  create mode 100644 sysdeps/generic/_G_config.h

>  create mode 100644 sysdeps/unix/sysv/linux/_G_config.h

>  delete mode 100644 sysdeps/unix/sysv/linux/bits/_G_config.h

> 

> diff --git a/bits/_G_config.h b/bits/_G_config.h

> deleted file mode 100644

> index 8c81bc42787..00000000000

> --- a/bits/_G_config.h

> +++ /dev/null

> @@ -1,54 +0,0 @@

> -/* This file is needed by libio to define various configuration parameters.

> -   These are always the same in the GNU C library.  */

> -

> -#ifndef _BITS_G_CONFIG_H

> -#define _BITS_G_CONFIG_H 1

> -

> -/* Define types for libio in terms of the standard internal type names.  */

> -

> -#include <bits/types.h>

> -#define __need_size_t

> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T

> -# define __need_wchar_t

> -#endif

> -#define __need_NULL

> -#include <stddef.h>

> -

> -#include <bits/types/__mbstate_t.h>

> -#include <bits/types/__fpos_t.h>

> -#include <bits/types/__fpos64_t.h>

> -

> -#define _G_fpos_t __fpos_t

> -#define _G_fpos64_t __fpos64_t

> -

> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T

> -# include <bits/types/wint_t.h>

> -#endif

> -

> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T

> -# include <gconv.h>

> -typedef union

> -{

> -  struct __gconv_info __cd;

> -  struct

> -  {

> -    struct __gconv_info __cd;

> -    struct __gconv_step_data __data;

> -  } __combined;

> -} _G_iconv_t;

> -#endif

> -

> -

> -/* These library features are always available in the GNU C library.  */

> -#define _G_va_list __gnuc_va_list

> -

> -#define _G_HAVE_MMAP 1

> -

> -#define _G_IO_IO_FILE_VERSION 0x20001

> -

> -/* This is defined by <bits/stat.h> if `st_blksize' exists.  */

> -#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)

> -

> -#define _G_BUFSIZ 8192

> -

> -#endif	/* bits/_G_config.h */


Ok.

> diff --git a/csu/init.c b/csu/init.c

> index 178063b44bf..c2f978f3da5 100644

> --- a/csu/init.c

> +++ b/csu/init.c

> @@ -16,11 +16,8 @@

>     License along with the GNU C Library; if not, see

>     <http://www.gnu.org/licenses/>.  */

>  

> -#if defined __GNUC__ && __GNUC__ >= 2

> -

> -#include <stdio.h>

> -

> -/* This records which stdio is linked against in the application. */

> -const int _IO_stdin_used = _G_IO_IO_FILE_VERSION;

> -

> -#endif

> +/* Vestigial libio version number.  Some code in libio checks whether

> +   this symbol exists in the executable, but nothing looks at its

> +   value anymore; the value it was historically set to has been

> +   preserved out of an abundance of caution.  */

> +const int _IO_stdin_used = 0x20001;


Ok.

> diff --git a/include/stdio.h b/include/stdio.h

> index f12b281b4d6..94bc2fdc7ef 100644

> --- a/include/stdio.h

> +++ b/include/stdio.h

> @@ -15,44 +15,44 @@ extern int __snprintf (char *__restrict __s, size_t __maxlen,

>       __attribute__ ((__format__ (__printf__, 3, 4)));

>  libc_hidden_proto (__snprintf)

>  extern int __vsnprintf (char *__restrict __s, size_t __maxlen,

> -			const char *__restrict __format, _G_va_list __arg)

> +			const char *__restrict __format, __gnuc_va_list __arg)

>       __attribute__ ((__format__ (__printf__, 3, 0)));

>  extern int __vfscanf (FILE *__restrict __s,

>  		      const char *__restrict __format,

> -		      _G_va_list __arg)

> +		      __gnuc_va_list __arg)

>       __attribute__ ((__format__ (__scanf__, 2, 0)));

>  libc_hidden_proto (__vfscanf)

>  extern int __vscanf (const char *__restrict __format,

> -		     _G_va_list __arg)

> +		     __gnuc_va_list __arg)

>       __attribute__ ((__format__ (__scanf__, 1, 0)));

>  extern _IO_ssize_t __getline (char **__lineptr, size_t *__n,

>  			      FILE *__stream) attribute_hidden;

>  extern int __vsscanf (const char *__restrict __s,

>  		      const char *__restrict __format,

> -		      _G_va_list __arg)

> +		      __gnuc_va_list __arg)

>       __attribute__ ((__format__ (__scanf__, 2, 0)));

>  

>  extern int __sprintf_chk (char *, int, size_t, const char *, ...) __THROW;

>  extern int __snprintf_chk (char *, size_t, int, size_t, const char *, ...)

>       __THROW;

>  extern int __vsprintf_chk (char *, int, size_t, const char *,

> -			   _G_va_list) __THROW;

> +			   __gnuc_va_list) __THROW;

>  extern int __vsnprintf_chk (char *, size_t, int, size_t, const char *,

> -			    _G_va_list) __THROW;

> +			    __gnuc_va_list) __THROW;

>  extern int __printf_chk (int, const char *, ...);

>  extern int __fprintf_chk (FILE *, int, const char *, ...);

> -extern int __vprintf_chk (int, const char *, _G_va_list);

> -extern int __vfprintf_chk (FILE *, int, const char *, _G_va_list);

> +extern int __vprintf_chk (int, const char *, __gnuc_va_list);

> +extern int __vfprintf_chk (FILE *, int, const char *, __gnuc_va_list);

>  extern char *__fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp);

>  extern char *__fgets_chk (char *buf, size_t size, int n, FILE *fp);

>  extern int __asprintf_chk (char **, int, const char *, ...) __THROW;

> -extern int __vasprintf_chk (char **, int, const char *, _G_va_list) __THROW;

> +extern int __vasprintf_chk (char **, int, const char *, __gnuc_va_list) __THROW;

>  extern int __dprintf_chk (int, int, const char *, ...);

> -extern int __vdprintf_chk (int, int, const char *, _G_va_list);

> +extern int __vdprintf_chk (int, int, const char *, __gnuc_va_list);

>  extern int __obstack_printf_chk (struct obstack *, int, const char *, ...)

>       __THROW;

>  extern int __obstack_vprintf_chk (struct obstack *, int, const char *,

> -				  _G_va_list) __THROW;

> +				  __gnuc_va_list) __THROW;

>  

>  extern int __isoc99_fscanf (FILE *__restrict __stream,

>  			    const char *__restrict __format, ...) __wur;

> @@ -61,12 +61,12 @@ extern int __isoc99_sscanf (const char *__restrict __s,

>  			    const char *__restrict __format, ...) __THROW;

>  extern int __isoc99_vfscanf (FILE *__restrict __s,

>  			     const char *__restrict __format,

> -			     _G_va_list __arg) __wur;

> +			     __gnuc_va_list __arg) __wur;

>  extern int __isoc99_vscanf (const char *__restrict __format,

> -			    _G_va_list __arg) __wur;

> +			    __gnuc_va_list __arg) __wur;

>  extern int __isoc99_vsscanf (const char *__restrict __s,

>  			     const char *__restrict __format,

> -			     _G_va_list __arg) __THROW;

> +			     __gnuc_va_list __arg) __THROW;

>  libc_hidden_proto (__isoc99_vsscanf)

>  libc_hidden_proto (__isoc99_vfscanf)

>  


Ok.

> diff --git a/libio/filedoalloc.c b/libio/filedoalloc.c

> index 329843827f5..d6517e493b0 100644

> --- a/libio/filedoalloc.c

> +++ b/libio/filedoalloc.c

> @@ -93,7 +93,7 @@ _IO_file_doallocate (_IO_FILE *fp)

>  	      local_isatty (fp->_fileno))

>  	    fp->_flags |= _IO_LINE_BUF;

>  	}

> -#if _IO_HAVE_ST_BLKSIZE

> +#if defined _STATBUF_ST_BLKSIZE

>        if (st.st_blksize > 0 && st.st_blksize < _IO_BUFSIZ)

>  	size = st.st_blksize;

>  #endif


I think it is more logical to have _IO_HAVE_ST_BLKSIZE defined as 0 on generic
bits/stat.h and 1 for Linux bits/stat.h (which is also the way to we are aiming
to handle these kind of macros).

> diff --git a/libio/fileops.c b/libio/fileops.c

> index 6d5393cea3f..5fd8a9647f2 100644

> --- a/libio/fileops.c

> +++ b/libio/fileops.c

> @@ -582,7 +582,7 @@ mmap_remap_check (_IO_FILE *fp)

>  	{

>  	  /* The file added some pages.  We need to remap it.  */

>  	  void *p;

> -#ifdef _G_HAVE_MREMAP

> +#if _G_HAVE_MREMAP

>  	  p = __mremap (fp->_IO_buf_base, ROUNDED (fp->_IO_buf_end

>  						   - fp->_IO_buf_base),

>  			ROUNDED (st.st_size), MREMAP_MAYMOVE);


Ok.

> diff --git a/libio/iofdopen.c b/libio/iofdopen.c

> index 3546d52b4da..b6f1500dee4 100644

> --- a/libio/iofdopen.c

> +++ b/libio/iofdopen.c

> @@ -126,13 +126,13 @@ _IO_new_fdopen (int fd, const char *mode)

>    new_f->fp.file._lock = &new_f->lock;

>  #endif

>    _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd,

> -#ifdef _G_HAVE_MMAP

> +#if _G_HAVE_MMAP

>  	       (use_mmap && (read_write & _IO_NO_WRITES))

>  	       ? &_IO_wfile_jumps_maybe_mmap :

>  #endif

>  	       &_IO_wfile_jumps);

>    _IO_JUMPS (&new_f->fp) =

> -#ifdef _G_HAVE_MMAP

> +#if _G_HAVE_MMAP

>      (use_mmap && (read_write & _IO_NO_WRITES)) ? &_IO_file_jumps_maybe_mmap :

>  #endif

>        &_IO_file_jumps;


Ok.

> diff --git a/libio/iofopen.c b/libio/iofopen.c

> index d6f59497b42..2ea82e20917 100644

> --- a/libio/iofopen.c

> +++ b/libio/iofopen.c

> @@ -33,7 +33,7 @@

>  _IO_FILE *

>  __fopen_maybe_mmap (_IO_FILE *fp)

>  {

> -#ifdef _G_HAVE_MMAP

> +#if _G_HAVE_MMAP

>    if ((fp->_flags2 & _IO_FLAGS2_MMAP) && (fp->_flags & _IO_NO_WRITES))

>      {

>        /* Since this is read-only, we might be able to mmap the contents


Ok.

> diff --git a/libio/libio.h b/libio/libio.h

> index ff67e18c182..09531202472 100644

> --- a/libio/libio.h

> +++ b/libio/libio.h

> @@ -41,8 +41,24 @@

>  # error "Someone forgot to include stdio-lock.h"

>  #endif

>  

> -#include <bits/_G_config.h>

> -/* ALL of these should be defined in _G_config.h */

> +#define __need_wchar_t

> +#include <stddef.h>

> +

> +#include <bits/types/__mbstate_t.h>

> +#include <bits/types/wint_t.h>

> +#include <gconv.h>

> +

> +typedef union

> +{

> +  struct __gconv_info __cd;

> +  struct

> +  {

> +    struct __gconv_info __cd;

> +    struct __gconv_step_data __data;

> +  } __combined;

> +} _IO_iconv_t;

> +

> +/* Map the names used in libio to the names used in libc generally.  */

>  #define _IO_fpos_t __fpos_t

>  #define _IO_fpos64_t __fpos64_t

>  #define _IO_size_t size_t


Ok.

> @@ -51,8 +67,6 @@

>  #define _IO_off64_t __off64_t

>  #define _IO_pid_t __pid_t

>  #define _IO_uid_t __uid_t

> -#define _IO_iconv_t _G_iconv_t

> -#define _IO_HAVE_ST_BLKSIZE _G_HAVE_ST_BLKSIZE

>  #define _IO_BUFSIZ BUFSIZ

>  #define _IO_wint_t wint_t

>  #define _IO_va_list __gnuc_va_list


Ok.

> diff --git a/libio/libioP.h b/libio/libioP.h

> index 8edc207277e..58cc9de094b 100644

> --- a/libio/libioP.h

> +++ b/libio/libioP.h

> @@ -46,6 +46,12 @@

>  #include <libio/libio.h>

>  #include "iolibio.h"

>  

> +#include <shlib-compat.h>

> +

> +/* For historical reasons this is the name of the sysdeps header that

> +   adjusts the libio configuration.  */

> +#include <_G_config.h>

> +

>  #ifdef __cplusplus

>  extern "C" {

>  #endif

> @@ -75,16 +81,10 @@ extern "C" {

>   * object being acted on (i.e. the 'this' parameter).

>   */

>  

> -#include <shlib-compat.h>

> -#if !SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)

> -  /* Setting this macro disables the use of the _vtable_offset bias in

> -     _IO_JUMPS_FUNCS, below.  That is only needed if we want to

> -     support old binaries (see oldfileops.c).  */

> -# define _G_IO_NO_BACKWARD_COMPAT 1

> -#endif

> -

> -#if (!defined _IO_USE_OLD_IO_FILE \

> -     && (!defined _G_IO_NO_BACKWARD_COMPAT || _G_IO_NO_BACKWARD_COMPAT == 0))

> +/* Setting this macro to 1 enables the use of the _vtable_offset bias

> +   in _IO_JUMPS_FUNCS, below.  This is only needed for new-format

> +   _IO_FILE in libc that must support old binaries (see oldfileops.c).  */

> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) && !defined _IO_USE_OLD_IO_FILE

>  # define _IO_JUMPS_OFFSET 1

>  #else

>  # define _IO_JUMPS_OFFSET 0


Ok, this was indeed a convoluted check (I had to write it down to realize
_G_IO_NO_BACKWARD_COMPAT here is superflous).

> diff --git a/sysdeps/generic/_G_config.h b/sysdeps/generic/_G_config.h

> new file mode 100644

> index 00000000000..7c917bf64c4

> --- /dev/null

> +++ b/sysdeps/generic/_G_config.h

> @@ -0,0 +1,15 @@

> +/* Configuration parameters for stdio - generic version.  */

> +

> +#ifndef __G_CONFIG_H

> +#define __G_CONFIG_H 1

> +

> +/* Define to 1 if the operating system supports mmap, 0 otherwise.

> +   This function is required by POSIX but might still be unavailable,

> +   for instance when the hardware lacks support for virtual memory.  */

> +#define _G_HAVE_MMAP 1

> +

> +/* Define to 1 if the operating system supports mremap, 0 otherwise.

> +   This function is currently a Linux-specific extension.  */

> +#define _G_HAVE_MREMAP 0

> +

> +#endif	/* _G_config.h */


Ok.

> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h

> index 3b3ef731a6d..d61fbb2f649 100644

> --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h

> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h

> @@ -82,22 +82,23 @@ extern ssize_t __nldbl___vstrfmon (char *, size_t, const char *, va_list)

>  /* These don't use __typeof because they were not declared by the headers,

>     since we don't compile with _FORTIFY_SOURCE.  */

>  extern int __nldbl___vfprintf_chk (FILE *__restrict, int,

> -				   const char *__restrict, _G_va_list);

> +				   const char *__restrict, __gnuc_va_list);

>  extern int __nldbl___vfwprintf_chk (FILE *__restrict, int,

>  				    const wchar_t *__restrict, __gnuc_va_list);

>  extern int __nldbl___vsprintf_chk (char *__restrict, int, size_t,

> -				   const char *__restrict, _G_va_list) __THROW;

> +				   const char *__restrict, __gnuc_va_list)

> +  __THROW;

>  extern int __nldbl___vsnprintf_chk (char *__restrict, size_t, int, size_t,

> -				    const char *__restrict, _G_va_list)

> +				    const char *__restrict, __gnuc_va_list)

>    __THROW;

>  extern int __nldbl___vswprintf_chk (wchar_t *__restrict, size_t, int, size_t,

>  				    const wchar_t *__restrict, __gnuc_va_list)

>    __THROW;

> -extern int __nldbl___vasprintf_chk (char **, int, const char *, _G_va_list)

> +extern int __nldbl___vasprintf_chk (char **, int, const char *, __gnuc_va_list)

>    __THROW;

> -extern int __nldbl___vdprintf_chk (int, int, const char *, _G_va_list);

> +extern int __nldbl___vdprintf_chk (int, int, const char *, __gnuc_va_list);

>  extern int __nldbl___obstack_vprintf_chk (struct obstack *, int, const char *,

> -					  _G_va_list) __THROW;

> +					  __gnuc_va_list) __THROW;

>  extern void __nldbl___vsyslog_chk (int, int, const char *, va_list);

>  

>  


Ok.

> diff --git a/sysdeps/unix/sysv/linux/_G_config.h b/sysdeps/unix/sysv/linux/_G_config.h

> new file mode 100644

> index 00000000000..04137164816

> --- /dev/null

> +++ b/sysdeps/unix/sysv/linux/_G_config.h

> @@ -0,0 +1,15 @@

> +/* Configuration parameters for stdio - Linux version.  */

> +

> +#ifndef __G_CONFIG_H

> +#define __G_CONFIG_H 1

> +

> +/* Define to 1 if the operating system supports mmap, 0 otherwise.

> +   This function is required by POSIX but might still be unavailable,

> +   for instance when the hardware lacks support for virtual memory.  */

> +#define _G_HAVE_MMAP 1

> +

> +/* Define to 1 if the operating system supports mremap, 0 otherwise.

> +   This function is currently a Linux-specific extension.  */

> +#define _G_HAVE_MREMAP 1

> +

> +#endif	/* bits/_G_config.h */


Ok.

> diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h

> deleted file mode 100644

> index 05a64acb2cf..00000000000

> --- a/sysdeps/unix/sysv/linux/bits/_G_config.h

> +++ /dev/null

> @@ -1,55 +0,0 @@

> -/* This file is needed by libio to define various configuration parameters.

> -   These are always the same in the GNU C library.  */

> -

> -#ifndef _BITS_G_CONFIG_H

> -#define _BITS_G_CONFIG_H 1

> -

> -/* Define types for libio in terms of the standard internal type names.  */

> -

> -#include <bits/types.h>

> -#define __need_size_t

> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T

> -# define __need_wchar_t

> -#endif

> -#define __need_NULL

> -#include <stddef.h>

> -

> -#include <bits/types/__mbstate_t.h>

> -#include <bits/types/__fpos_t.h>

> -#include <bits/types/__fpos64_t.h>

> -

> -#define _G_fpos_t __fpos_t

> -#define _G_fpos64_t __fpos64_t

> -

> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T

> -# include <bits/types/wint_t.h>

> -#endif

> -

> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T

> -# include <gconv.h>

> -typedef union

> -{

> -  struct __gconv_info __cd;

> -  struct

> -  {

> -    struct __gconv_info __cd;

> -    struct __gconv_step_data __data;

> -  } __combined;

> -} _G_iconv_t;

> -#endif

> -

> -

> -/* These library features are always available in the GNU C library.  */

> -#define _G_va_list __gnuc_va_list

> -

> -#define _G_HAVE_MMAP 1

> -#define _G_HAVE_MREMAP 1

> -

> -#define _G_IO_IO_FILE_VERSION 0x20001

> -

> -/* This is defined by <bits/stat.h> if `st_blksize' exists.  */

> -#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)

> -

> -#define _G_BUFSIZ 8192

> -

> -#endif	/* bits/_G_config.h */


Ok.
Zack Weinberg Feb. 6, 2018, 8:17 p.m. | #2
On Tue, Feb 6, 2018 at 2:06 PM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 05/02/2018 21:35, Zack Weinberg wrote:

>> Nearly everything in _G_config.h is either junk or more appropriately

>> defined elsewhere:

...
>

> LGTM in general with just _IO_HAVE_ST_BLKSIZE suggestion below.

...
>> -#if _IO_HAVE_ST_BLKSIZE

>> +#if defined _STATBUF_ST_BLKSIZE

>>        if (st.st_blksize > 0 && st.st_blksize < _IO_BUFSIZ)

>>       size = st.st_blksize;

>>  #endif

>

> I think it is more logical to have _IO_HAVE_ST_BLKSIZE defined as 0

> on generic bits/stat.h and 1 for Linux bits/stat.h (which is also

> the way to we are aiming to handle these kind of macros).


_STATBUF_ST_BLKSIZE, with #undef/1 semantics, has been part of our
sys/stat.h for a long time; it doesn't have a _lot_ of external users,
but it has a few (see
https://codesearch.debian.net/search?q=_STATBUF_ST_BLKSIZE). I am
reluctant to complicate this patchset by messing with it.  Is this a
hard objection?

>> +/* Setting this macro to 1 enables the use of the _vtable_offset bias

>> +   in _IO_JUMPS_FUNCS, below.  This is only needed for new-format

>> +   _IO_FILE in libc that must support old binaries (see oldfileops.c).  */

>

> Ok, this was indeed a convoluted check (I had to write it down to realize

> _G_IO_NO_BACKWARD_COMPAT here is superflous).


I want to thank Joseph for insisting on the "no changes to installed
stripped libraries" standard for this patchset; I got this change
wrong initially and I'm not sure I would have noticed that it was
wrong if I wasn't being suspicious of any change to the generated code.

zw
Adhemerval Zanella Feb. 7, 2018, 12:14 p.m. | #3
On 06/02/2018 18:17, Zack Weinberg wrote:
> On Tue, Feb 6, 2018 at 2:06 PM, Adhemerval Zanella

> <adhemerval.zanella@linaro.org> wrote:

>> On 05/02/2018 21:35, Zack Weinberg wrote:

>>> Nearly everything in _G_config.h is either junk or more appropriately

>>> defined elsewhere:

> ...

>>

>> LGTM in general with just _IO_HAVE_ST_BLKSIZE suggestion below.

> ...

>>> -#if _IO_HAVE_ST_BLKSIZE

>>> +#if defined _STATBUF_ST_BLKSIZE

>>>        if (st.st_blksize > 0 && st.st_blksize < _IO_BUFSIZ)

>>>       size = st.st_blksize;

>>>  #endif

>>

>> I think it is more logical to have _IO_HAVE_ST_BLKSIZE defined as 0

>> on generic bits/stat.h and 1 for Linux bits/stat.h (which is also

>> the way to we are aiming to handle these kind of macros).

> 

> _STATBUF_ST_BLKSIZE, with #undef/1 semantics, has been part of our

> sys/stat.h for a long time; it doesn't have a _lot_ of external users,

> but it has a few (see

> https://codesearch.debian.net/search?q=_STATBUF_ST_BLKSIZE). I am

> reluctant to complicate this patchset by messing with it.  Is this a

> hard objection?


I do not think this is a patch blocker.

> 

>>> +/* Setting this macro to 1 enables the use of the _vtable_offset bias

>>> +   in _IO_JUMPS_FUNCS, below.  This is only needed for new-format

>>> +   _IO_FILE in libc that must support old binaries (see oldfileops.c).  */

>>

>> Ok, this was indeed a convoluted check (I had to write it down to realize

>> _G_IO_NO_BACKWARD_COMPAT here is superflous).

> 

> I want to thank Joseph for insisting on the "no changes to installed

> stripped libraries" standard for this patchset; I got this change

> wrong initially and I'm not sure I would have noticed that it was

> wrong if I wasn't being suspicious of any change to the generated code.

> 

> zw

>

Patch

diff --git a/bits/_G_config.h b/bits/_G_config.h
deleted file mode 100644
index 8c81bc42787..00000000000
--- a/bits/_G_config.h
+++ /dev/null
@@ -1,54 +0,0 @@ 
-/* This file is needed by libio to define various configuration parameters.
-   These are always the same in the GNU C library.  */
-
-#ifndef _BITS_G_CONFIG_H
-#define _BITS_G_CONFIG_H 1
-
-/* Define types for libio in terms of the standard internal type names.  */
-
-#include <bits/types.h>
-#define __need_size_t
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# define __need_wchar_t
-#endif
-#define __need_NULL
-#include <stddef.h>
-
-#include <bits/types/__mbstate_t.h>
-#include <bits/types/__fpos_t.h>
-#include <bits/types/__fpos64_t.h>
-
-#define _G_fpos_t __fpos_t
-#define _G_fpos64_t __fpos64_t
-
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# include <bits/types/wint_t.h>
-#endif
-
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# include <gconv.h>
-typedef union
-{
-  struct __gconv_info __cd;
-  struct
-  {
-    struct __gconv_info __cd;
-    struct __gconv_step_data __data;
-  } __combined;
-} _G_iconv_t;
-#endif
-
-
-/* These library features are always available in the GNU C library.  */
-#define _G_va_list __gnuc_va_list
-
-#define _G_HAVE_MMAP 1
-
-#define _G_IO_IO_FILE_VERSION 0x20001
-
-/* This is defined by <bits/stat.h> if `st_blksize' exists.  */
-#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)
-
-#define _G_BUFSIZ 8192
-
-#endif	/* bits/_G_config.h */
diff --git a/csu/init.c b/csu/init.c
index 178063b44bf..c2f978f3da5 100644
--- a/csu/init.c
+++ b/csu/init.c
@@ -16,11 +16,8 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#if defined __GNUC__ && __GNUC__ >= 2
-
-#include <stdio.h>
-
-/* This records which stdio is linked against in the application. */
-const int _IO_stdin_used = _G_IO_IO_FILE_VERSION;
-
-#endif
+/* Vestigial libio version number.  Some code in libio checks whether
+   this symbol exists in the executable, but nothing looks at its
+   value anymore; the value it was historically set to has been
+   preserved out of an abundance of caution.  */
+const int _IO_stdin_used = 0x20001;
diff --git a/include/stdio.h b/include/stdio.h
index f12b281b4d6..94bc2fdc7ef 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -15,44 +15,44 @@  extern int __snprintf (char *__restrict __s, size_t __maxlen,
      __attribute__ ((__format__ (__printf__, 3, 4)));
 libc_hidden_proto (__snprintf)
 extern int __vsnprintf (char *__restrict __s, size_t __maxlen,
-			const char *__restrict __format, _G_va_list __arg)
+			const char *__restrict __format, __gnuc_va_list __arg)
      __attribute__ ((__format__ (__printf__, 3, 0)));
 extern int __vfscanf (FILE *__restrict __s,
 		      const char *__restrict __format,
-		      _G_va_list __arg)
+		      __gnuc_va_list __arg)
      __attribute__ ((__format__ (__scanf__, 2, 0)));
 libc_hidden_proto (__vfscanf)
 extern int __vscanf (const char *__restrict __format,
-		     _G_va_list __arg)
+		     __gnuc_va_list __arg)
      __attribute__ ((__format__ (__scanf__, 1, 0)));
 extern _IO_ssize_t __getline (char **__lineptr, size_t *__n,
 			      FILE *__stream) attribute_hidden;
 extern int __vsscanf (const char *__restrict __s,
 		      const char *__restrict __format,
-		      _G_va_list __arg)
+		      __gnuc_va_list __arg)
      __attribute__ ((__format__ (__scanf__, 2, 0)));
 
 extern int __sprintf_chk (char *, int, size_t, const char *, ...) __THROW;
 extern int __snprintf_chk (char *, size_t, int, size_t, const char *, ...)
      __THROW;
 extern int __vsprintf_chk (char *, int, size_t, const char *,
-			   _G_va_list) __THROW;
+			   __gnuc_va_list) __THROW;
 extern int __vsnprintf_chk (char *, size_t, int, size_t, const char *,
-			    _G_va_list) __THROW;
+			    __gnuc_va_list) __THROW;
 extern int __printf_chk (int, const char *, ...);
 extern int __fprintf_chk (FILE *, int, const char *, ...);
-extern int __vprintf_chk (int, const char *, _G_va_list);
-extern int __vfprintf_chk (FILE *, int, const char *, _G_va_list);
+extern int __vprintf_chk (int, const char *, __gnuc_va_list);
+extern int __vfprintf_chk (FILE *, int, const char *, __gnuc_va_list);
 extern char *__fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp);
 extern char *__fgets_chk (char *buf, size_t size, int n, FILE *fp);
 extern int __asprintf_chk (char **, int, const char *, ...) __THROW;
-extern int __vasprintf_chk (char **, int, const char *, _G_va_list) __THROW;
+extern int __vasprintf_chk (char **, int, const char *, __gnuc_va_list) __THROW;
 extern int __dprintf_chk (int, int, const char *, ...);
-extern int __vdprintf_chk (int, int, const char *, _G_va_list);
+extern int __vdprintf_chk (int, int, const char *, __gnuc_va_list);
 extern int __obstack_printf_chk (struct obstack *, int, const char *, ...)
      __THROW;
 extern int __obstack_vprintf_chk (struct obstack *, int, const char *,
-				  _G_va_list) __THROW;
+				  __gnuc_va_list) __THROW;
 
 extern int __isoc99_fscanf (FILE *__restrict __stream,
 			    const char *__restrict __format, ...) __wur;
@@ -61,12 +61,12 @@  extern int __isoc99_sscanf (const char *__restrict __s,
 			    const char *__restrict __format, ...) __THROW;
 extern int __isoc99_vfscanf (FILE *__restrict __s,
 			     const char *__restrict __format,
-			     _G_va_list __arg) __wur;
+			     __gnuc_va_list __arg) __wur;
 extern int __isoc99_vscanf (const char *__restrict __format,
-			    _G_va_list __arg) __wur;
+			    __gnuc_va_list __arg) __wur;
 extern int __isoc99_vsscanf (const char *__restrict __s,
 			     const char *__restrict __format,
-			     _G_va_list __arg) __THROW;
+			     __gnuc_va_list __arg) __THROW;
 libc_hidden_proto (__isoc99_vsscanf)
 libc_hidden_proto (__isoc99_vfscanf)
 
diff --git a/libio/filedoalloc.c b/libio/filedoalloc.c
index 329843827f5..d6517e493b0 100644
--- a/libio/filedoalloc.c
+++ b/libio/filedoalloc.c
@@ -93,7 +93,7 @@  _IO_file_doallocate (_IO_FILE *fp)
 	      local_isatty (fp->_fileno))
 	    fp->_flags |= _IO_LINE_BUF;
 	}
-#if _IO_HAVE_ST_BLKSIZE
+#if defined _STATBUF_ST_BLKSIZE
       if (st.st_blksize > 0 && st.st_blksize < _IO_BUFSIZ)
 	size = st.st_blksize;
 #endif
diff --git a/libio/fileops.c b/libio/fileops.c
index 6d5393cea3f..5fd8a9647f2 100644
--- a/libio/fileops.c
+++ b/libio/fileops.c
@@ -582,7 +582,7 @@  mmap_remap_check (_IO_FILE *fp)
 	{
 	  /* The file added some pages.  We need to remap it.  */
 	  void *p;
-#ifdef _G_HAVE_MREMAP
+#if _G_HAVE_MREMAP
 	  p = __mremap (fp->_IO_buf_base, ROUNDED (fp->_IO_buf_end
 						   - fp->_IO_buf_base),
 			ROUNDED (st.st_size), MREMAP_MAYMOVE);
diff --git a/libio/iofdopen.c b/libio/iofdopen.c
index 3546d52b4da..b6f1500dee4 100644
--- a/libio/iofdopen.c
+++ b/libio/iofdopen.c
@@ -126,13 +126,13 @@  _IO_new_fdopen (int fd, const char *mode)
   new_f->fp.file._lock = &new_f->lock;
 #endif
   _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd,
-#ifdef _G_HAVE_MMAP
+#if _G_HAVE_MMAP
 	       (use_mmap && (read_write & _IO_NO_WRITES))
 	       ? &_IO_wfile_jumps_maybe_mmap :
 #endif
 	       &_IO_wfile_jumps);
   _IO_JUMPS (&new_f->fp) =
-#ifdef _G_HAVE_MMAP
+#if _G_HAVE_MMAP
     (use_mmap && (read_write & _IO_NO_WRITES)) ? &_IO_file_jumps_maybe_mmap :
 #endif
       &_IO_file_jumps;
diff --git a/libio/iofopen.c b/libio/iofopen.c
index d6f59497b42..2ea82e20917 100644
--- a/libio/iofopen.c
+++ b/libio/iofopen.c
@@ -33,7 +33,7 @@ 
 _IO_FILE *
 __fopen_maybe_mmap (_IO_FILE *fp)
 {
-#ifdef _G_HAVE_MMAP
+#if _G_HAVE_MMAP
   if ((fp->_flags2 & _IO_FLAGS2_MMAP) && (fp->_flags & _IO_NO_WRITES))
     {
       /* Since this is read-only, we might be able to mmap the contents
diff --git a/libio/libio.h b/libio/libio.h
index ff67e18c182..09531202472 100644
--- a/libio/libio.h
+++ b/libio/libio.h
@@ -41,8 +41,24 @@ 
 # error "Someone forgot to include stdio-lock.h"
 #endif
 
-#include <bits/_G_config.h>
-/* ALL of these should be defined in _G_config.h */
+#define __need_wchar_t
+#include <stddef.h>
+
+#include <bits/types/__mbstate_t.h>
+#include <bits/types/wint_t.h>
+#include <gconv.h>
+
+typedef union
+{
+  struct __gconv_info __cd;
+  struct
+  {
+    struct __gconv_info __cd;
+    struct __gconv_step_data __data;
+  } __combined;
+} _IO_iconv_t;
+
+/* Map the names used in libio to the names used in libc generally.  */
 #define _IO_fpos_t __fpos_t
 #define _IO_fpos64_t __fpos64_t
 #define _IO_size_t size_t
@@ -51,8 +67,6 @@ 
 #define _IO_off64_t __off64_t
 #define _IO_pid_t __pid_t
 #define _IO_uid_t __uid_t
-#define _IO_iconv_t _G_iconv_t
-#define _IO_HAVE_ST_BLKSIZE _G_HAVE_ST_BLKSIZE
 #define _IO_BUFSIZ BUFSIZ
 #define _IO_wint_t wint_t
 #define _IO_va_list __gnuc_va_list
diff --git a/libio/libioP.h b/libio/libioP.h
index 8edc207277e..58cc9de094b 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -46,6 +46,12 @@ 
 #include <libio/libio.h>
 #include "iolibio.h"
 
+#include <shlib-compat.h>
+
+/* For historical reasons this is the name of the sysdeps header that
+   adjusts the libio configuration.  */
+#include <_G_config.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -75,16 +81,10 @@  extern "C" {
  * object being acted on (i.e. the 'this' parameter).
  */
 
-#include <shlib-compat.h>
-#if !SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
-  /* Setting this macro disables the use of the _vtable_offset bias in
-     _IO_JUMPS_FUNCS, below.  That is only needed if we want to
-     support old binaries (see oldfileops.c).  */
-# define _G_IO_NO_BACKWARD_COMPAT 1
-#endif
-
-#if (!defined _IO_USE_OLD_IO_FILE \
-     && (!defined _G_IO_NO_BACKWARD_COMPAT || _G_IO_NO_BACKWARD_COMPAT == 0))
+/* Setting this macro to 1 enables the use of the _vtable_offset bias
+   in _IO_JUMPS_FUNCS, below.  This is only needed for new-format
+   _IO_FILE in libc that must support old binaries (see oldfileops.c).  */
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) && !defined _IO_USE_OLD_IO_FILE
 # define _IO_JUMPS_OFFSET 1
 #else
 # define _IO_JUMPS_OFFSET 0
diff --git a/sysdeps/generic/_G_config.h b/sysdeps/generic/_G_config.h
new file mode 100644
index 00000000000..7c917bf64c4
--- /dev/null
+++ b/sysdeps/generic/_G_config.h
@@ -0,0 +1,15 @@ 
+/* Configuration parameters for stdio - generic version.  */
+
+#ifndef __G_CONFIG_H
+#define __G_CONFIG_H 1
+
+/* Define to 1 if the operating system supports mmap, 0 otherwise.
+   This function is required by POSIX but might still be unavailable,
+   for instance when the hardware lacks support for virtual memory.  */
+#define _G_HAVE_MMAP 1
+
+/* Define to 1 if the operating system supports mremap, 0 otherwise.
+   This function is currently a Linux-specific extension.  */
+#define _G_HAVE_MREMAP 0
+
+#endif	/* _G_config.h */
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
index 3b3ef731a6d..d61fbb2f649 100644
--- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
@@ -82,22 +82,23 @@  extern ssize_t __nldbl___vstrfmon (char *, size_t, const char *, va_list)
 /* These don't use __typeof because they were not declared by the headers,
    since we don't compile with _FORTIFY_SOURCE.  */
 extern int __nldbl___vfprintf_chk (FILE *__restrict, int,
-				   const char *__restrict, _G_va_list);
+				   const char *__restrict, __gnuc_va_list);
 extern int __nldbl___vfwprintf_chk (FILE *__restrict, int,
 				    const wchar_t *__restrict, __gnuc_va_list);
 extern int __nldbl___vsprintf_chk (char *__restrict, int, size_t,
-				   const char *__restrict, _G_va_list) __THROW;
+				   const char *__restrict, __gnuc_va_list)
+  __THROW;
 extern int __nldbl___vsnprintf_chk (char *__restrict, size_t, int, size_t,
-				    const char *__restrict, _G_va_list)
+				    const char *__restrict, __gnuc_va_list)
   __THROW;
 extern int __nldbl___vswprintf_chk (wchar_t *__restrict, size_t, int, size_t,
 				    const wchar_t *__restrict, __gnuc_va_list)
   __THROW;
-extern int __nldbl___vasprintf_chk (char **, int, const char *, _G_va_list)
+extern int __nldbl___vasprintf_chk (char **, int, const char *, __gnuc_va_list)
   __THROW;
-extern int __nldbl___vdprintf_chk (int, int, const char *, _G_va_list);
+extern int __nldbl___vdprintf_chk (int, int, const char *, __gnuc_va_list);
 extern int __nldbl___obstack_vprintf_chk (struct obstack *, int, const char *,
-					  _G_va_list) __THROW;
+					  __gnuc_va_list) __THROW;
 extern void __nldbl___vsyslog_chk (int, int, const char *, va_list);
 
 
diff --git a/sysdeps/unix/sysv/linux/_G_config.h b/sysdeps/unix/sysv/linux/_G_config.h
new file mode 100644
index 00000000000..04137164816
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/_G_config.h
@@ -0,0 +1,15 @@ 
+/* Configuration parameters for stdio - Linux version.  */
+
+#ifndef __G_CONFIG_H
+#define __G_CONFIG_H 1
+
+/* Define to 1 if the operating system supports mmap, 0 otherwise.
+   This function is required by POSIX but might still be unavailable,
+   for instance when the hardware lacks support for virtual memory.  */
+#define _G_HAVE_MMAP 1
+
+/* Define to 1 if the operating system supports mremap, 0 otherwise.
+   This function is currently a Linux-specific extension.  */
+#define _G_HAVE_MREMAP 1
+
+#endif	/* bits/_G_config.h */
diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h
deleted file mode 100644
index 05a64acb2cf..00000000000
--- a/sysdeps/unix/sysv/linux/bits/_G_config.h
+++ /dev/null
@@ -1,55 +0,0 @@ 
-/* This file is needed by libio to define various configuration parameters.
-   These are always the same in the GNU C library.  */
-
-#ifndef _BITS_G_CONFIG_H
-#define _BITS_G_CONFIG_H 1
-
-/* Define types for libio in terms of the standard internal type names.  */
-
-#include <bits/types.h>
-#define __need_size_t
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# define __need_wchar_t
-#endif
-#define __need_NULL
-#include <stddef.h>
-
-#include <bits/types/__mbstate_t.h>
-#include <bits/types/__fpos_t.h>
-#include <bits/types/__fpos64_t.h>
-
-#define _G_fpos_t __fpos_t
-#define _G_fpos64_t __fpos64_t
-
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# include <bits/types/wint_t.h>
-#endif
-
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# include <gconv.h>
-typedef union
-{
-  struct __gconv_info __cd;
-  struct
-  {
-    struct __gconv_info __cd;
-    struct __gconv_step_data __data;
-  } __combined;
-} _G_iconv_t;
-#endif
-
-
-/* These library features are always available in the GNU C library.  */
-#define _G_va_list __gnuc_va_list
-
-#define _G_HAVE_MMAP 1
-#define _G_HAVE_MREMAP 1
-
-#define _G_IO_IO_FILE_VERSION 0x20001
-
-/* This is defined by <bits/stat.h> if `st_blksize' exists.  */
-#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)
-
-#define _G_BUFSIZ 8192
-
-#endif	/* bits/_G_config.h */