public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE
@ 2023-06-20 18:18 Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 01/21] Add --enable-fortify-source option Frédéric Bérat
                   ` (20 more replies)
  0 siblings, 21 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

Hello,

This patch series introduces a new "--enable-fortify-source" option to glibc
build. This option may either be set to a value between 1 and 3, or left empty
to let configure select the highest value available for the build system.

The first patch adds the new configure option, the second excludes the routines
that can't be built with the option enabled.

The next patches are fixing test and compilation errors that arose with
fortification enabled.

I couldn't test the patch series in all configuration possible on all arches
possible but I ran the following:

 - build-many-glibcs was executed on x86_64, for all arches/variants. This was
   mainly done to ensure that installed headers were not broken (as some
   patches are modifying system headers)
 - The new "enable-fortify-source" variant for BMG got executed on x86_64
 - make check and benchtests were executed on x86_64, i686, ppc64le, aarch64,
   s390x, with and without fortification enabled.

Fred.

---
Frédéric Bérat (21):
  Add --enable-fortify-source option
  Configure: regenerate for autoconf 2.71
  Exclude routines from fortification
  sysdeps/{i386,x86_64}/mempcpy_chk.S: fix linknamespace for
    __mempcpy_chk
  stdio-common: tests: Incorrect maxlen parameter for swprintf
  sysdeps: Ensure ieee128*_chk routines to be properly named
  string: Ensure *_chk routines have their hidden builtin definition
    available
  stdio: Ensure *_chk routines have their hidden builtin definition
    available
  asprintf_chk: Ensure compatibility for both s390x and ppc64le
  misc/sys/cdefs.h: Create FORTIFY redirects for internal calls
  wcsmbs/bits/wchar2{,-decl}.h: Clearly separate declaration from
    definitions
  wcsmbs/bits/wchar2{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE
  posix/bits/unistd.h: Clearly separate declaration from definitions
  posix/bits/unistd{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE
  debug/readlink{,at}_chk.c: Harmonize declaration and definition
  misc/bits/select2.h: Clearly separate declaration from definitions
  misc/bits/syslog.h: Clearly separate declaration from definition
  rt/tst-mqueue4.c: Fix wrong number of argument for mq_open
  sysdeps/ieee754/ldbl-128ibm-compat: Fix warn unused result
  sysdeps/powerpc/fpu/tst-setcontext-fpscr.c: Fix warn unused result
  benchtests: fix warn unused result

 Makeconfig                                    |   33 +-
 aclocal.m4                                    |    2 +-
 benchtests/bench-strcoll.c                    |    6 +-
 config.make.in                                |    3 +-
 configure                                     | 4208 +++++++++++------
 configure.ac                                  |   70 +-
 debug/Makefile                                |   12 +-
 debug/asprintf_chk.c                          |   16 +-
 debug/fdelt_chk.c                             |    2 +
 debug/fgets_u_chk.c                           |    1 +
 debug/fprintf_chk.c                           |    1 +
 debug/getdomainname_chk.c                     |    1 +
 debug/memcpy_chk.c                            |    1 +
 debug/memmove_chk.c                           |    1 +
 debug/mempcpy_chk.c                           |    1 +
 debug/memset_chk.c                            |    1 +
 debug/read_chk.c                              |    1 +
 debug/readlink_chk.c                          |    3 +-
 debug/readlinkat_chk.c                        |    3 +-
 debug/sprintf_chk.c                           |    1 +
 debug/stpcpy_chk.c                            |    1 +
 debug/wcrtomb_chk.c                           |    1 +
 debug/wmemset_chk.c                           |    1 +
 elf/rtld-Rules                                |    2 +-
 include/bits/select-decl.h                    |    1 +
 include/bits/syslog-decl.h                    |    1 +
 include/bits/unistd-decl.h                    |    1 +
 include/stdio.h                               |   13 +-
 include/string.h                              |    7 +
 include/sys/cdefs.h                           |   14 +
 include/sys/select.h                          |    4 +
 include/sys/syslog.h                          |    4 +
 include/unistd.h                              |    5 +
 include/wchar.h                               |   16 +
 io/Makefile                                   |   16 +
 libio/Makefile                                |   21 +-
 login/Makefile                                |    6 +
 login/getlogin_r_chk.c                        |    1 +
 misc/Makefile                                 |    9 +
 misc/bits/select-decl.h                       |   31 +
 misc/bits/select2.h                           |    6 +-
 misc/bits/syslog-decl.h                       |   35 +
 misc/bits/syslog.h                            |   10 +-
 misc/sys/cdefs.h                              |    8 +
 misc/syslog.c                                 |    4 +-
 posix/Makefile                                |   12 +
 posix/bits/unistd-decl.h                      |  198 +
 posix/bits/unistd.h                           |  154 +-
 rt/Makefile                                   |    5 +
 rt/tst-mqueue4.c                              |    4 +-
 setjmp/Makefile                               |    5 +
 socket/Makefile                               |    6 +
 stdio-common/Makefile                         |   15 +-
 stdio-common/tst-printf-bz25691.c             |    8 +-
 stdio-common/tst-vfprintf-mbs-prec.c          |   15 +-
 stdlib/Makefile                               |    7 +
 string/Makefile                               |   17 +
 sysdeps/generic/libc-symver.h                 |    2 +-
 sysdeps/i386/i586/memcpy.S                    |    1 +
 sysdeps/i386/i586/memset.S                    |    1 +
 sysdeps/i386/i686/memcpy.S                    |    1 +
 sysdeps/i386/i686/memmove.S                   |    1 +
 sysdeps/i386/i686/mempcpy.S                   |    1 +
 sysdeps/i386/i686/memset.S                    |    1 +
 sysdeps/i386/i686/multiarch/memcpy_chk.c      |    4 +
 sysdeps/i386/i686/multiarch/memmove_chk.c     |    4 +
 sysdeps/i386/i686/multiarch/mempcpy_chk.c     |    4 +
 sysdeps/i386/i686/multiarch/memset_chk.c      |    5 +-
 sysdeps/i386/memcpy_chk.S                     |    1 +
 sysdeps/i386/memmove_chk.S                    |    1 +
 sysdeps/i386/mempcpy_chk.S                    |    3 +-
 sysdeps/i386/memset_chk.S                     |    1 +
 sysdeps/ieee754/ldbl-128ibm-compat/Makefile   |   81 +-
 .../ldbl-128ibm-compat/ieee128-asprintf_chk.c |    5 +-
 .../ldbl-128ibm-compat/ieee128-dprintf_chk.c  |    4 +-
 .../ldbl-128ibm-compat/ieee128-fprintf_chk.c  |    5 +-
 .../ldbl-128ibm-compat/ieee128-fwprintf_chk.c |    5 +-
 .../ldbl-128ibm-compat/ieee128-printf_chk.c   |    4 +-
 .../ldbl-128ibm-compat/ieee128-snprintf_chk.c |    4 +-
 .../ldbl-128ibm-compat/ieee128-sprintf_chk.c  |    5 +-
 .../ldbl-128ibm-compat/ieee128-swprintf_chk.c |    4 +-
 .../ldbl-128ibm-compat/ieee128-syslog.c       |    9 +-
 .../ieee128-vasprintf_chk.c                   |    4 +-
 .../ldbl-128ibm-compat/ieee128-vdprintf_chk.c |    4 +-
 .../ldbl-128ibm-compat/ieee128-vfprintf_chk.c |    4 +-
 .../ieee128-vfwprintf_chk.c                   |    4 +-
 .../ldbl-128ibm-compat/ieee128-vprintf_chk.c  |    4 +-
 .../ieee128-vsnprintf_chk.c                   |    4 +-
 .../ldbl-128ibm-compat/ieee128-vsprintf_chk.c |    5 +-
 .../ieee128-vswprintf_chk.c                   |    4 +-
 .../ldbl-128ibm-compat/ieee128-vwprintf_chk.c |    4 +-
 .../ldbl-128ibm-compat/ieee128-wprintf_chk.c  |    4 +-
 .../test-printf-ldbl-compat.c                 |   10 +-
 .../test-scanf-ldbl-compat-template.c         |   21 +-
 sysdeps/ieee754/ldbl-opt/Makefile             |   29 +
 sysdeps/powerpc/fpu/tst-setcontext-fpscr.c    |    4 +-
 sysdeps/pthread/Makefile                      |    4 +
 sysdeps/unix/sysv/linux/Makefile              |    3 +
 .../sysv/linux/s390/tst-ptrace-singleblock.c  |    3 +-
 sysdeps/x86_64/memcpy_chk.S                   |    1 +
 sysdeps/x86_64/memmove_chk.S                  |    1 +
 sysdeps/x86_64/mempcpy_chk.S                  |    3 +-
 sysdeps/x86_64/memset_chk.S                   |    1 +
 sysdeps/x86_64/multiarch/memcpy_chk.c         |    4 +
 sysdeps/x86_64/multiarch/memmove_chk.c        |    4 +
 sysdeps/x86_64/multiarch/mempcpy_chk.c        |    4 +
 sysdeps/x86_64/multiarch/memset_chk.c         |    4 +
 sysdeps/x86_64/multiarch/wmemset_chk.c        |    4 +
 wcsmbs/Makefile                               |   23 +-
 wcsmbs/bits/wchar2-decl.h                     |  172 +
 wcsmbs/bits/wchar2.h                          |  192 -
 111 files changed, 3765 insertions(+), 1951 deletions(-)
 create mode 100644 include/bits/select-decl.h
 create mode 100644 include/bits/syslog-decl.h
 create mode 100644 include/bits/unistd-decl.h
 create mode 100644 misc/bits/select-decl.h
 create mode 100644 misc/bits/syslog-decl.h
 create mode 100644 posix/bits/unistd-decl.h

-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 01/21] Add --enable-fortify-source option
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-20 20:42   ` Joseph Myers
  2023-06-21 13:18   ` Frederic Berat
  2023-06-20 18:18 ` [PATCH 02/21] Configure: regenerate for autoconf 2.71 Frédéric Bérat
                   ` (19 subsequent siblings)
  20 siblings, 2 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

It is now possible to enable fortification.
The level may be given as parameter, if none is provided, the configure
script will determine what is the highest level possible that can be set
considering GCC built-ins availability and set it.
If level is explicitly set to 3, configure checks if the compiler
supports the built-in function necessary for it or raise an error if it
isn't.

The result of the configure checks is 2 variables, $fortify_source and
$no_fortify_source that are used to appropriately populate CFLAGS.

Since the feature needs some of the routines provided by Glibc, these
are excluded from the fortification.
---
 Makeconfig     | 33 ++++++++++++++++++++++++---
 config.make.in |  3 ++-
 configure.ac   | 60 +++++++++++++++++++++++++++++++++++---------------
 elf/rtld-Rules |  2 +-
 4 files changed, 75 insertions(+), 23 deletions(-)

diff --git a/Makeconfig b/Makeconfig
index 2514db35f6..59fbd9ebf9 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -543,12 +543,13 @@ endif  # +link
 # ARM, gcc always produces different debugging symbols when invoked with
 # a -O greater than 0 than when invoked with -O0, regardless of anything else
 # we're using to suppress optimizations.  Therefore, we need to explicitly pass
-# -O0 to it through CFLAGS.
+# -O0 to it through CFLAGS. By side effect, any fortification needs to be
+# disabled as it needs -O greater than 0.
 # Additionally, the build system will try to -include $(common-objpfx)/config.h
 # when compiling the tests, which will throw an error if some special macros
 # (such as __OPTIMIZE__ and IS_IN_build) aren't defined.  To avoid this, we
 # tell gcc to define IS_IN_build.
-CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build
+CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build $(no-fortify-source)
 
 ifeq (yes,$(build-shared))
 # These indicate whether to link using the built ld.so or the installed one.
@@ -901,6 +902,16 @@ define elide-stack-protector
 $(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-stack-protector))
 endef
 
+# We might want to compile with fortify-source
+ifneq ($(fortify-source),)
++fortify-source=$(fortify-source)
+endif
+
+# Some routine can't be fortified like the ones used by fortify
+define elide-fortify-source
+$(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-fortify-source))
+endef
+
 # The program that makes Emacs-style TAGS files.
 ETAGS	:= etags
 
@@ -961,6 +972,16 @@ endif	# $(+cflags) == ""
 	   $(+stack-protector) -fno-common
 +gcc-nowarn := -w
 
+# We must filter out elf because the early bootstrap of the dynamic loader
+# cannot be fortified. Likewise we exclude dlfcn because it is entangled
+# with the loader. We must filter out csu because early startup, like the
+# loader, cannot be fortified. Lastly debug is the fortification routines
+# themselves and they cannot be fortified.
+do-fortify = $(filter-out elf dlfcn csu debug,$(subdir))
+ifeq ($(do-fortify),$(subdir))
++cflags += $(+fortify-source)
+endif
+
 # Each sysdeps directory can contain header files that both will be
 # used to compile and will be installed.  Each can also contain an
 # include/ subdirectory, whose header files will be used to compile
@@ -1010,7 +1031,7 @@ module-cppflags = $(if $(filter %.mk.i %.v.i,$(@F)),,$(module-cppflags-real))
 # Note that we can't use -std=* in CPPFLAGS, because it overrides
 # the implicit -lang-asm and breaks cpp behavior for .S files--notably
 # it causes cpp to stop predefining __ASSEMBLER__.
-CPPFLAGS = $(config-extra-cppflags) $(CPPUNDEFS) $(CPPFLAGS-config) \
+CPPFLAGS = $(config-extra-cppflags) $(CPPFLAGS-config) \
 	   $($(subdir)-CPPFLAGS) \
 	   $(+includes) $(defines) $(module-cppflags) \
 	   -include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
@@ -1049,6 +1070,8 @@ object-suffixes :=
 CPPFLAGS-.o = $(pic-default)
 # libc.a must be compiled with -fPIE/-fpie for static PIE.
 CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) $(pie-default)
+CFLAGS-.o += $(call elide-fortify-source,.o,$(routines_no_fortify))
+CFLAGS-.o += $(call elide-fortify-source,_chk.o,$(routines_no_fortify))
 libtype.o := lib%.a
 object-suffixes += .o
 ifeq (yes,$(build-shared))
@@ -1058,6 +1081,8 @@ object-suffixes += .os
 pic-cppflags = -DPIC -DSHARED
 CPPFLAGS-.os = $(pic-cppflags)
 CFLAGS-.os = $(filter %frame-pointer,$(+cflags)) $(pic-ccflag)
+CFLAGS-.os += $(call elide-fortify-source,.os,$(routines_no_fortify))
+CFLAGS-.os += $(call elide-fortify-source,_chk.os,$(routines_no_fortify))
 libtype.os := lib%_pic.a
 # This can be changed by a sysdep makefile
 pic-ccflag = -fPIC
@@ -1077,6 +1102,8 @@ object-suffixes += .op
 CPPFLAGS-.op = -DPROF $(pic-default)
 # libc_p.a must be compiled with -fPIE/-fpie for static PIE.
 CFLAGS-.op = -pg $(pie-default)
+CFLAGS-.op += $(call elide-fortify-source,.op,$(routines_no_fortify))
+CFLAGS-.op += $(call elide-fortify-source,_chk.op,$(routines_no_fortify))
 libtype.op = lib%_p.a
 endif
 
diff --git a/config.make.in b/config.make.in
index 4afd37feaf..d487a4f4e9 100644
--- a/config.make.in
+++ b/config.make.in
@@ -64,6 +64,8 @@ have-fpie = @libc_cv_fpie@
 have-ssp = @libc_cv_ssp@
 stack-protector = @stack_protector@
 no-stack-protector = @no_stack_protector@
+fortify-source = @fortify_source@
+no-fortify-source = @no_fortify_source@
 have-selinux = @have_selinux@
 have-libaudit = @have_libaudit@
 have-libcap = @have_libcap@
@@ -101,7 +103,6 @@ CXX = @CXX@
 BUILD_CC = @BUILD_CC@
 CFLAGS = @CFLAGS@
 CPPFLAGS-config = @CPPFLAGS@
-CPPUNDEFS = @CPPUNDEFS@
 extra-nonshared-cflags = @extra_nonshared_cflags@
 rtld-early-cflags = @rtld_early_cflags@
 ASFLAGS-config = @ASFLAGS_config@
diff --git a/configure.ac b/configure.ac
index 21879c933c..ec4de6e551 100644
--- a/configure.ac
+++ b/configure.ac
@@ -466,6 +466,17 @@ AC_ARG_ENABLE([scv],
 
 AS_IF([[test "$use_scv" != "no"]],[AC_DEFINE(USE_PPC_SCV)])
 
+dnl Build glibc with _FORTIFY_SOURCE
+AC_ARG_ENABLE(fortify-source,
+              AS_HELP_STRING([--enable-fortify-source@<:@=1|2|3@:>@],
+                             [Use -D_FORTIFY_SOURCE=[1|2|3] to control code hardening, defaults to highest possible value for your system]),
+              [enable_fortify_source=$enableval],
+              [enable_fortify_source=no])
+case "$enable_fortify_source" in
+1|2|3|no|yes) ;;
+*) AC_MSG_ERROR([Not a valid argument for --enable-fortify-source: "$enable_fortify_source"]);;
+esac
+
 # We keep the original values in `$config_*' and never modify them, so we
 # can write them unchanged into config.make.  Everything else uses
 # $machine, $vendor, and $os, and changes them whenever convenient.
@@ -1559,24 +1570,37 @@ if test "x$have_selinux" = xyes; then
 fi
 AC_SUBST(have_selinux)
 
-CPPUNDEFS=
-dnl Check for silly hacked compilers predefining _FORTIFY_SOURCE.
-dnl Since we are building the implementations of the fortified functions here,
-dnl having the macro defined interacts very badly.
-dnl _FORTIFY_SOURCE requires compiler optimization level 1 (gcc -O1)
-dnl and above (see "man FEATURE_TEST_MACROS").
-dnl So do NOT replace AC_COMPILE_IFELSE with AC_PREPROC_IFELSE.
-AC_CACHE_CHECK([for _FORTIFY_SOURCE predefine], libc_cv_predef_fortify_source,
-[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
-#ifdef _FORTIFY_SOURCE
-# error bogon
-#endif]])],
-		[libc_cv_predef_fortify_source=no],
-		[libc_cv_predef_fortify_source=yes])])
-if test $libc_cv_predef_fortify_source = yes; then
-  CPPUNDEFS="${CPPUNDEFS:+$CPPUNDEFS }-U_FORTIFY_SOURCE"
-fi
-AC_SUBST(CPPUNDEFS)
+dnl Check if we support the requested _FORTIFY_SOURCE level
+dnl If not, then don't use it.
+dnl Note that _FORTIFY_SOURCE may have been set through FLAGS too.
+dnl _FORTIFY_SOURCE value will be selectively disabled for function that can't
+dnl support it
+fortify_source=""
+no_fortify_source="-Wp,-U_FORTIFY_SOURCE"
+
+AC_CACHE_CHECK([for __builtin_dynamic_object_size], [libc_cv___builtin_dynamic_object_size], [
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([], [__builtin_dynamic_object_size("", 0)])],
+        [libc_cv___builtin_dynamic_object_size=yes
+         AS_IF([test "$enable_fortify_source" = yes], [enable_fortify_source=3])],
+        [libc_cv___builtin_dynamic_object_size=no
+         AS_IF([test "$enable_fortify_source" = yes], [enable_fortify_source=2])])
+])
+
+AS_CASE([$enable_fortify_source],
+        [1|2], [libc_cv_fortify_source=yes],
+        [3], [AS_IF([test "$libc_cv___builtin_dynamic_object_size" = yes],
+                    [libc_cv_fortify_source=yes],
+                    [AC_MSG_ERROR([Compiler doesn't provide necessary support for _FORTIFY_SOURCE=3])])],
+        [libc_cv_fortify_source=no])
+
+AS_IF([test "$libc_cv_fortify_source" = yes],
+      [fortify_source="${no_fortify_source},-D_FORTIFY_SOURCE=${enable_fortify_source}"]
+      )
+
+AC_SUBST(enable_fortify_source)
+AC_SUBST(libc_cv_fortify_source)
+AC_SUBST(no_fortify_source)
+AC_SUBST(fortify_source)
 
 dnl Starting with binutils 2.35, GAS can attach multiple symbol versions
 dnl to one symbol (PR 23840).
diff --git a/elf/rtld-Rules b/elf/rtld-Rules
index 56bc4543de..365a3408f3 100644
--- a/elf/rtld-Rules
+++ b/elf/rtld-Rules
@@ -144,6 +144,6 @@ cpp-srcs-left := $(rtld-modules:%.os=%)
 lib := rtld
 include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left))
 
-rtld-CFLAGS += $(no-stack-protector)
+rtld-CFLAGS += $(no-stack-protector) $(no-fortify-source)
 
 endif
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 02/21] Configure: regenerate for autoconf 2.71
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 01/21] Add --enable-fortify-source option Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-20 20:47   ` Joseph Myers
  2023-06-22 19:07   ` Florian Weimer
  2023-06-20 18:18 ` [PATCH 03/21] Exclude routines from fortification Frédéric Bérat
                   ` (18 subsequent siblings)
  20 siblings, 2 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

Update configure.ac to enable support for autoconf 2.71, and autoreconf
to integrate new enable-fortify-source option.
---
 aclocal.m4                    |    2 +-
 configure                     | 4208 +++++++++++++++++++++------------
 configure.ac                  |   10 +-
 sysdeps/generic/libc-symver.h |    2 +-
 4 files changed, 2755 insertions(+), 1467 deletions(-)

diff --git a/aclocal.m4 b/aclocal.m4
index 213835e1d5..a097d66a49 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -2,7 +2,7 @@ dnl We require that everyone use exactly the same Autoconf version so that
 dnl the internal functions defined and used by the main configure script
 dnl match those expected by the fragments.  When changing this version,
 dnl install.texi also needs to be updated.
-m4_define([GLIBC_AUTOCONF_VERSION], [2.69])
+m4_define([GLIBC_AUTOCONF_VERSION], [2.71])
 m4_if(m4_defn([AC_AUTOCONF_VERSION]), GLIBC_AUTOCONF_VERSION, [],
       [m4_fatal(m4_flatten(
 Exactly version GLIBC_AUTOCONF_VERSION of Autoconf is required but you have
diff --git a/configure b/configure
index f84040644b..520893f2bd 100755
--- a/configure
+++ b/configure
@@ -1,11 +1,12 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GNU C Library (see version.h).
+# Generated by GNU Autoconf 2.71 for GNU C Library (see version.h).
 #
 # Report bugs to <https://sourceware.org/bugzilla/>.
 #
 #
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -16,14 +17,16 @@
 
 # Be more Bourne compatible
 DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
   emulate sh
   NULLCMD=:
   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
-else
+else $as_nop
   case `(set -o) 2>/dev/null` in #(
   *posix*) :
     set -o posix ;; #(
@@ -33,46 +36,46 @@ esac
 fi
 
 
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
 as_nl='
 '
 export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" ""	$as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2)            ; then :; else exec 2>/dev/null; fi
 
 # The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
   PATH_SEPARATOR=:
   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -81,13 +84,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
 fi
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
 # Find who we are.  Look in the path if we contain no directory separator.
 as_myself=
 case $0 in #((
@@ -96,8 +92,12 @@ case $0 in #((
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    test -r "$as_dir$0" && as_myself=$as_dir$0 && break
   done
 IFS=$as_save_IFS
 
@@ -109,30 +109,10 @@ if test "x$as_myself" = x; then
   as_myself=$0
 fi
 if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
   exit 1
 fi
 
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 # Use a proper internal environment variable to ensure we don't fall
   # into an infinite loop, continuously re-executing ourselves.
@@ -154,20 +134,22 @@ esac
 exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
 # Admittedly, this is quite paranoid, since all the known shells bail
 # out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
   fi
   # We don't want this to propagate to other subprocesses.
           { _as_can_reexec=; unset _as_can_reexec;}
 if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
   emulate sh
   NULLCMD=:
   # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '\${1+\"\$@\"}'='\"\$@\"'
   setopt NO_GLOB_SUBST
-else
+else \$as_nop
   case \`(set -o) 2>/dev/null\` in #(
   *posix*) :
     set -o posix ;; #(
@@ -187,41 +169,52 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
 as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
 as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
 as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
 
-else
+else \$as_nop
   exitcode=1; echo positional parameters were not saved.
 fi
 test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
 test -x / || exit 1"
   as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
   test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
+  if (eval "$as_required") 2>/dev/null
+then :
   as_have_required=yes
-else
+else $as_nop
   as_have_required=no
 fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
 
-else
+else $as_nop
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 as_found=false
 for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
   as_found=:
   case $as_dir in #(
 	 /*)
 	   for as_base in sh bash ksh sh5; do
 	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
+	     as_shell=$as_dir$as_base
 	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+		    as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
   CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+		   if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
   break 2
 fi
 fi
@@ -229,14 +222,21 @@ fi
        esac
   as_found=false
 done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
 IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+  if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
 
 
-      if test "x$CONFIG_SHELL" != x; then :
+      if test "x$CONFIG_SHELL" != x
+then :
   export CONFIG_SHELL
              # We cannot yet assume a decent shell, so we have to provide a
 # neutralization value for shells without unset; and this also
@@ -254,18 +254,19 @@ esac
 exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
 # Admittedly, this is quite paranoid, since all the known shells bail
 # out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
 exit 255
 fi
 
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+    if test x$as_have_required = xno
+then :
+  printf "%s\n" "$0: This script requires a shell more modern than all"
+  printf "%s\n" "$0: the shells that I found on your system."
+  if test ${ZSH_VERSION+y} ; then
+    printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
   else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+    printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and
 $0: https://sourceware.org/bugzilla/ about your system,
 $0: including any error possibly output before this
 $0: message. Then install a modern shell, or manually run
@@ -293,6 +294,7 @@ as_fn_unset ()
 }
 as_unset=as_fn_unset
 
+
 # as_fn_set_status STATUS
 # -----------------------
 # Set $? to STATUS, without forking.
@@ -310,6 +312,14 @@ as_fn_exit ()
   as_fn_set_status $1
   exit $1
 } # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+  return $?
+}
+as_nop=as_fn_nop
 
 # as_fn_mkdir_p
 # -------------
@@ -324,7 +334,7 @@ as_fn_mkdir_p ()
     as_dirs=
     while :; do
       case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
       *) as_qdir=$as_dir;;
       esac
       as_dirs="'$as_qdir' $as_dirs"
@@ -333,7 +343,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
 	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -372,12 +382,13 @@ as_fn_executable_p ()
 # advantage of any shell optimizations that allow amortized linear growth over
 # repeated appends, instead of the typical quadratic growth present in naive
 # implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
   eval 'as_fn_append ()
   {
     eval $1+=\$2
   }'
-else
+else $as_nop
   as_fn_append ()
   {
     eval $1=\$$1\$2
@@ -389,18 +400,27 @@ fi # as_fn_append
 # Perform arithmetic evaluation on the ARGs, and store the result in the
 # global $as_val. Take advantage of shells that can avoid forks. The arguments
 # must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
   eval 'as_fn_arith ()
   {
     as_val=$(( $* ))
   }'
-else
+else $as_nop
   as_fn_arith ()
   {
     as_val=`expr "$@" || test $? -eq 1`
   }
 fi # as_fn_arith
 
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+  return $?
+}
+as_nop=as_fn_nop
 
 # as_fn_error STATUS ERROR [LINENO LOG_FD]
 # ----------------------------------------
@@ -412,9 +432,9 @@ as_fn_error ()
   as_status=$1; test $as_status -eq 0 && as_status=1
   if test "$4"; then
     as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
   fi
-  $as_echo "$as_me: error: $2" >&2
+  printf "%s\n" "$as_me: error: $2" >&2
   as_fn_exit $as_status
 } # as_fn_error
 
@@ -441,7 +461,7 @@ as_me=`$as_basename -- "$0" ||
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
     sed '/^.*\/\([^/][^/]*\)\/*$/{
 	    s//\1/
 	    q
@@ -485,7 +505,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
       s/-\n.*//
     ' >$as_me.lineno &&
   chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+    { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
   # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
   # already done that, so ensure we don't try to do so again and fall
@@ -499,6 +519,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
   exit
 }
 
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
 ECHO_C= ECHO_N= ECHO_T=
 case `echo -n x` in #(((((
 -n*)
@@ -512,6 +536,13 @@ case `echo -n x` in #(((((
   ECHO_N='-n';;
 esac
 
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n.  New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
 rm -f conf$$ conf$$.exe conf$$.file
 if test -d conf$$.dir; then
   rm -f conf$$.dir/conf$$.file
@@ -611,7 +642,10 @@ libc_cv_gcc_unwind_find_fde
 libc_extra_cppflags
 libc_extra_cflags
 libc_cv_cxx_thread_local
-CPPUNDEFS
+fortify_source
+no_fortify_source
+libc_cv_fortify_source
+enable_fortify_source
 have_selinux
 have_libcap
 have_libaudit
@@ -723,6 +757,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -782,6 +817,7 @@ enable_pt_chown
 enable_mathvec
 enable_cet
 enable_scv
+enable_fortify_source
 with_cpu
 '
       ac_precious_vars='build_alias
@@ -834,6 +870,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -863,8 +900,6 @@ do
   *)    ac_optarg=yes ;;
   esac
 
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
   case $ac_dashdash$ac_option in
   --)
     ac_dashdash=yes ;;
@@ -905,9 +940,9 @@ do
     ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
+      as_fn_error $? "invalid feature name: \`$ac_useropt'"
     ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
       *"
 "enable_$ac_useropt"
@@ -931,9 +966,9 @@ do
     ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
+      as_fn_error $? "invalid feature name: \`$ac_useropt'"
     ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
       *"
 "enable_$ac_useropt"
@@ -1086,6 +1121,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1135,9 +1179,9 @@ do
     ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
+      as_fn_error $? "invalid package name: \`$ac_useropt'"
     ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
       *"
 "with_$ac_useropt"
@@ -1151,9 +1195,9 @@ do
     ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
+      as_fn_error $? "invalid package name: \`$ac_useropt'"
     ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
       *"
 "with_$ac_useropt"
@@ -1197,9 +1241,9 @@ Try \`$0 --help' for more information"
 
   *)
     # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
     expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+      printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
     : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
     ;;
 
@@ -1215,7 +1259,7 @@ if test -n "$ac_unrecognized_opts"; then
   case $enable_option_checking in
     no) ;;
     fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+    *)     printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
   esac
 fi
 
@@ -1223,7 +1267,7 @@ fi
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1279,7 +1323,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_myself" : 'X\(//\)[^/]' \| \
 	 X"$as_myself" : 'X\(//\)$' \| \
 	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -1376,6 +1420,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1452,6 +1497,10 @@ Optional Features:
                           (CET), x86 only
   --disable-scv           syscalls will not use scv instruction, even if the
                           kernel supports it, powerpc only
+  --enable-fortify-source[=1|2|3]
+                          Use -D_FORTIFY_SOURCE=[1|2|3] to control code
+                          hardening, defaults to highest possible value for
+                          your system
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1490,7 +1539,7 @@ it to find libraries and programs with nonstandard names/locations.
 
 Report bugs to <https://sourceware.org/bugzilla/>.
 GNU C Library home page: <https://www.gnu.org/software/glibc/>.
-General help using GNU software: <http://www.gnu.org/gethelp/>.
+General help using GNU software: <https://www.gnu.org/gethelp/>.
 _ACEOF
 ac_status=$?
 fi
@@ -1506,9 +1555,9 @@ if test "$ac_init_help" = "recursive"; then
 case "$ac_dir" in
 .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
 *)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
   # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
   case $ac_top_builddir_sub in
   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1536,7 +1585,8 @@ esac
 ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
     cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
+    # Check for configure.gnu first; this name is used for a wrapper for
+    # Metaconfig's "Configure" on case-insensitive file systems.
     if test -f "$ac_srcdir/configure.gnu"; then
       echo &&
       $SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1544,7 +1594,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
       echo &&
       $SHELL "$ac_srcdir/configure" --help=recursive
     else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+      printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
     fi || ac_status=$?
     cd "$ac_pwd" || { ac_status=$?; break; }
   done
@@ -1554,9 +1604,9 @@ test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
 GNU C Library configure (see version.h)
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.71
 
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -1573,14 +1623,14 @@ fi
 ac_fn_c_try_compile ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
+  rm -f conftest.$ac_objext conftest.beam
   if { { ac_try="$ac_compile"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_compile") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -1588,14 +1638,15 @@ $as_echo "$ac_try_echo"; } >&5
     cat conftest.er1 >&5
     mv -f conftest.er1 conftest.err
   fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
+       } && test -s conftest.$ac_objext
+then :
   ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_retval=1
@@ -1611,14 +1662,14 @@ fi
 ac_fn_cxx_try_compile ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
+  rm -f conftest.$ac_objext conftest.beam
   if { { ac_try="$ac_compile"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_compile") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -1626,14 +1677,15 @@ $as_echo "$ac_try_echo"; } >&5
     cat conftest.er1 >&5
     mv -f conftest.er1 conftest.err
   fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && {
 	 test -z "$ac_cxx_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
+       } && test -s conftest.$ac_objext
+then :
   ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_retval=1
@@ -1649,14 +1701,14 @@ fi
 ac_fn_cxx_try_link ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
+  rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
   if { { ac_try="$ac_link"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_link") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -1664,17 +1716,18 @@ $as_echo "$ac_try_echo"; } >&5
     cat conftest.er1 >&5
     mv -f conftest.er1 conftest.err
   fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && {
 	 test -z "$ac_cxx_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
 	 test "$cross_compiling" = yes ||
 	 test -x conftest$ac_exeext
-       }; then :
+       }
+then :
   ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_retval=1
@@ -1695,14 +1748,14 @@ fi
 ac_fn_c_try_link ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
+  rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
   if { { ac_try="$ac_link"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_link") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -1710,17 +1763,18 @@ $as_echo "$ac_try_echo"; } >&5
     cat conftest.er1 >&5
     mv -f conftest.er1 conftest.err
   fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
 	 test "$cross_compiling" = yes ||
 	 test -x conftest$ac_exeext
-       }; then :
+       }
+then :
   ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_retval=1
@@ -1747,7 +1801,7 @@ case "(($ac_try" in
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -1755,14 +1809,15 @@ $as_echo "$ac_try_echo"; } >&5
     cat conftest.er1 >&5
     mv -f conftest.er1 conftest.err
   fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } > conftest.i && {
 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       }; then :
+       }
+then :
   ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
     ac_retval=1
@@ -1771,14 +1826,34 @@ fi
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_cpp
+ac_configure_args_raw=
+for ac_arg
+do
+  case $ac_arg in
+  *\'*)
+    ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  esac
+  as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+  *$as_nl*)
+    ac_safe_unquote= ;;
+  *)
+    ac_unsafe_z='|&;<>()$`\\"*?[ ''	' # This string ends in space, tab.
+    ac_unsafe_a="$ac_unsafe_z#~"
+    ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+    ac_configure_args_raw=`      printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by GNU C Library $as_me (see version.h), which was
-generated by GNU Autoconf 2.69.  Invocation command line was
+generated by GNU Autoconf 2.71.  Invocation command line was
 
-  $ $0 $@
+  $ $0$ac_configure_args_raw
 
 _ACEOF
 exec 5>>config.log
@@ -1811,8 +1886,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    printf "%s\n" "PATH: $as_dir"
   done
 IFS=$as_save_IFS
 
@@ -1847,7 +1926,7 @@ do
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
     *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+      ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
     1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -1882,11 +1961,13 @@ done
 # WARNING: Use '\'' to represent an apostrophe within the trap.
 # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
 trap 'exit_status=$?
+  # Sanitize IFS.
+  IFS=" ""	$as_nl"
   # Save into config.log some information that might help in debugging.
   {
     echo
 
-    $as_echo "## ---------------- ##
+    printf "%s\n" "## ---------------- ##
 ## Cache variables. ##
 ## ---------------- ##"
     echo
@@ -1897,8 +1978,8 @@ trap 'exit_status=$?
     case $ac_val in #(
     *${as_nl}*)
       case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       esac
       case $ac_var in #(
       _ | IFS | as_nl) ;; #(
@@ -1922,7 +2003,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
 )
     echo
 
-    $as_echo "## ----------------- ##
+    printf "%s\n" "## ----------------- ##
 ## Output variables. ##
 ## ----------------- ##"
     echo
@@ -1930,14 +2011,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
     do
       eval ac_val=\$$ac_var
       case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
       esac
-      $as_echo "$ac_var='\''$ac_val'\''"
+      printf "%s\n" "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
     if test -n "$ac_subst_files"; then
-      $as_echo "## ------------------- ##
+      printf "%s\n" "## ------------------- ##
 ## File substitutions. ##
 ## ------------------- ##"
       echo
@@ -1945,15 +2026,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       do
 	eval ac_val=\$$ac_var
 	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	*\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
 	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
+	printf "%s\n" "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
 
     if test -s confdefs.h; then
-      $as_echo "## ----------- ##
+      printf "%s\n" "## ----------- ##
 ## confdefs.h. ##
 ## ----------- ##"
       echo
@@ -1961,8 +2042,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       echo
     fi
     test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
+      printf "%s\n" "$as_me: caught signal $ac_signal"
+    printf "%s\n" "$as_me: exit $exit_status"
   } >&5
   rm -f core *.core core.conftest.* &&
     rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -1976,63 +2057,48 @@ ac_signal=0
 # confdefs.h avoids OS command line length limits that DEFS can exceed.
 rm -f -r conftest* confdefs.h
 
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
 
 # Predefined preprocessor variables.
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
 
 
 # Let the site file select an alternate cache file if it wants to.
 # Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
 if test -n "$CONFIG_SITE"; then
-  # We do not want a PATH search for config.site.
-  case $CONFIG_SITE in #((
-    -*)  ac_site_file1=./$CONFIG_SITE;;
-    */*) ac_site_file1=$CONFIG_SITE;;
-    *)   ac_site_file1=./$CONFIG_SITE;;
-  esac
+  ac_site_files="$CONFIG_SITE"
 elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
+  ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
 else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
+  ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
 fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
 do
-  test "x$ac_site_file" = xNONE && continue
-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+  case $ac_site_file in #(
+  */*) :
+     ;; #(
+  *) :
+    ac_site_file=./$ac_site_file ;;
+esac
+  if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
     sed 's/^/| /' "$ac_site_file" >&5
     . "$ac_site_file" \
-      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+      || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "failed to load site script $ac_site_file
 See \`config.log' for more details" "$LINENO" 5; }
   fi
@@ -2042,19 +2108,641 @@ if test -r "$cache_file"; then
   # Some versions of bash will fail to source /dev/null (special files
   # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
   if test /dev/null != "$cache_file" && test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
       [\\/]* | ?:[\\/]* ) . "$cache_file";;
       *)                      . "./$cache_file";;
     esac
   fi
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
   >$cache_file
 fi
 
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+   Do not test the value of __STDC__, because some compilers set it to 0
+   while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh.  */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not \xHH hex character constants.
+   These do not provoke an error unfortunately, instead are silently treated
+   as an "x".  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously \x00 != x always comes out true, for an
+   array size at least.  It is necessary to write \x00 == 0 to get something
+   that is true only with -std.  */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+               int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+  #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str = "";
+  int number = 0;
+  float fnumber = 0;
+
+  while (*format)
+    {
+      switch (*format++)
+	{
+	case '\''s'\'': // string
+	  str = va_arg (args_copy, const char *);
+	  break;
+	case '\''d'\'': // int
+	  number = va_arg (args_copy, int);
+	  break;
+	case '\''f'\'': // float
+	  fnumber = va_arg (args_copy, double);
+	  break;
+	default:
+	  break;
+	}
+    }
+  va_end (args_copy);
+  va_end (args);
+
+  return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+  // Check bool.
+  _Bool success = false;
+  success |= (argc != 0);
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[0] = argv[0][0];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+	 || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+  int_alignment = _Alignof (int),
+  int_array_alignment = _Alignof (int[100]),
+  char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+  int x;
+  _Static_assert (sizeof (int) <= sizeof (long int),
+                  "_Static_assert does not work in struct");
+  long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+  union {
+    struct { int i; int j; };
+    struct { int k; long int l; } w;
+  };
+  int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+  _Static_assert ((offsetof (struct anonymous, i)
+		   == offsetof (struct anonymous, w.k)),
+		  "Anonymous union alignment botch");
+  v1.i = 2;
+  v1.w.k = 5;
+  ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_c_conftest_c89_main}
+  ${ac_c_conftest_c99_main}
+  ${ac_c_conftest_c11_main}
+  return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_c_conftest_c89_main}
+  ${ac_c_conftest_c99_main}
+  return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_c_conftest_c89_main}
+  return ok;
+}
+"
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+  extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+  try {
+    throw "test";
+  } catch (const char *s) {
+    // Extra parentheses suppress a warning when building autoconf itself,
+    // due to lint rules shared with more typical C programs.
+    assert (!(strcmp) (s, "test"));
+  }
+}
+
+template <typename T> struct test_template
+{
+  T const val;
+  explicit test_template(T t) : val(t) {}
+  template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+  assert (argc);
+  assert (! argv[0]);
+{
+  test_exception_syntax ();
+  test_template<double> tt (2.0);
+  assert (tt.add (4) == 6.0);
+  assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+  constexpr int get_val() { return 20; }
+
+  struct testinit
+  {
+    int i;
+    double d;
+  };
+
+  class delegate
+  {
+  public:
+    delegate(int n) : n(n) {}
+    delegate(): delegate(2354) {}
+
+    virtual int getval() { return this->n; };
+  protected:
+    int n;
+  };
+
+  class overridden : public delegate
+  {
+  public:
+    overridden(int n): delegate(n) {}
+    virtual int getval() override final { return this->n * 2; }
+  };
+
+  class nocopy
+  {
+  public:
+    nocopy(int i): i(i) {}
+    nocopy() = default;
+    nocopy(const nocopy&) = delete;
+    nocopy & operator=(const nocopy&) = delete;
+  private:
+    int i;
+  };
+
+  // for testing lambda expressions
+  template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+  {
+    return f(v);
+  }
+
+  // for testing variadic templates and trailing return types
+  template <typename V> auto sum(V first) -> V
+  {
+    return first;
+  }
+  template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+  {
+    return first + sum(rest...);
+  }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+  // Test auto and decltype
+  auto a1 = 6538;
+  auto a2 = 48573953.4;
+  auto a3 = "String literal";
+
+  int total = 0;
+  for (auto i = a3; *i; ++i) { total += *i; }
+
+  decltype(a2) a4 = 34895.034;
+}
+{
+  // Test constexpr
+  short sa[cxx11test::get_val()] = { 0 };
+}
+{
+  // Test initializer lists
+  cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+  // Test range-based for
+  int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+                 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+  for (auto &x : array) { x += 23; }
+}
+{
+  // Test lambda expressions
+  using cxx11test::eval;
+  assert (eval ([](int x) { return x*2; }, 21) == 42);
+  double d = 2.0;
+  assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+  assert (d == 5.0);
+  assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+  assert (d == 5.0);
+}
+{
+  // Test use of variadic templates
+  using cxx11test::sum;
+  auto a = sum(1);
+  auto b = sum(1, 2);
+  auto c = sum(1.0, 2.0, 3.0);
+}
+{
+  // Test constructor delegation
+  cxx11test::delegate d1;
+  cxx11test::delegate d2();
+  cxx11test::delegate d3(45);
+}
+{
+  // Test override and final
+  cxx11test::overridden o1(55464);
+}
+{
+  // Test nullptr
+  char *c = nullptr;
+}
+{
+  // Test template brackets
+  test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+  // Unicode literals
+  char const *utf8 = u8"UTF-8 string \u2500";
+  char16_t const *utf16 = u"UTF-8 string \u2500";
+  char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_cxx_conftest_cxx98_main}
+  ${ac_cxx_conftest_cxx11_main}
+  return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_cxx_conftest_cxx98_main}
+  return ok;
+}
+"
+
+
+# Auxiliary files required by this configure script.
+ac_aux_files="install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}/scripts"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+  as_found=:
+
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}:  trying $as_dir" >&5
+  ac_aux_dir_found=yes
+  ac_install_sh=
+  for ac_aux in $ac_aux_files
+  do
+    # As a special case, if "install-sh" is required, that requirement
+    # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+    # and $ac_install_sh is set appropriately for whichever one is found.
+    if test x"$ac_aux" = x"install-sh"
+    then
+      if test -f "${as_dir}install-sh"; then
+        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}install-sh found" >&5
+        ac_install_sh="${as_dir}install-sh -c"
+      elif test -f "${as_dir}install.sh"; then
+        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}install.sh found" >&5
+        ac_install_sh="${as_dir}install.sh -c"
+      elif test -f "${as_dir}shtool"; then
+        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}shtool found" >&5
+        ac_install_sh="${as_dir}shtool install -c"
+      else
+        ac_aux_dir_found=no
+        if $ac_first_candidate; then
+          ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+        else
+          break
+        fi
+      fi
+    else
+      if test -f "${as_dir}${ac_aux}"; then
+        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}${ac_aux} found" >&5
+      else
+        ac_aux_dir_found=no
+        if $ac_first_candidate; then
+          ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+        else
+          break
+        fi
+      fi
+    fi
+  done
+  if test "$ac_aux_dir_found" = yes; then
+    ac_aux_dir="$as_dir"
+    break
+  fi
+  ac_first_candidate=false
+
+  as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+  as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+  ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+  ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+  ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
 # Check that the precious variables saved in the cache have kept the same
 # value.
 ac_cache_corrupted=false
@@ -2065,12 +2753,12 @@ for ac_var in $ac_precious_vars; do
   eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,);;
     *)
@@ -2079,24 +2767,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
 	ac_old_val_w=`echo x $ac_old_val`
 	ac_new_val_w=`echo x $ac_new_val`
 	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
 	  ac_cache_corrupted=:
 	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
 	  eval $ac_var=\$ac_old_val
 	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+printf "%s\n" "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me:   current value: \`$ac_new_val'" >&2;}
       fi;;
   esac
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
@@ -2106,11 +2794,12 @@ $as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
   fi
 done
 if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+	    and start over" "$LINENO" 5
 fi
 ## -------------------- ##
 ## Main body of script. ##
@@ -2126,46 +2815,19 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 ac_config_headers="$ac_config_headers config.h"
 
-ac_aux_dir=
-for ac_dir in scripts "$srcdir"/scripts; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in scripts \"$srcdir\"/scripts" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
 
 
 
 
 # Check whether --with-pkgversion was given.
-if test "${with_pkgversion+set}" = set; then :
+if test ${with_pkgversion+y}
+then :
   withval=$with_pkgversion; case "$withval" in
       yes) as_fn_error $? "package version not specified" "$LINENO" 5 ;;
       no)  PKGVERSION= ;;
       *)   PKGVERSION="($withval) " ;;
      esac
-else
+else $as_nop
   PKGVERSION="(GNU libc) "
 
 fi
@@ -2177,7 +2839,8 @@ fi
 
 
 # Check whether --with-bugurl was given.
-if test "${with_bugurl+set}" = set; then :
+if test ${with_bugurl+y}
+then :
   withval=$with_bugurl; case "$withval" in
       yes) as_fn_error $? "bug URL not specified" "$LINENO" 5 ;;
       no)  BUGURL=
@@ -2185,7 +2848,7 @@ if test "${with_bugurl+set}" = set; then :
       *)   BUGURL="$withval"
 	   ;;
      esac
-else
+else $as_nop
   BUGURL="https://www.gnu.org/software/libc/bugs.html"
 
 fi
@@ -2204,14 +2867,10 @@ fi
 
 
 
-cat >>confdefs.h <<_ACEOF
-#define PKGVERSION "$PKGVERSION"
-_ACEOF
+printf "%s\n" "#define PKGVERSION \"$PKGVERSION\"" >>confdefs.h
 
 
-cat >>confdefs.h <<_ACEOF
-#define REPORT_BUGS_TO "$REPORT_BUGS_TO"
-_ACEOF
+printf "%s\n" "#define REPORT_BUGS_TO \"$REPORT_BUGS_TO\"" >>confdefs.h
 
 
 # Glibc should not depend on any header files
@@ -2232,26 +2891,30 @@ _ACEOF
 subdirs="$subdirs "
 
 
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+
+
+  # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   ac_build_alias=$build_alias
 test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+  ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
 test "x$ac_build_alias" = x &&
   as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
 case $ac_cv_build in
 *-*-*) ;;
 *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -2270,21 +2933,22 @@ IFS=$ac_save_IFS
 case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test "x$host_alias" = x; then
   ac_cv_host=$ac_cv_build
 else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+  ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
 case $ac_cv_host in
 *-*-*) ;;
 *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -2304,6 +2968,15 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
 
 
 
+
+
+
+
+
+
+
+
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2312,11 +2985,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
@@ -2324,11 +2998,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2339,11 +3017,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -2352,11 +3030,12 @@ if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$ac_ct_CC"; then
   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
 else
@@ -2364,11 +3043,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2379,11 +3062,11 @@ fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
   if test "x$ac_ct_CC" = x; then
@@ -2391,8 +3074,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CC=$ac_ct_CC
@@ -2405,11 +3088,12 @@ if test -z "$CC"; then
           if test -n "$ac_tool_prefix"; then
     # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
@@ -2417,11 +3101,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2432,11 +3120,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -2445,11 +3133,12 @@ fi
 if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
@@ -2458,15 +3147,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
      fi
     ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2482,18 +3175,18 @@ if test $ac_prog_rejected = yes; then
     # However, it has the same basename, so the bogon will be chosen
     # first if we set CC to just the basename; use the full file name.
     shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+    ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
   fi
 fi
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -2504,11 +3197,12 @@ if test -z "$CC"; then
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
@@ -2516,11 +3210,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2531,11 +3229,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -2548,11 +3246,12 @@ if test -z "$CC"; then
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$ac_ct_CC"; then
   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
 else
@@ -2560,11 +3259,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2575,11 +3278,11 @@ fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -2591,34 +3294,138 @@ done
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}clang"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="clang"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CC=$ac_ct_CC
   fi
+else
+  CC="$ac_cv_prog_CC"
 fi
 
 fi
 
 
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "no acceptable C compiler found in \$PATH
 See \`config.log' for more details" "$LINENO" 5; }
 
 # Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
 set X $ac_compile
 ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
+for ac_option in --version -v -V -qversion -version; do
   { { ac_try="$ac_compiler $ac_option >&5"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_compiler $ac_option >&5") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -2628,21 +3435,22 @@ $as_echo "$ac_try_echo"; } >&5
     cat conftest.er1 >&5
   fi
   rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
 done
 
 EXEEXT=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
@@ -2656,11 +3464,12 @@ case "(($ac_try" in
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_compile") 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+then :
   for ac_file in conftest.o conftest.obj conftest.*; do
   test -f "$ac_file" || continue;
   case $ac_file in
@@ -2669,31 +3478,32 @@ $as_echo "$ac_try_echo"; } >&5
        break;;
   esac
 done
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "cannot compute suffix of object files: cannot compile
 See \`config.log' for more details" "$LINENO" 5; }
 fi
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
 OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 #ifndef __GNUC__
        choke me
@@ -2703,29 +3513,33 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_compiler_gnu=yes
-else
+else $as_nop
   ac_compiler_gnu=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
 if test $ac_compiler_gnu = yes; then
   GCC=yes
 else
   GCC=
 fi
-ac_test_CFLAGS=${CFLAGS+set}
+ac_test_CFLAGS=${CFLAGS+y}
 ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   ac_save_c_werror_flag=$ac_c_werror_flag
    ac_c_werror_flag=yes
    ac_cv_prog_cc_g=no
@@ -2734,70 +3548,212 @@ else
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_cv_prog_cc_g=yes
-else
+else $as_nop
   CFLAGS=""
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
 
-else
+else $as_nop
   ac_c_werror_flag=$ac_save_c_werror_flag
 	 CFLAGS="-g"
 	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_cv_prog_cc_g=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+  test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cc_c11" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+     CC="$CC $ac_cv_prog_cc_c11"
+fi
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+  ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cc_c99" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+     CC="$CC $ac_cv_prog_cc_c99"
+fi
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+  ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cc_c89" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+     CC="$CC $ac_cv_prog_cc_c89"
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+  ac_prog_cc_stdc=c89
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
 fi
 
 ac_ext=c
@@ -2811,11 +3767,12 @@ if test $host != $build; then
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_BUILD_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_BUILD_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$BUILD_CC"; then
   ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test.
 else
@@ -2823,11 +3780,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_BUILD_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2838,11 +3799,11 @@ fi
 fi
 BUILD_CC=$ac_cv_prog_BUILD_CC
 if test -n "$BUILD_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUILD_CC" >&5
-$as_echo "$BUILD_CC" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BUILD_CC" >&5
+printf "%s\n" "$BUILD_CC" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -2861,6 +3822,12 @@ fi
 
 
 # We need the C++ compiler only for testing.
+
+
+
+
+
+
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2871,15 +3838,16 @@ if test -z "$CXX"; then
     CXX=$CCC
   else
     if test -n "$ac_tool_prefix"; then
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$CXX"; then
   ac_cv_prog_CXX="$CXX" # Let the user override the test.
 else
@@ -2887,11 +3855,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2902,11 +3874,11 @@ fi
 fi
 CXX=$ac_cv_prog_CXX
 if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -2915,15 +3887,16 @@ fi
 fi
 if test -z "$CXX"; then
   ac_ct_CXX=$CXX
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$ac_ct_CXX"; then
   ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
 else
@@ -2931,11 +3904,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CXX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2946,11 +3923,11 @@ fi
 fi
 ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
 if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -2962,8 +3939,8 @@ done
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CXX=$ac_ct_CXX
@@ -2973,7 +3950,7 @@ fi
   fi
 fi
 # Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
 set X $ac_compile
 ac_compiler=$2
 for ac_option in --version -v -V -qversion; do
@@ -2983,7 +3960,7 @@ case "(($ac_try" in
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_compiler $ac_option >&5") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -2993,20 +3970,21 @@ $as_echo "$ac_try_echo"; } >&5
     cat conftest.er1 >&5
   fi
   rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
 done
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 #ifndef __GNUC__
        choke me
@@ -3016,29 +3994,33 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
   ac_compiler_gnu=yes
-else
+else $as_nop
   ac_compiler_gnu=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
 if test $ac_compiler_gnu = yes; then
   GXX=yes
 else
   GXX=
 fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_test_CXXFLAGS=${CXXFLAGS+y}
 ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   ac_save_cxx_werror_flag=$ac_cxx_werror_flag
    ac_cxx_werror_flag=yes
    ac_cv_prog_cxx_g=no
@@ -3047,57 +4029,60 @@ else
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
   ac_cv_prog_cxx_g=yes
-else
+else $as_nop
   CXXFLAGS=""
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
 
-else
+else $as_nop
   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
 	 CXXFLAGS="-g"
 	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
   ac_cv_prog_cxx_g=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    ac_cxx_werror_flag=$ac_save_cxx_werror_flag
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
   CXXFLAGS=$ac_save_CXXFLAGS
 elif test $ac_cv_prog_cxx_g = yes; then
   if test "$GXX" = yes; then
@@ -3112,6 +4097,100 @@ else
     CXXFLAGS=
   fi
 fi
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx11+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cxx_cxx11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+  CXX="$ac_save_CXX $ac_arg"
+  if ac_fn_cxx_try_compile "$LINENO"
+then :
+  ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+  test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+     CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+  ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+  ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_cxx98+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cxx_cxx98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+  CXX="$ac_save_CXX $ac_arg"
+  if ac_fn_cxx_try_compile "$LINENO"
+then :
+  ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+  test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+     CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+  ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+  ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3120,11 +4199,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 # It's useless to us if it can't link programs (e.g. missing -lstdc++).
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX can link programs" >&5
-$as_echo_n "checking whether $CXX can link programs... " >&6; }
-if ${libc_cv_cxx_link_ok+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX can link programs" >&5
+printf %s "checking whether $CXX can link programs... " >&6; }
+if test ${libc_cv_cxx_link_ok+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3136,19 +4216,20 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"
+then :
   libc_cv_cxx_link_ok=yes
-else
+else $as_nop
   libc_cv_cxx_link_ok=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
 # Static case.
 old_LDFLAGS="$LDFLAGS"
@@ -3166,12 +4247,13 @@ main()
 }
 
 _ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"
+then :
 
-else
+else $as_nop
   libc_cv_cxx_link_ok=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
 LDFLAGS="$old_LDFLAGS"
 ac_ext=c
@@ -3181,9 +4263,10 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cxx_link_ok" >&5
-$as_echo "$libc_cv_cxx_link_ok" >&6; }
-if test $libc_cv_cxx_link_ok != yes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cxx_link_ok" >&5
+printf "%s\n" "$libc_cv_cxx_link_ok" >&6; }
+if test $libc_cv_cxx_link_ok != yes
+then :
   CXX=
 fi
 
@@ -3197,7 +4280,8 @@ config_vars=
 # Check for a --with-gd argument and set libgd-LDFLAGS in config.make.
 
 # Check whether --with-gd was given.
-if test "${with_gd+set}" = set; then :
+if test ${with_gd+y}
+then :
   withval=$with_gd; case "$with_gd" in
 yes|''|no) ;;
 *) libgd_include="-I$withval/include"
@@ -3208,7 +4292,8 @@ fi
 
 
 # Check whether --with-gd-include was given.
-if test "${with_gd_include+set}" = set; then :
+if test ${with_gd_include+y}
+then :
   withval=$with_gd_include; case "$with_gd_include" in
 ''|no) ;;
 *) libgd_include="-I$withval" ;;
@@ -3218,7 +4303,8 @@ fi
 
 
 # Check whether --with-gd-lib was given.
-if test "${with_gd_lib+set}" = set; then :
+if test ${with_gd_lib+y}
+then :
   withval=$with_gd_lib; case "$with_gd_lib" in
 ''|no) ;;
 *) libgd_ldflags="-L$withval" ;;
@@ -3238,26 +4324,29 @@ fi
 
 
 # Check whether --with-binutils was given.
-if test "${with_binutils+set}" = set; then :
+if test ${with_binutils+y}
+then :
   withval=$with_binutils; path_binutils=$withval
-else
+else $as_nop
   path_binutils=''
 fi
 
 
 # Check whether --with-selinux was given.
-if test "${with_selinux+set}" = set; then :
+if test ${with_selinux+y}
+then :
   withval=$with_selinux; with_selinux=$withval
-else
+else $as_nop
   with_selinux=auto
 fi
 
 
 
 # Check whether --with-headers was given.
-if test "${with_headers+set}" = set; then :
+if test ${with_headers+y}
+then :
   withval=$with_headers; sysheaders=$withval
-else
+else $as_nop
   sysheaders=''
 fi
 
@@ -3265,18 +4354,20 @@ fi
 
 
 # Check whether --with-nonshared-cflags was given.
-if test "${with_nonshared_cflags+set}" = set; then :
+if test ${with_nonshared_cflags+y}
+then :
   withval=$with_nonshared_cflags; extra_nonshared_cflags=$withval
-else
+else $as_nop
   extra_nonshared_cflags=
 fi
 
 
 
 # Check whether --with-rtld-early-cflags was given.
-if test "${with_rtld_early_cflags+set}" = set; then :
+if test ${with_rtld_early_cflags+y}
+then :
   withval=$with_rtld_early_cflags; rtld_early_cflags=$withval
-else
+else $as_nop
   rtld_early_cflags=
 fi
 
@@ -3284,93 +4375,101 @@ fi
 
 
 # Check whether --with-timeoutfactor was given.
-if test "${with_timeoutfactor+set}" = set; then :
+if test ${with_timeoutfactor+y}
+then :
   withval=$with_timeoutfactor; timeoutfactor=$withval
-else
+else $as_nop
   timeoutfactor=1
 fi
 
-cat >>confdefs.h <<_ACEOF
-#define TIMEOUTFACTOR $timeoutfactor
-_ACEOF
+printf "%s\n" "#define TIMEOUTFACTOR $timeoutfactor" >>confdefs.h
 
 
 # Check whether --enable-sanity-checks was given.
-if test "${enable_sanity_checks+set}" = set; then :
+if test ${enable_sanity_checks+y}
+then :
   enableval=$enable_sanity_checks; enable_sanity=$enableval
-else
+else $as_nop
   enable_sanity=yes
 fi
 
 
 # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
+if test ${enable_shared+y}
+then :
   enableval=$enable_shared; shared=$enableval
-else
+else $as_nop
   shared=yes
 fi
 
 # Check whether --enable-profile was given.
-if test "${enable_profile+set}" = set; then :
+if test ${enable_profile+y}
+then :
   enableval=$enable_profile; profile=$enableval
-else
+else $as_nop
   profile=no
 fi
 
 # Check whether --enable-default-pie was given.
-if test "${enable_default_pie+set}" = set; then :
+if test ${enable_default_pie+y}
+then :
   enableval=$enable_default_pie; default_pie=$enableval
-else
+else $as_nop
   default_pie=yes
 fi
 
 # Check whether --enable-timezone-tools was given.
-if test "${enable_timezone_tools+set}" = set; then :
+if test ${enable_timezone_tools+y}
+then :
   enableval=$enable_timezone_tools; enable_timezone_tools=$enableval
-else
+else $as_nop
   enable_timezone_tools=yes
 fi
 
 
 
 # Check whether --enable-hardcoded-path-in-tests was given.
-if test "${enable_hardcoded_path_in_tests+set}" = set; then :
+if test ${enable_hardcoded_path_in_tests+y}
+then :
   enableval=$enable_hardcoded_path_in_tests; hardcoded_path_in_tests=$enableval
-else
+else $as_nop
   hardcoded_path_in_tests=no
 fi
 
 
 
 # Check whether --enable-hidden-plt was given.
-if test "${enable_hidden_plt+set}" = set; then :
+if test ${enable_hidden_plt+y}
+then :
   enableval=$enable_hidden_plt; hidden=$enableval
-else
+else $as_nop
   hidden=yes
 fi
 
 if test "x$hidden" = xno; then
-  $as_echo "#define NO_HIDDEN 1" >>confdefs.h
+  printf "%s\n" "#define NO_HIDDEN 1" >>confdefs.h
 
 fi
 
 # Check whether --enable-bind-now was given.
-if test "${enable_bind_now+set}" = set; then :
+if test ${enable_bind_now+y}
+then :
   enableval=$enable_bind_now; bindnow=$enableval
-else
+else $as_nop
   bindnow=no
 fi
 
 
 if test "x$bindnow" = xyes; then
-  $as_echo "#define BIND_NOW 1" >>confdefs.h
+  printf "%s\n" "#define BIND_NOW 1" >>confdefs.h
 
 fi
 
 # Check whether --enable-stack-protector was given.
-if test "${enable_stack_protector+set}" = set; then :
+if test ${enable_stack_protector+y}
+then :
   enableval=$enable_stack_protector; enable_stack_protector=$enableval
-else
+else $as_nop
   enable_stack_protector=no
 fi
 
@@ -3380,37 +4479,41 @@ all|yes|no|strong) ;;
 esac
 
 # Check whether --enable-static-nss was given.
-if test "${enable_static_nss+set}" = set; then :
+if test ${enable_static_nss+y}
+then :
   enableval=$enable_static_nss; static_nss=$enableval
-else
+else $as_nop
   static_nss=no
 fi
 
 if test x"$static_nss" = xyes || test x"$shared" = xno; then
   static_nss=yes
-  $as_echo "#define DO_STATIC_NSS 1" >>confdefs.h
+  printf "%s\n" "#define DO_STATIC_NSS 1" >>confdefs.h
 
 fi
 
 # Check whether --enable-force-install was given.
-if test "${enable_force_install+set}" = set; then :
+if test ${enable_force_install+y}
+then :
   enableval=$enable_force_install; force_install=$enableval
-else
+else $as_nop
   force_install=yes
 fi
 
 
 
 # Check whether --enable-maintainer-mode was given.
-if test "${enable_maintainer_mode+set}" = set; then :
+if test ${enable_maintainer_mode+y}
+then :
   enableval=$enable_maintainer_mode; maintainer=$enableval
-else
+else $as_nop
   maintainer=no
 fi
 
 
 # Check whether --enable-kernel was given.
-if test "${enable_kernel+set}" = set; then :
+if test ${enable_kernel+y}
+then :
   enableval=$enable_kernel; minimum_kernel=$enableval
 fi
 
@@ -3424,33 +4527,37 @@ else
 fi
 
 # Check whether --enable-all-warnings was given.
-if test "${enable_all_warnings+set}" = set; then :
+if test ${enable_all_warnings+y}
+then :
   enableval=$enable_all_warnings; all_warnings=$enableval
 fi
 
 
 
 # Check whether --enable-werror was given.
-if test "${enable_werror+set}" = set; then :
+if test ${enable_werror+y}
+then :
   enableval=$enable_werror; enable_werror=$enableval
-else
+else $as_nop
   enable_werror=yes
 fi
 
 
 
 # Check whether --enable-multi-arch was given.
-if test "${enable_multi_arch+set}" = set; then :
+if test ${enable_multi_arch+y}
+then :
   enableval=$enable_multi_arch; multi_arch=$enableval
-else
+else $as_nop
   multi_arch=default
 fi
 
 
 # Check whether --enable-memory-tagging was given.
-if test "${enable_memory_tagging+set}" = set; then :
+if test ${enable_memory_tagging+y}
+then :
   enableval=$enable_memory_tagging; memory_tagging=$enableval
-else
+else $as_nop
   memory_tagging=no
 fi
 
@@ -3458,7 +4565,7 @@ if test "$memory_tagging" = yes; then
   # Only enable this on architectures that support it.
   case $host_cpu in
     aarch64)
-      $as_echo "#define USE_MTAG 1" >>confdefs.h
+      printf "%s\n" "#define USE_MTAG 1" >>confdefs.h
 
       ;;
   esac
@@ -3466,24 +4573,26 @@ fi
 
 
 # Check whether --enable-crypt was given.
-if test "${enable_crypt+set}" = set; then :
+if test ${enable_crypt+y}
+then :
   enableval=$enable_crypt; build_crypt=$enableval
-else
+else $as_nop
   build_crypt=yes
 fi
 
 
 
 # Check whether --enable-nss-crypt was given.
-if test "${enable_nss_crypt+set}" = set; then :
+if test ${enable_nss_crypt+y}
+then :
   enableval=$enable_nss_crypt; nss_crypt=$enableval
-else
+else $as_nop
   nss_crypt=no
 fi
 
 if test x$build_libcrypt = xno && test x$nss_crypt = xyes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-nss-crypt has no effect when libcrypt is disabled" >&5
-$as_echo "$as_me: WARNING: --enable-nss-crypt has no effect when libcrypt is disabled" >&2;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --enable-nss-crypt has no effect when libcrypt is disabled" >&5
+printf "%s\n" "$as_me: WARNING: --enable-nss-crypt has no effect when libcrypt is disabled" >&2;}
   nss_crypt=no
 fi
 if test x$nss_crypt = xyes; then
@@ -3505,20 +4614,21 @@ typedef int PRBool;
 #include <nsslowhash.h>
 void f (void) { NSSLOW_Init (); }
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   libc_cv_nss_crypt=yes
-else
+else $as_nop
   as_fn_error $? "
 cannot find NSS headers with lowlevel hash function interfaces" "$LINENO" 5
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   old_LIBS="$LIBS"
   old_LDFLAGS="$LDFLAGS"
   LIBS="$LIBS -lfreebl3"
@@ -3528,20 +4638,21 @@ typedef int PRBool;
 #include <hasht.h>
 #include <nsslowhash.h>
 int
-main ()
+main (void)
 {
 NSSLOW_Init();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   libc_cv_nss_crypt=yes
-else
+else $as_nop
   as_fn_error $? "
 cannot link program using lowlevel NSS hash functions" "$LINENO" 5
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
   # Check to see if there is a static NSS cryptographic library.
   # If there isn't then we can't link anything with libcrypt.a,
@@ -3553,19 +4664,20 @@ typedef int PRBool;
 #include <hasht.h>
 #include <nsslowhash.h>
 int
-main ()
+main (void)
 {
 NSSLOW_Init();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   libc_cv_static_nss_crypt=yes
-else
+else $as_nop
   libc_cv_static_nss_crypt=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
   LDFLAGS="$old_LDFLAGS"
   CFLAGS="$old_CFLAGS"
@@ -3579,18 +4691,20 @@ fi
 
 
 # Check whether --enable-systemtap was given.
-if test "${enable_systemtap+set}" = set; then :
+if test ${enable_systemtap+y}
+then :
   enableval=$enable_systemtap; systemtap=$enableval
-else
+else $as_nop
   systemtap=no
 fi
 
 if test "x$systemtap" != xno; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemtap static probe support" >&5
-$as_echo_n "checking for systemtap static probe support... " >&6; }
-if ${libc_cv_sdt+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for systemtap static probe support" >&5
+printf %s "checking for systemtap static probe support... " >&6; }
+if test ${libc_cv_sdt+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
     old_CFLAGS="$CFLAGS"
   CFLAGS="-std=gnu11 $CFLAGS"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3602,31 +4716,33 @@ void foo (int i, void *p)
        :: STAP_PROBE_ASM_OPERANDS (2, i, p));
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   libc_cv_sdt=yes
-else
+else $as_nop
   libc_cv_sdt=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   CFLAGS="$old_CFLAGS"
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_sdt" >&5
-$as_echo "$libc_cv_sdt" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_sdt" >&5
+printf "%s\n" "$libc_cv_sdt" >&6; }
   if test $libc_cv_sdt = yes; then
-    $as_echo "#define USE_STAP_PROBE 1" >>confdefs.h
+    printf "%s\n" "#define USE_STAP_PROBE 1" >>confdefs.h
 
   elif test "x$systemtap" != xauto; then
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "systemtap support needs sys/sdt.h with asm support
 See \`config.log' for more details" "$LINENO" 5; }
   fi
 fi
 
 # Check whether --enable-build-nscd was given.
-if test "${enable_build_nscd+set}" = set; then :
+if test ${enable_build_nscd+y}
+then :
   enableval=$enable_build_nscd; build_nscd=$enableval
-else
+else $as_nop
   build_nscd=default
 fi
 
@@ -3634,23 +4750,25 @@ fi
 
 # Note the use of $use_nscd is near the bottom of the file.
 # Check whether --enable-nscd was given.
-if test "${enable_nscd+set}" = set; then :
+if test ${enable_nscd+y}
+then :
   enableval=$enable_nscd; use_nscd=$enableval
-else
+else $as_nop
   use_nscd=yes
 fi
 
 
 # Check whether --enable-pt_chown was given.
-if test "${enable_pt_chown+set}" = set; then :
+if test ${enable_pt_chown+y}
+then :
   enableval=$enable_pt_chown; build_pt_chown=$enableval
-else
+else $as_nop
   build_pt_chown=no
 fi
 
 
 if test "$build_pt_chown" = yes; then
-  $as_echo "#define HAVE_PT_CHOWN 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_PT_CHOWN 1" >>confdefs.h
 
 fi
 
@@ -3667,9 +4785,10 @@ gnu*)
 esac
 
 # Check whether --enable-mathvec was given.
-if test "${enable_mathvec+set}" = set; then :
+if test ${enable_mathvec+y}
+then :
   enableval=$enable_mathvec; build_mathvec=$enableval
-else
+else $as_nop
   build_mathvec=notset
 fi
 
@@ -3679,7 +4798,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
 #ifndef __CET__
@@ -3689,34 +4808,51 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
   libc_cv_compiler_default_cet=yes
-else
+else $as_nop
   libc_cv_compiler_default_cet=no
 fi
 rm -f conftest.err conftest.i conftest.$ac_ext
 
 # Check whether --enable-cet was given.
-if test "${enable_cet+set}" = set; then :
+if test ${enable_cet+y}
+then :
   enableval=$enable_cet; enable_cet=$enableval
-else
+else $as_nop
   enable_cet=$libc_cv_compiler_default_cet
 fi
 
 
 # Check whether --enable-scv was given.
-if test "${enable_scv+set}" = set; then :
+if test ${enable_scv+y}
+then :
   enableval=$enable_scv; use_scv=$enableval
-else
+else $as_nop
   use_scv=yes
 fi
 
 
-if test "$use_scv" != "no"; then :
-  $as_echo "#define USE_PPC_SCV 1" >>confdefs.h
+if test "$use_scv" != "no"
+then :
+  printf "%s\n" "#define USE_PPC_SCV 1" >>confdefs.h
+
+fi
 
+# Check whether --enable-fortify-source was given.
+if test ${enable_fortify_source+y}
+then :
+  enableval=$enable_fortify_source; enable_fortify_source=$enableval
+else $as_nop
+  enable_fortify_source=no
 fi
 
+case "$enable_fortify_source" in
+1|2|3|no|yes) ;;
+*) as_fn_error $? "Not a valid argument for --enable-fortify-source: \"$enable_fortify_source\"" "$LINENO" 5;;
+esac
+
 # We keep the original values in `$config_*' and never modify them, so we
 # can write them unchanged into config.make.  Everything else uses
 # $machine, $vendor, and $os, and changes them whenever convenient.
@@ -3740,7 +4876,8 @@ base_os=''
 submachine=
 
 # Check whether --with-cpu was given.
-if test "${with_cpu+set}" = set; then :
+if test ${with_cpu+y}
+then :
   withval=$with_cpu;   case "$withval" in
   yes|'') as_fn_error $? "--with-cpu requires an argument" "$LINENO" 5 ;;
   no) ;;
@@ -3761,15 +4898,15 @@ with_fp_cond=1
 
 if frags=`ls -d $srcdir/sysdeps/*/preconfigure 2> /dev/null`
 then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysdeps preconfigure fragments" >&5
-$as_echo_n "checking for sysdeps preconfigure fragments... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysdeps preconfigure fragments" >&5
+printf %s "checking for sysdeps preconfigure fragments... " >&6; }
   for frag in $frags; do
     name=`echo "$frag" | sed 's@/[^/]*$@@;s@^.*/@@'`
     echo $ECHO_N "$name $ECHO_C" >&6
     . "$frag"
   done
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5
+printf "%s\n" "" >&6; }
 fi
 
 
@@ -3799,7 +4936,8 @@ test -n "$base_machine" || base_machine=$machine
 
 ### Locate tools.
 
-# Find a good install program.  We prefer a C program (faster),
+
+  # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
 # SysV /etc/install, /usr/sbin/install
@@ -3813,20 +4951,25 @@ test -n "$base_machine" || base_machine=$machine
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
 # Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
 if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+if test ${ac_cv_path_install+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+  ./ | /[cC]/* | \
   /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
   ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
   /usr/ucb/* ) ;;
@@ -3836,13 +4979,13 @@ case $as_dir/ in #((
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
 	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
 	    :
 	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # program-specific install script used by HP pwplus--don't use.
 	    :
 	  else
@@ -3850,12 +4993,12 @@ case $as_dir/ in #((
 	    echo one > conftest.one
 	    echo two > conftest.two
 	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	    if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
 	      test -s conftest.one && test -s conftest.two &&
 	      test -s conftest.dir/conftest.one &&
 	      test -s conftest.dir/conftest.two
 	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
 	      break 3
 	    fi
 	  fi
@@ -3871,7 +5014,7 @@ IFS=$as_save_IFS
 rm -rf conftest.one conftest.two conftest.dir
 
 fi
-  if test "${ac_cv_path_install+set}" = set; then
+  if test ${ac_cv_path_install+y}; then
     INSTALL=$ac_cv_path_install
   else
     # As a last resort, use the slow shell script.  Don't cache a
@@ -3881,8 +5024,8 @@ fi
     INSTALL=$ac_install_sh
   fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -3896,15 +5039,15 @@ if test "$INSTALL" = "${srcdir}/scripts/install-sh -c"; then
   # The makefiles need to use a different form to find it in $srcdir.
   INSTALL='\$(..)./scripts/install-sh -c'
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+printf %s "checking whether ln -s works... " >&6; }
 LN_S=$as_ln_s
 if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+printf "%s\n" "no, using $LN_S" >&6; }
 fi
 
 
@@ -3956,11 +5099,12 @@ case $($LD --version) in
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LD+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$LD"; then
   ac_cv_prog_LD="$LD" # Let the user override the test.
 else
@@ -3968,11 +5112,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_LD="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -3983,11 +5131,11 @@ fi
 fi
 LD=$ac_cv_prog_LD
 if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -3998,8 +5146,8 @@ if test -z "$LD"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $LD" >&5
-$as_echo_n "checking version of $LD... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $LD" >&5
+printf %s "checking version of $LD... " >&6; }
   ac_prog_version=`$LD --version 2>&1 | sed -n 's/^.*GNU gold.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4008,8 +5156,8 @@ $as_echo_n "checking version of $LD... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   LD=: critic_missing="$critic_missing GNU gold"
@@ -4022,11 +5170,12 @@ fi
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LD+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$LD"; then
   ac_cv_prog_LD="$LD" # Let the user override the test.
 else
@@ -4034,11 +5183,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_LD="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4049,11 +5202,11 @@ fi
 fi
 LD=$ac_cv_prog_LD
 if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4064,8 +5217,8 @@ if test -z "$LD"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $LD" >&5
-$as_echo_n "checking version of $LD... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $LD" >&5
+printf %s "checking version of $LD... " >&6; }
   ac_prog_version=`$LD --version 2>&1 | sed -n 's/^.*LLD.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4074,8 +5227,8 @@ $as_echo_n "checking version of $LD... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   LD=: critic_missing="$critic_missing LLD"
@@ -4088,11 +5241,12 @@ fi
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LD+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$LD"; then
   ac_cv_prog_LD="$LD" # Let the user override the test.
 else
@@ -4100,11 +5254,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_LD="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4115,11 +5273,11 @@ fi
 fi
 LD=$ac_cv_prog_LD
 if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4130,8 +5288,8 @@ if test -z "$LD"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $LD" >&5
-$as_echo_n "checking version of $LD... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $LD" >&5
+printf %s "checking version of $LD... " >&6; }
   ac_prog_version=`$LD --version 2>&1 | sed -n 's/^.*GNU ld.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4140,8 +5298,8 @@ $as_echo_n "checking version of $LD... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   LD=: critic_missing="$critic_missing GNU ld"
@@ -4157,11 +5315,12 @@ for ac_prog in gnumake gmake make
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MAKE+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MAKE+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$MAKE"; then
   ac_cv_prog_MAKE="$MAKE" # Let the user override the test.
 else
@@ -4169,11 +5328,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_MAKE="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4184,11 +5347,11 @@ fi
 fi
 MAKE=$ac_cv_prog_MAKE
 if test -n "$MAKE"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKE" >&5
-$as_echo "$MAKE" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAKE" >&5
+printf "%s\n" "$MAKE" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4199,8 +5362,8 @@ if test -z "$MAKE"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $MAKE" >&5
-$as_echo_n "checking version of $MAKE... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $MAKE" >&5
+printf %s "checking version of $MAKE... " >&6; }
   ac_prog_version=`$MAKE --version 2>&1 | sed -n 's/^.*GNU Make[^0-9]*\([0-9][0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4209,8 +5372,8 @@ $as_echo_n "checking version of $MAKE... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   critic_missing="$critic_missing make"
@@ -4221,11 +5384,12 @@ for ac_prog in gnumsgfmt gmsgfmt msgfmt
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MSGFMT+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MSGFMT+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$MSGFMT"; then
   ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test.
 else
@@ -4233,11 +5397,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_MSGFMT="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4248,11 +5416,11 @@ fi
 fi
 MSGFMT=$ac_cv_prog_MSGFMT
 if test -n "$MSGFMT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
-$as_echo "$MSGFMT" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+printf "%s\n" "$MSGFMT" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4263,8 +5431,8 @@ if test -z "$MSGFMT"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $MSGFMT" >&5
-$as_echo_n "checking version of $MSGFMT... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $MSGFMT" >&5
+printf %s "checking version of $MSGFMT... " >&6; }
   ac_prog_version=`$MSGFMT --version 2>&1 | sed -n 's/^.*GNU gettext.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4273,8 +5441,8 @@ $as_echo_n "checking version of $MSGFMT... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   MSGFMT=: aux_missing="$aux_missing msgfmt"
@@ -4284,11 +5452,12 @@ for ac_prog in makeinfo
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MAKEINFO+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MAKEINFO+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$MAKEINFO"; then
   ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
 else
@@ -4296,11 +5465,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_MAKEINFO="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4311,11 +5484,11 @@ fi
 fi
 MAKEINFO=$ac_cv_prog_MAKEINFO
 if test -n "$MAKEINFO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5
-$as_echo "$MAKEINFO" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5
+printf "%s\n" "$MAKEINFO" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4326,8 +5499,8 @@ if test -z "$MAKEINFO"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $MAKEINFO" >&5
-$as_echo_n "checking version of $MAKEINFO... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $MAKEINFO" >&5
+printf %s "checking version of $MAKEINFO... " >&6; }
   ac_prog_version=`$MAKEINFO --version 2>&1 | sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4336,8 +5509,8 @@ $as_echo_n "checking version of $MAKEINFO... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   MAKEINFO=: aux_missing="$aux_missing makeinfo"
@@ -4347,11 +5520,12 @@ for ac_prog in sed
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_SED+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_SED+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$SED"; then
   ac_cv_prog_SED="$SED" # Let the user override the test.
 else
@@ -4359,11 +5533,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_SED="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4374,11 +5552,11 @@ fi
 fi
 SED=$ac_cv_prog_SED
 if test -n "$SED"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5
-$as_echo "$SED" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SED" >&5
+printf "%s\n" "$SED" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4389,8 +5567,8 @@ if test -z "$SED"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $SED" >&5
-$as_echo_n "checking version of $SED... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $SED" >&5
+printf %s "checking version of $SED... " >&6; }
   ac_prog_version=`$SED --version 2>&1 | sed -n 's/^.*GNU sed[^0-9]* \([0-9]*\.[0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4399,8 +5577,8 @@ $as_echo_n "checking version of $SED... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   SED=: aux_missing="$aux_missing sed"
@@ -4410,11 +5588,12 @@ for ac_prog in gawk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AWK+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$AWK"; then
   ac_cv_prog_AWK="$AWK" # Let the user override the test.
 else
@@ -4422,11 +5601,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4437,11 +5620,11 @@ fi
 fi
 AWK=$ac_cv_prog_AWK
 if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4452,8 +5635,8 @@ if test -z "$AWK"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $AWK" >&5
-$as_echo_n "checking version of $AWK... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $AWK" >&5
+printf %s "checking version of $AWK... " >&6; }
   ac_prog_version=`$AWK --version 2>&1 | sed -n 's/^.*GNU Awk[^0-9]*\([0-9][0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4462,8 +5645,8 @@ $as_echo_n "checking version of $AWK... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   critic_missing="$critic_missing gawk"
@@ -4473,11 +5656,12 @@ for ac_prog in bison
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_BISON+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_BISON+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$BISON"; then
   ac_cv_prog_BISON="$BISON" # Let the user override the test.
 else
@@ -4485,11 +5669,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_BISON="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4500,11 +5688,11 @@ fi
 fi
 BISON=$ac_cv_prog_BISON
 if test -n "$BISON"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BISON" >&5
-$as_echo "$BISON" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BISON" >&5
+printf "%s\n" "$BISON" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4515,8 +5703,8 @@ if test -z "$BISON"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $BISON" >&5
-$as_echo_n "checking version of $BISON... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $BISON" >&5
+printf %s "checking version of $BISON... " >&6; }
   ac_prog_version=`$BISON --version 2>&1 | sed -n 's/^.*bison (GNU Bison) \([0-9]*\.[0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4525,25 +5713,26 @@ $as_echo_n "checking version of $BISON... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   critic_missing="$critic_missing bison"
 fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC is sufficient to build libc" >&5
-$as_echo_n "checking if $CC is sufficient to build libc... " >&6; }
-if ${libc_cv_compiler_ok+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC is sufficient to build libc" >&5
+printf %s "checking if $CC is sufficient to build libc... " >&6; }
+if test ${libc_cv_compiler_ok+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
 #if !defined __GNUC__ || __GNUC__ < 6 || (__GNUC__ == 6 && __GNUC_MINOR__ < 2)
@@ -4553,16 +5742,18 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
   libc_cv_compiler_ok=yes
-else
+else $as_nop
   libc_cv_compiler_ok=no
 fi
 rm -f conftest.err conftest.i conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_compiler_ok" >&5
-$as_echo "$libc_cv_compiler_ok" >&6; }
-if test $libc_cv_compiler_ok != yes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_compiler_ok" >&5
+printf "%s\n" "$libc_cv_compiler_ok" >&6; }
+if test $libc_cv_compiler_ok != yes
+then :
   critic_missing="$critic_missing compiler"
 fi
 
@@ -4571,11 +5762,12 @@ if test "x$maintainer" = "xyes"; then
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AUTOCONF+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AUTOCONF+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$AUTOCONF"; then
   ac_cv_prog_AUTOCONF="$AUTOCONF" # Let the user override the test.
 else
@@ -4583,11 +5775,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_AUTOCONF="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4598,11 +5794,11 @@ fi
 fi
 AUTOCONF=$ac_cv_prog_AUTOCONF
 if test -n "$AUTOCONF"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AUTOCONF" >&5
-$as_echo "$AUTOCONF" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AUTOCONF" >&5
+printf "%s\n" "$AUTOCONF" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4613,19 +5809,20 @@ test -n "$AUTOCONF" || AUTOCONF="no"
   case "x$AUTOCONF" in
   xno|x|x:) AUTOCONF=no ;;
   *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking   whether $AUTOCONF${ACFLAGS:+ }$ACFLAGS works" >&5
-$as_echo_n "checking   whether $AUTOCONF${ACFLAGS:+ }$ACFLAGS works... " >&6; }
-if ${libc_cv_autoconf_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking   whether $AUTOCONF${ACFLAGS:+ }$ACFLAGS works" >&5
+printf %s "checking   whether $AUTOCONF${ACFLAGS:+ }$ACFLAGS works... " >&6; }
+if test ${libc_cv_autoconf_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
       if (cd $srcdir; $AUTOCONF $ACFLAGS configure.ac > /dev/null 2>&1); then
       libc_cv_autoconf_works=yes
     else
       libc_cv_autoconf_works=no
     fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_autoconf_works" >&5
-$as_echo "$libc_cv_autoconf_works" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_autoconf_works" >&5
+printf "%s\n" "$libc_cv_autoconf_works" >&6; }
     test $libc_cv_autoconf_works = yes || AUTOCONF=no
     ;;
   esac
@@ -4641,11 +5838,12 @@ for ac_prog in python3 python
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PYTHON_PROG+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_PYTHON_PROG+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$PYTHON_PROG"; then
   ac_cv_prog_PYTHON_PROG="$PYTHON_PROG" # Let the user override the test.
 else
@@ -4653,11 +5851,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_PYTHON_PROG="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4668,11 +5870,11 @@ fi
 fi
 PYTHON_PROG=$ac_cv_prog_PYTHON_PROG
 if test -n "$PYTHON_PROG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_PROG" >&5
-$as_echo "$PYTHON_PROG" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON_PROG" >&5
+printf "%s\n" "$PYTHON_PROG" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4683,8 +5885,8 @@ if test -z "$PYTHON_PROG"; then
   ac_verc_fail=yes
 else
   # Found it, now check the version.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $PYTHON_PROG" >&5
-$as_echo_n "checking version of $PYTHON_PROG... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of $PYTHON_PROG" >&5
+printf %s "checking version of $PYTHON_PROG... " >&6; }
   ac_prog_version=`$PYTHON_PROG --version 2>&1 | sed -n 's/^.*Python \([0-9][0-9.]*\).*$/\1/p'`
   case $ac_prog_version in
     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -4693,8 +5895,8 @@ $as_echo_n "checking version of $PYTHON_PROG... " >&6; }
     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
 
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
-$as_echo "$ac_prog_version" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+printf "%s\n" "$ac_prog_version" >&6; }
 fi
 if test $ac_verc_fail = yes; then
   critic_missing="$critic_missing python"
@@ -4707,22 +5909,23 @@ test -n "$critic_missing" && as_fn_error $? "
 *** These critical programs are missing or too old:$critic_missing
 *** Check the INSTALL file for required versions." "$LINENO" 5
 
-test -n "$aux_missing" && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+test -n "$aux_missing" && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING:
 *** These auxiliary programs are missing or incompatible versions:$aux_missing
 *** some features or tests will be disabled.
 *** Check the INSTALL file for required versions." >&5
-$as_echo "$as_me: WARNING:
+printf "%s\n" "$as_me: WARNING:
 *** These auxiliary programs are missing or incompatible versions:$aux_missing
 *** some features or tests will be disabled.
 *** Check the INSTALL file for required versions." >&2;}
 
 
 # Determine whether to use fpu or nofpu sysdeps directories.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for use of fpu sysdeps directories" >&5
-$as_echo_n "checking for use of fpu sysdeps directories... " >&6; }
-if ${libc_cv_with_fp+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for use of fpu sysdeps directories" >&5
+printf %s "checking for use of fpu sysdeps directories... " >&6; }
+if test ${libc_cv_with_fp+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 #if $with_fp_cond
 int dummy;
@@ -4737,93 +5940,99 @@ if ${CC-cc} $CFLAGS $CPPFLAGS -S conftest.c -o conftest.s \
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_with_fp" >&5
-$as_echo "$libc_cv_with_fp" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_with_fp" >&5
+printf "%s\n" "$libc_cv_with_fp" >&6; }
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fstack-protector" >&5
-$as_echo_n "checking for -fstack-protector... " >&6; }
-if ${libc_cv_ssp+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -fstack-protector" >&5
+printf %s "checking for -fstack-protector... " >&6; }
+if test ${libc_cv_ssp+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Werror -fstack-protector -xc /dev/null -S -o /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
   libc_cv_ssp=yes
-else
+else $as_nop
   libc_cv_ssp=no
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ssp" >&5
-$as_echo "$libc_cv_ssp" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ssp" >&5
+printf "%s\n" "$libc_cv_ssp" >&6; }
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fstack-protector-strong" >&5
-$as_echo_n "checking for -fstack-protector-strong... " >&6; }
-if ${libc_cv_ssp_strong+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -fstack-protector-strong" >&5
+printf %s "checking for -fstack-protector-strong... " >&6; }
+if test ${libc_cv_ssp_strong+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Werror -fstack-protector-strong -xc /dev/null -S -o /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
   libc_cv_ssp_strong=yes
-else
+else $as_nop
   libc_cv_ssp_strong=no
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ssp_strong" >&5
-$as_echo "$libc_cv_ssp_strong" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ssp_strong" >&5
+printf "%s\n" "$libc_cv_ssp_strong" >&6; }
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fstack-protector-all" >&5
-$as_echo_n "checking for -fstack-protector-all... " >&6; }
-if ${libc_cv_ssp_all+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -fstack-protector-all" >&5
+printf %s "checking for -fstack-protector-all... " >&6; }
+if test ${libc_cv_ssp_all+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Werror -fstack-protector-all -xc /dev/null -S -o /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
   libc_cv_ssp_all=yes
-else
+else $as_nop
   libc_cv_ssp_all=no
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ssp_all" >&5
-$as_echo "$libc_cv_ssp_all" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ssp_all" >&5
+printf "%s\n" "$libc_cv_ssp_all" >&6; }
 
 stack_protector=
 no_stack_protector=
 if test "$libc_cv_ssp" = yes; then
   no_stack_protector="-fno-stack-protector -DSTACK_PROTECTOR_LEVEL=0"
-  $as_echo "#define HAVE_CC_NO_STACK_PROTECTOR 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_CC_NO_STACK_PROTECTOR 1" >>confdefs.h
 
 fi
 
 if test "$enable_stack_protector" = yes && test "$libc_cv_ssp" = yes; then
   stack_protector="-fstack-protector"
-  $as_echo "#define STACK_PROTECTOR_LEVEL 1" >>confdefs.h
+  printf "%s\n" "#define STACK_PROTECTOR_LEVEL 1" >>confdefs.h
 
 elif test "$enable_stack_protector" = all && test "$libc_cv_ssp_all" = yes; then
   stack_protector="-fstack-protector-all"
-  $as_echo "#define STACK_PROTECTOR_LEVEL 2" >>confdefs.h
+  printf "%s\n" "#define STACK_PROTECTOR_LEVEL 2" >>confdefs.h
 
 elif test "$enable_stack_protector" = strong && test "$libc_cv_ssp_strong" = yes; then
   stack_protector="-fstack-protector-strong"
-  $as_echo "#define STACK_PROTECTOR_LEVEL 3" >>confdefs.h
+  printf "%s\n" "#define STACK_PROTECTOR_LEVEL 3" >>confdefs.h
 
 else
   stack_protector="-fno-stack-protector"
-  $as_echo "#define STACK_PROTECTOR_LEVEL 0" >>confdefs.h
+  printf "%s\n" "#define STACK_PROTECTOR_LEVEL 0" >>confdefs.h
 
 fi
 
@@ -4841,11 +6050,12 @@ else
 fi
 
 # For the multi-arch option we need support in the assembler & linker.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler and linker STT_GNU_IFUNC support" >&5
-$as_echo_n "checking for assembler and linker STT_GNU_IFUNC support... " >&6; }
-if ${libc_cv_ld_gnu_indirect_function+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for assembler and linker STT_GNU_IFUNC support" >&5
+printf %s "checking for assembler and linker STT_GNU_IFUNC support... " >&6; }
+if test ${libc_cv_ld_gnu_indirect_function+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.S <<EOF
 .type foo,%gnu_indirect_function
 foo:
@@ -4872,15 +6082,16 @@ if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ld_gnu_indirect_function" >&5
-$as_echo "$libc_cv_ld_gnu_indirect_function" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ld_gnu_indirect_function" >&5
+printf "%s\n" "$libc_cv_ld_gnu_indirect_function" >&6; }
 
 # Check if gcc supports attribute ifunc as it is used in libc_ifunc macro.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc attribute ifunc support" >&5
-$as_echo_n "checking for gcc attribute ifunc support... " >&6; }
-if ${libc_cv_gcc_indirect_function+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gcc attribute ifunc support" >&5
+printf %s "checking for gcc attribute ifunc support... " >&6; }
+if test ${libc_cv_gcc_indirect_function+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 extern int func (int);
 int used_func (int a)
@@ -4902,16 +6113,17 @@ if ${CC-cc} -c conftest.c -o conftest.o 1>&5 \
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_indirect_function" >&5
-$as_echo "$libc_cv_gcc_indirect_function" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_indirect_function" >&5
+printf "%s\n" "$libc_cv_gcc_indirect_function" >&6; }
 
 # Check if linker supports textrel relocation with ifunc (used on elf/tests).
 # Note that it relies on libc_cv_ld_gnu_indirect_function test above.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker supports textrels along with ifunc" >&5
-$as_echo_n "checking whether the linker supports textrels along with ifunc... " >&6; }
-if ${libc_cv_textrel_ifunc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the linker supports textrels along with ifunc" >&5
+printf %s "checking whether the linker supports textrels along with ifunc... " >&6; }
+if test ${libc_cv_textrel_ifunc+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.S <<EOF
 .type foo,%gnu_indirect_function
 foo:
@@ -4940,23 +6152,24 @@ if test $libc_cv_ld_gnu_indirect_function = yes; then
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then
      libc_cv_textrel_ifunc=yes
    fi
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_textrel_ifunc" >&5
-$as_echo "$libc_cv_textrel_ifunc" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_textrel_ifunc" >&5
+printf "%s\n" "$libc_cv_textrel_ifunc" >&6; }
 
 
 # Check if CC supports attribute retain as it is used in attribute_used_retain macro.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU attribute retain support" >&5
-$as_echo_n "checking for GNU attribute retain support... " >&6; }
-if ${libc_cv_gnu_retain+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU attribute retain support" >&5
+printf %s "checking for GNU attribute retain support... " >&6; }
+if test ${libc_cv_gnu_retain+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 static int var  __attribute__ ((used, retain, section ("__libc_atexit")));
 EOF
@@ -4967,21 +6180,22 @@ if ${CC-cc} -Werror -c conftest.c -o /dev/null 1>&5 \
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gnu_retain" >&5
-$as_echo "$libc_cv_gnu_retain" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gnu_retain" >&5
+printf "%s\n" "$libc_cv_gnu_retain" >&6; }
 if test $libc_cv_gnu_retain = yes; then
-  $as_echo "#define HAVE_GNU_RETAIN 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_GNU_RETAIN 1" >>confdefs.h
 
 fi
 config_vars="$config_vars
 have-gnu-retain = $libc_cv_gnu_retain"
 
 # Check if gcc warns about alias for function with incompatible types.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler warns about alias for function with incompatible types" >&5
-$as_echo_n "checking if compiler warns about alias for function with incompatible types... " >&6; }
-if ${libc_cv_gcc_incompatible_alias+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler warns about alias for function with incompatible types" >&5
+printf %s "checking if compiler warns about alias for function with incompatible types... " >&6; }
+if test ${libc_cv_gcc_incompatible_alias+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 int __redirect_foo (const void *s, int c);
 
@@ -4999,8 +6213,8 @@ if ${CC-cc} -Werror -c conftest.c -o conftest.o 1>&5 2>&5 ; then
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_incompatible_alias" >&5
-$as_echo "$libc_cv_gcc_incompatible_alias" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_incompatible_alias" >&5
+printf "%s\n" "$libc_cv_gcc_incompatible_alias" >&6; }
 
 if test x"$libc_cv_ld_gnu_indirect_function" != xyes; then
   if test x"$multi_arch" = xyes; then
@@ -5014,18 +6228,18 @@ if test x"$libc_cv_gcc_indirect_function" != xyes; then
   # fail to build ifunc resolvers aliases to either weak or internal
   # symbols.  Disables multiarch build in this case.
   if test x"$libc_cv_gcc_incompatible_alias" = xyes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gcc emits a warning for alias between functions of incompatible types" >&5
-$as_echo "$as_me: WARNING: gcc emits a warning for alias between functions of incompatible types" >&2;}
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: gcc emits a warning for alias between functions of incompatible types" >&5
+printf "%s\n" "$as_me: WARNING: gcc emits a warning for alias between functions of incompatible types" >&2;}
     if test x"$multi_arch" = xyes; then
       as_fn_error $? "--enable-multi-arch support requires a gcc with gnu-indirect-function support" "$LINENO" 5
     fi
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Multi-arch is disabled." >&5
-$as_echo "$as_me: WARNING: Multi-arch is disabled." >&2;}
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Multi-arch is disabled." >&5
+printf "%s\n" "$as_me: WARNING: Multi-arch is disabled." >&2;}
     multi_arch=no
   elif test x"$multi_arch" = xyes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-multi-arch support recommends a gcc with gnu-indirect-function support.
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --enable-multi-arch support recommends a gcc with gnu-indirect-function support.
 Please use a gcc which supports it by default or configure gcc with --enable-gnu-indirect-function" >&5
-$as_echo "$as_me: WARNING: --enable-multi-arch support recommends a gcc with gnu-indirect-function support.
+printf "%s\n" "$as_me: WARNING: --enable-multi-arch support recommends a gcc with gnu-indirect-function support.
 Please use a gcc which supports it by default or configure gcc with --enable-gnu-indirect-function" >&2;}
   fi
 fi
@@ -5037,8 +6251,8 @@ fi
 # Compute the list of sysdep directories for this configuration.
 # This can take a while to compute.
 sysdep_dir=$srcdir/sysdeps
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sysdep dirs" >&5
-$as_echo_n "checking sysdep dirs... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking sysdep dirs" >&5
+printf %s "checking sysdep dirs... " >&6; }
 # Make sco3.2v4 become sco3.2.4 and sunos4.1.1_U1 become sunos4.1.1.U1.
 os="`echo $os | sed 's/\([0-9A-Z]\)[v_]\([0-9A-Z]\)/\1.\2/g'`"
 
@@ -5137,7 +6351,7 @@ case $sysnames in
   ;;
 esac
 if test x"$multi_arch" != xno; then
-  $as_echo "#define USE_MULTIARCH 1" >>confdefs.h
+  printf "%s\n" "#define USE_MULTIARCH 1" >>confdefs.h
 
 fi
 
@@ -5202,8 +6416,8 @@ while test $# -gt 0; do
 	  found=yes
 	fi
 	if test $found = no; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $name/$implies_file specifies nonexistent $x" >&5
-$as_echo "$as_me: WARNING: $name/$implies_file specifies nonexistent $x" >&2;}
+	  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $name/$implies_file specifies nonexistent $x" >&5
+printf "%s\n" "$as_me: WARNING: $name/$implies_file specifies nonexistent $x" >&2;}
 	fi
       done
     fi
@@ -5235,8 +6449,8 @@ default_sysnames="sysdeps/generic"
 sysnames="$names $default_sysnames"
 
 # The other names were emitted during the scan.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $default_sysnames" >&5
-$as_echo "$default_sysnames" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $default_sysnames" >&5
+printf "%s\n" "$default_sysnames" >&6; }
 
 # if using special system headers, find out the compiler's sekrit
 # header directory and add that to the list.  NOTE: Only does the right
@@ -5283,8 +6497,8 @@ fi
 # - one of the terminals (":" and ";") is the first or last sign
 # - two terminals occur directly after each other
 # - the path contains an element with a dot in it
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking LD_LIBRARY_PATH variable" >&5
-$as_echo_n "checking LD_LIBRARY_PATH variable... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking LD_LIBRARY_PATH variable" >&5
+printf %s "checking LD_LIBRARY_PATH variable... " >&6; }
 case ${LD_LIBRARY_PATH} in
   [:\;]* | *[:\;] | *[:\;][:\;]* |  *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
     ld_library_path_setting="contains current directory"
@@ -5293,8 +6507,8 @@ case ${LD_LIBRARY_PATH} in
     ld_library_path_setting="ok"
     ;;
 esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_library_path_setting" >&5
-$as_echo "$ld_library_path_setting" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_library_path_setting" >&5
+printf "%s\n" "$ld_library_path_setting" >&6; }
 if test "$ld_library_path_setting" != "ok"; then
 as_fn_error $? "
 *** LD_LIBRARY_PATH shouldn't contain the current directory when
@@ -5304,11 +6518,12 @@ fi
 
 # Extract the first word of "bash", so it can be a program name with args.
 set dummy bash; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_BASH_SHELL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_BASH_SHELL+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   case $BASH_SHELL in
   [\\/]* | ?:[\\/]*)
   ac_cv_path_BASH_SHELL="$BASH_SHELL" # Let the user override the test with a path.
@@ -5318,11 +6533,15 @@ else
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_BASH_SHELL="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_path_BASH_SHELL="$as_dir$ac_word$ac_exec_ext"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -5335,22 +6554,23 @@ esac
 fi
 BASH_SHELL=$ac_cv_path_BASH_SHELL
 if test -n "$BASH_SHELL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BASH_SHELL" >&5
-$as_echo "$BASH_SHELL" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BASH_SHELL" >&5
+printf "%s\n" "$BASH_SHELL" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
 
 # Extract the first word of "perl", so it can be a program name with args.
 set dummy perl; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PERL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PERL+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   case $PERL in
   [\\/]* | ?:[\\/]*)
   ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
@@ -5360,11 +6580,15 @@ else
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_path_PERL="$as_dir$ac_word$ac_exec_ext"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -5377,11 +6601,11 @@ esac
 fi
 PERL=$ac_cv_path_PERL
 if test -n "$PERL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
-$as_echo "$PERL" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+printf "%s\n" "$PERL" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -5391,11 +6615,12 @@ if test "$PERL" != no &&
 fi
 # Extract the first word of "install-info", so it can be a program name with args.
 set dummy install-info; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_INSTALL_INFO+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_INSTALL_INFO+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   case $INSTALL_INFO in
   [\\/]* | ?:[\\/]*)
   ac_cv_path_INSTALL_INFO="$INSTALL_INFO" # Let the user override the test with a path.
@@ -5406,11 +6631,15 @@ as_dummy="$PATH:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin"
 for as_dir in $as_dummy
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_INSTALL_INFO="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_path_INSTALL_INFO="$as_dir$ac_word$ac_exec_ext"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -5423,20 +6652,21 @@ esac
 fi
 INSTALL_INFO=$ac_cv_path_INSTALL_INFO
 if test -n "$INSTALL_INFO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL_INFO" >&5
-$as_echo "$INSTALL_INFO" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL_INFO" >&5
+printf "%s\n" "$INSTALL_INFO" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for .set assembler directive" >&5
-$as_echo_n "checking for .set assembler directive... " >&6; }
-if ${libc_cv_asm_set_directive+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for .set assembler directive" >&5
+printf %s "checking for .set assembler directive... " >&6; }
+if test ${libc_cv_asm_set_directive+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.s <<EOF
 .text
 foo:
@@ -5458,18 +6688,19 @@ else
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_set_directive" >&5
-$as_echo "$libc_cv_asm_set_directive" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_set_directive" >&5
+printf "%s\n" "$libc_cv_asm_set_directive" >&6; }
 if test $libc_cv_asm_set_directive = yes; then
-  $as_echo "#define HAVE_ASM_SET_DIRECTIVE 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_ASM_SET_DIRECTIVE 1" >>confdefs.h
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker support for protected data symbol" >&5
-$as_echo_n "checking linker support for protected data symbol... " >&6; }
-if ${libc_cv_protected_data+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking linker support for protected data symbol" >&5
+printf %s "checking linker support for protected data symbol... " >&6; }
+if test ${libc_cv_protected_data+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 		int bar __attribute__ ((visibility ("protected"))) = 1;
 EOF
@@ -5478,7 +6709,7 @@ EOF
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then
 		  cat > conftest.c <<EOF
 		  extern int bar;
@@ -5488,7 +6719,7 @@ EOF
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then
 		    libc_cv_protected_data=yes
 		  fi
@@ -5496,15 +6727,16 @@ EOF
 		rm -f conftest.*
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_protected_data" >&5
-$as_echo "$libc_cv_protected_data" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_protected_data" >&5
+printf "%s\n" "$libc_cv_protected_data" >&6; }
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker support for INSERT in linker script" >&5
-$as_echo_n "checking linker support for INSERT in linker script... " >&6; }
-if ${libc_cv_insert+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking linker support for INSERT in linker script" >&5
+printf %s "checking linker support for INSERT in linker script... " >&6; }
+if test ${libc_cv_insert+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 		int __attribute__ ((section(".bar"))) bar = 0x12345678;
 		int test (void) { return bar; }
@@ -5521,22 +6753,23 @@ EOF
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then
 		  libc_cv_insert=yes
 		fi
 		rm -f conftest.*
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_insert" >&5
-$as_echo "$libc_cv_insert" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_insert" >&5
+printf "%s\n" "$libc_cv_insert" >&6; }
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken __attribute__((alias()))" >&5
-$as_echo_n "checking for broken __attribute__((alias()))... " >&6; }
-if ${libc_cv_broken_alias_attribute+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for broken __attribute__((alias()))" >&5
+printf %s "checking for broken __attribute__((alias()))... " >&6; }
+if test ${libc_cv_broken_alias_attribute+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 	       extern int foo (int x) __asm ("xyzzy");
 	       int bar (int x) { return x; }
@@ -5550,7 +6783,7 @@ EOF
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then
 		 if grep 'xyzzy' conftest.s >/dev/null &&
 		    grep 'abccb' conftest.s >/dev/null; then
@@ -5560,17 +6793,18 @@ EOF
 	       rm -f conftest.c conftest.s
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_broken_alias_attribute" >&5
-$as_echo "$libc_cv_broken_alias_attribute" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_broken_alias_attribute" >&5
+printf "%s\n" "$libc_cv_broken_alias_attribute" >&6; }
 if test $libc_cv_broken_alias_attribute = yes; then
   as_fn_error $? "working alias attribute support required" "$LINENO" 5
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to put _rtld_local into .sdata section" >&5
-$as_echo_n "checking whether to put _rtld_local into .sdata section... " >&6; }
-if ${libc_cv_have_sdata_section+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to put _rtld_local into .sdata section" >&5
+printf %s "checking whether to put _rtld_local into .sdata section... " >&6; }
+if test ${libc_cv_have_sdata_section+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   echo "int i;" > conftest.c
 		libc_cv_have_sdata_section=no
 		if ${CC-cc} $LDFLAGS -fPIC -shared -Wl,--verbose conftest.c -o conftest.so 2>&1 \
@@ -5580,18 +6814,19 @@ else
 		rm -f conftest.c conftest.so
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_sdata_section" >&5
-$as_echo "$libc_cv_have_sdata_section" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_sdata_section" >&5
+printf "%s\n" "$libc_cv_have_sdata_section" >&6; }
 if test $libc_cv_have_sdata_section = yes; then
-  $as_echo "#define HAVE_SDATA_SECTION 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_SDATA_SECTION 1" >>confdefs.h
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libunwind-support in compiler" >&5
-$as_echo_n "checking for libunwind-support in compiler... " >&6; }
-if ${libc_cv_cc_with_libunwind+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libunwind-support in compiler" >&5
+printf %s "checking for libunwind-support in compiler... " >&6; }
+if test ${libc_cv_cc_with_libunwind+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
   cat > conftest.c <<EOF
 int main (void) { return 0; }
@@ -5604,20 +6839,21 @@ EOF
   fi
   rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_with_libunwind" >&5
-$as_echo "$libc_cv_cc_with_libunwind" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_with_libunwind" >&5
+printf "%s\n" "$libc_cv_cc_with_libunwind" >&6; }
 
 if test $libc_cv_cc_with_libunwind = yes; then
-  $as_echo "#define HAVE_CC_WITH_LIBUNWIND 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_CC_WITH_LIBUNWIND 1" >>confdefs.h
 
 fi
 
 ASFLAGS_config=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether --noexecstack is desirable for .S files" >&5
-$as_echo_n "checking whether --noexecstack is desirable for .S files... " >&6; }
-if ${libc_cv_as_noexecstack+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether --noexecstack is desirable for .S files" >&5
+printf %s "checking whether --noexecstack is desirable for .S files... " >&6; }
+if test ${libc_cv_as_noexecstack+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 void foo (void) { }
 EOF
@@ -5626,7 +6862,7 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; } \
    && grep .note.GNU-stack conftest.s >/dev/null \
    && { ac_try='${CC-cc} $ASFLAGS -Wa,--noexecstack
@@ -5634,7 +6870,7 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   libc_cv_as_noexecstack=yes
@@ -5643,15 +6879,15 @@ else
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_as_noexecstack" >&5
-$as_echo "$libc_cv_as_noexecstack" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_as_noexecstack" >&5
+printf "%s\n" "$libc_cv_as_noexecstack" >&6; }
 if test $libc_cv_as_noexecstack = yes; then
   ASFLAGS_config="$ASFLAGS_config -Wa,--noexecstack"
 fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z execstack" >&5
-$as_echo_n "checking for linker that supports -z execstack... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z execstack" >&5
+printf %s "checking for linker that supports -z execstack... " >&6; }
 libc_linker_feature=no
 cat > conftest.c <<EOF
 int _start (void) { return 42; }
@@ -5663,7 +6899,7 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,-z,execstack -nostdlib \
@@ -5680,12 +6916,12 @@ if test $libc_linker_feature = yes; then
 else
   libc_cv_z_execstack=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
-$as_echo "$libc_linker_feature" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
+printf "%s\n" "$libc_linker_feature" >&6; }
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z start-stop-gc" >&5
-$as_echo_n "checking for linker that supports -z start-stop-gc... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z start-stop-gc" >&5
+printf %s "checking for linker that supports -z start-stop-gc... " >&6; }
 libc_linker_feature=no
 cat > conftest.c <<EOF
 int _start (void) { return 42; }
@@ -5697,7 +6933,7 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,-z,start-stop-gc -nostdlib \
@@ -5714,13 +6950,13 @@ if test $libc_linker_feature = yes; then
 else
   libc_cv_z_start_stop_gc=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
-$as_echo "$libc_linker_feature" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
+printf "%s\n" "$libc_linker_feature" >&6; }
 config_vars="$config_vars
 have-z-start-stop-gc = $libc_cv_z_start_stop_gc"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports --depaudit" >&5
-$as_echo_n "checking for linker that supports --depaudit... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker that supports --depaudit" >&5
+printf %s "checking for linker that supports --depaudit... " >&6; }
 libc_linker_feature=no
 cat > conftest.c <<EOF
 int _start (void) { return 42; }
@@ -5732,7 +6968,7 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,--depaudit,x -nostdlib \
@@ -5749,13 +6985,13 @@ if test $libc_linker_feature = yes; then
 else
   libc_cv_depaudit=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
-$as_echo "$libc_linker_feature" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
+printf "%s\n" "$libc_linker_feature" >&6; }
 config_vars="$config_vars
 have-depaudit = $libc_cv_depaudit"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z pack-relative-relocs" >&5
-$as_echo_n "checking for linker that supports -z pack-relative-relocs... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z pack-relative-relocs" >&5
+printf %s "checking for linker that supports -z pack-relative-relocs... " >&6; }
 libc_linker_feature=no
 cat > conftest.c <<EOF
 int _start (void) { return 42; }
@@ -5767,7 +7003,7 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,-z,pack-relative-relocs -nostdlib \
@@ -5784,13 +7020,13 @@ if test $libc_linker_feature = yes; then
 else
   libc_cv_dt_relr=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
-$as_echo "$libc_linker_feature" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
+printf "%s\n" "$libc_linker_feature" >&6; }
 config_vars="$config_vars
 have-dt-relr = $libc_cv_dt_relr"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports --no-dynamic-linker" >&5
-$as_echo_n "checking for linker that supports --no-dynamic-linker... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker that supports --no-dynamic-linker" >&5
+printf %s "checking for linker that supports --no-dynamic-linker... " >&6; }
 libc_linker_feature=no
 cat > conftest.c <<EOF
 int _start (void) { return 42; }
@@ -5802,7 +7038,7 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,--no-dynamic-linker -nostdlib \
@@ -5819,60 +7055,65 @@ if test $libc_linker_feature = yes; then
 else
   libc_cv_no_dynamic_linker=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
-$as_echo "$libc_linker_feature" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
+printf "%s\n" "$libc_linker_feature" >&6; }
 config_vars="$config_vars
 have-no-dynamic-linker = $libc_cv_no_dynamic_linker"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -static-pie" >&5
-$as_echo_n "checking for -static-pie... " >&6; }
-if ${libc_cv_static_pie+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -static-pie" >&5
+printf %s "checking for -static-pie... " >&6; }
+if test ${libc_cv_static_pie+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if { ac_try='${CC-cc} -static-pie -xc /dev/null -S -o /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
   libc_cv_static_pie=yes
-else
+else $as_nop
   libc_cv_static_pie=no
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_static_pie" >&5
-$as_echo "$libc_cv_static_pie" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_static_pie" >&5
+printf "%s\n" "$libc_cv_static_pie" >&6; }
 config_vars="$config_vars
 have-static-pie = $libc_cv_static_pie"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fpie" >&5
-$as_echo_n "checking for -fpie... " >&6; }
-if ${libc_cv_fpie+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -fpie" >&5
+printf %s "checking for -fpie... " >&6; }
+if test ${libc_cv_fpie+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if { ac_try='${CC-cc} -fpie -xc /dev/null -S -o /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
   libc_cv_fpie=yes
-else
+else $as_nop
   libc_cv_fpie=no
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_fpie" >&5
-$as_echo "$libc_cv_fpie" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_fpie" >&5
+printf "%s\n" "$libc_cv_fpie" >&6; }
 
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLOB_DAT reloc" >&5
-$as_echo_n "checking for GLOB_DAT reloc... " >&6; }
-if ${libc_cv_has_glob_dat+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GLOB_DAT reloc" >&5
+printf %s "checking for GLOB_DAT reloc... " >&6; }
+if test ${libc_cv_has_glob_dat+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 extern int mumble;
 int foo (void) { return mumble; }
@@ -5884,7 +7125,7 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   if $READELF -rW conftest.so | grep '_GLOB_DAT' > /dev/null; then
@@ -5897,15 +7138,16 @@ else
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_has_glob_dat" >&5
-$as_echo "$libc_cv_has_glob_dat" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_has_glob_dat" >&5
+printf "%s\n" "$libc_cv_has_glob_dat" >&6; }
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -mtls-dialect=gnu2" >&5
-$as_echo_n "checking for -mtls-dialect=gnu2... " >&6; }
-if ${libc_cv_mtls_dialect_gnu2+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -mtls-dialect=gnu2" >&5
+printf %s "checking for -mtls-dialect=gnu2... " >&6; }
+if test ${libc_cv_mtls_dialect_gnu2+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 __thread int i;
 void foo (void)
@@ -5918,7 +7160,7 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fPIC -mtls-dialect=gnu2 -nostdlib -nost
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   libc_cv_mtls_dialect_gnu2=yes
@@ -5927,17 +7169,18 @@ else
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mtls_dialect_gnu2" >&5
-$as_echo "$libc_cv_mtls_dialect_gnu2" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mtls_dialect_gnu2" >&5
+printf "%s\n" "$libc_cv_mtls_dialect_gnu2" >&6; }
 
 config_vars="$config_vars
 have-mtls-dialect-gnu2 = $libc_cv_mtls_dialect_gnu2"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if -Wno-ignored-attributes is required for aliases" >&5
-$as_echo_n "checking if -Wno-ignored-attributes is required for aliases... " >&6; }
-if ${libc_cv_wno_ignored_attributes+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if -Wno-ignored-attributes is required for aliases" >&5
+printf %s "checking if -Wno-ignored-attributes is required for aliases... " >&6; }
+if test ${libc_cv_wno_ignored_attributes+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 void __foo (void)
 {
@@ -5950,23 +7193,24 @@ if ! { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Werror -c conftest.c'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   libc_cv_wno_ignored_attributes="-Wno-ignored-attributes"
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_wno_ignored_attributes" >&5
-$as_echo "$libc_cv_wno_ignored_attributes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_wno_ignored_attributes" >&5
+printf "%s\n" "$libc_cv_wno_ignored_attributes" >&6; }
 config_vars="$config_vars
 config-cflags-wno-ignored-attributes = $libc_cv_wno_ignored_attributes"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc puts quotes around section names" >&5
-$as_echo_n "checking whether cc puts quotes around section names... " >&6; }
-if ${libc_cv_have_section_quotes+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether cc puts quotes around section names" >&5
+printf %s "checking whether cc puts quotes around section names... " >&6; }
+if test ${libc_cv_have_section_quotes+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 		static const int foo
 		__attribute__ ((section ("bar"))) = 1;
@@ -5983,18 +7227,19 @@ EOF
 		rm -f conftest.{c,s}
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_section_quotes" >&5
-$as_echo "$libc_cv_have_section_quotes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_section_quotes" >&5
+printf "%s\n" "$libc_cv_have_section_quotes" >&6; }
 if test $libc_cv_have_section_quotes = yes; then
-  $as_echo "#define HAVE_SECTION_QUOTES 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_SECTION_QUOTES 1" >>confdefs.h
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_memset" >&5
-$as_echo_n "checking for __builtin_memset... " >&6; }
-if ${libc_cv_gcc_builtin_memset+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_memset" >&5
+printf %s "checking for __builtin_memset... " >&6; }
+if test ${libc_cv_gcc_builtin_memset+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<\EOF
 void zero (void *x)
 {
@@ -6005,7 +7250,7 @@ if { ac_try='${CC-cc} -O3 -S conftest.c -o - | grep -F "memset" > /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; };
 then
   libc_cv_gcc_builtin_memset=no
@@ -6014,18 +7259,19 @@ else
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_builtin_memset" >&5
-$as_echo "$libc_cv_gcc_builtin_memset" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_builtin_memset" >&5
+printf "%s\n" "$libc_cv_gcc_builtin_memset" >&6; }
 if test "$libc_cv_gcc_builtin_memset" = yes ; then
-  $as_echo "#define HAVE_BUILTIN_MEMSET 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_BUILTIN_MEMSET 1" >>confdefs.h
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for redirection of built-in functions" >&5
-$as_echo_n "checking for redirection of built-in functions... " >&6; }
-if ${libc_cv_gcc_builtin_redirection+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for redirection of built-in functions" >&5
+printf %s "checking for redirection of built-in functions... " >&6; }
+if test ${libc_cv_gcc_builtin_redirection+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<\EOF
 extern char *strstr (const char *, const char *) __asm ("my_strstr");
 char *foo (const char *a, const char *b)
@@ -6037,7 +7283,7 @@ if { ac_try='${CC-cc} -O3 -S conftest.c -o - | grep -F "my_strstr" > /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; };
 then
   libc_cv_gcc_builtin_redirection=yes
@@ -6046,90 +7292,97 @@ else
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_builtin_redirection" >&5
-$as_echo "$libc_cv_gcc_builtin_redirection" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_gcc_builtin_redirection" >&5
+printf "%s\n" "$libc_cv_gcc_builtin_redirection" >&6; }
 if test "$libc_cv_gcc_builtin_redirection" = no; then
   as_fn_error $? "support for the symbol redirection needed" "$LINENO" 5
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler option to disable generation of FMA instructions" >&5
-$as_echo_n "checking for compiler option to disable generation of FMA instructions... " >&6; }
-if ${libc_cv_cc_nofma+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option to disable generation of FMA instructions" >&5
+printf %s "checking for compiler option to disable generation of FMA instructions... " >&6; }
+if test ${libc_cv_cc_nofma+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   libc_cv_cc_nofma=
 for opt in -ffp-contract=off -mno-fused-madd; do
   if { ac_try='${CC-cc} $opt -xc /dev/null -S -o /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
   libc_cv_cc_nofma=$opt; break
 fi
 done
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_nofma" >&5
-$as_echo "$libc_cv_cc_nofma" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_nofma" >&5
+printf "%s\n" "$libc_cv_cc_nofma" >&6; }
 
 
 if test -n "$submachine"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler option for CPU variant" >&5
-$as_echo_n "checking for compiler option for CPU variant... " >&6; }
-if ${libc_cv_cc_submachine+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option for CPU variant" >&5
+printf %s "checking for compiler option for CPU variant... " >&6; }
+if test ${libc_cv_cc_submachine+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
     libc_cv_cc_submachine=no
   for opt in "-march=$submachine" "-mcpu=$submachine"; do
     if { ac_try='${CC-cc} $opt -xc /dev/null -S -o /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
 
       libc_cv_cc_submachine="$opt"
       break
 fi
   done
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_submachine" >&5
-$as_echo "$libc_cv_cc_submachine" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_submachine" >&5
+printf "%s\n" "$libc_cv_cc_submachine" >&6; }
   if test "x$libc_cv_cc_submachine" = xno; then
     as_fn_error $? "${CC-cc} does not support $submachine" "$LINENO" 5
   fi
 fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler option that -fsignaling-nans" >&5
-$as_echo_n "checking for compiler option that -fsignaling-nans... " >&6; }
-if ${libc_cv_cc_signaling_nans+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option that -fsignaling-nans" >&5
+printf %s "checking for compiler option that -fsignaling-nans... " >&6; }
+if test ${libc_cv_cc_signaling_nans+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if { ac_try='${CC-cc} -Werror -fsignaling-nans -xc /dev/null -S -o /dev/null'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
   libc_cv_cc_signaling_nans=-fsignaling-nans
-else
+else $as_nop
   libc_cv_cc_signaling_nans=
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_signaling_nans" >&5
-$as_echo "$libc_cv_cc_signaling_nans" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_signaling_nans" >&5
+printf "%s\n" "$libc_cv_cc_signaling_nans" >&6; }
 config_vars="$config_vars
 config-cflags-signaling-nans = $libc_cv_cc_signaling_nans"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fno-tree-loop-distribute-patterns with \
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fno-tree-loop-distribute-patterns with \
 __attribute__ ((__optimize__))" >&5
-$as_echo_n "checking if $CC accepts -fno-tree-loop-distribute-patterns with \
+printf %s "checking if $CC accepts -fno-tree-loop-distribute-patterns with \
 __attribute__ ((__optimize__))... " >&6; }
-if ${libc_cv_cc_loop_to_function+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+if test ${libc_cv_cc_loop_to_function+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat > conftest.c <<EOF
 void
 __attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns")))
@@ -6140,23 +7393,23 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }
 then
   libc_cv_cc_loop_to_function=yes
 fi
 rm -f conftest*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_loop_to_function" >&5
-$as_echo "$libc_cv_cc_loop_to_function" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_loop_to_function" >&5
+printf "%s\n" "$libc_cv_cc_loop_to_function" >&6; }
 if test $libc_cv_cc_loop_to_function = yes; then
-  $as_echo "#define HAVE_CC_INHIBIT_LOOP_TO_LIBCALL 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_CC_INHIBIT_LOOP_TO_LIBCALL 1" >>confdefs.h
 
 fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgd" >&5
-$as_echo_n "checking for libgd... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libgd" >&5
+printf %s "checking for libgd... " >&6; }
 if test "$with_gd" != "no"; then
   old_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS $libgd_include"
@@ -6168,19 +7421,20 @@ if test "$with_gd" != "no"; then
 /* end confdefs.h.  */
 #include <gd.h>
 int
-main ()
+main (void)
 {
 gdImagePng (0, 0)
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   LIBGD=yes
-else
+else $as_nop
   LIBGD=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
   CFLAGS="$old_CFLAGS"
   LDFLAGS="$old_LDFLAGS"
@@ -6188,8 +7442,8 @@ rm -f core conftest.err conftest.$ac_objext \
 else
   LIBGD=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGD" >&5
-$as_echo "$LIBGD" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBGD" >&5
+printf "%s\n" "$LIBGD" >&6; }
 
 
 # SELinux detection
@@ -6197,11 +7451,12 @@ if test x$with_selinux = xno ; then
   have_selinux=no;
 else
   # See if we have the SELinux library
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for is_selinux_enabled in -lselinux" >&5
-$as_echo_n "checking for is_selinux_enabled in -lselinux... " >&6; }
-if ${ac_cv_lib_selinux_is_selinux_enabled+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for is_selinux_enabled in -lselinux" >&5
+printf %s "checking for is_selinux_enabled in -lselinux... " >&6; }
+if test ${ac_cv_lib_selinux_is_selinux_enabled+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lselinux  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -6210,32 +7465,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* Override any GCC internal prototype to avoid an error.
    Use char because int might match the return type of a GCC
    builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
 char is_selinux_enabled ();
 int
-main ()
+main (void)
 {
 return is_selinux_enabled ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   ac_cv_lib_selinux_is_selinux_enabled=yes
-else
+else $as_nop
   ac_cv_lib_selinux_is_selinux_enabled=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_selinux_is_selinux_enabled" >&5
-$as_echo "$ac_cv_lib_selinux_is_selinux_enabled" >&6; }
-if test "x$ac_cv_lib_selinux_is_selinux_enabled" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_selinux_is_selinux_enabled" >&5
+printf "%s\n" "$ac_cv_lib_selinux_is_selinux_enabled" >&6; }
+if test "x$ac_cv_lib_selinux_is_selinux_enabled" = xyes
+then :
   have_selinux=yes
-else
+else $as_nop
   have_selinux=no
 fi
 
@@ -6248,15 +7502,16 @@ fi
 # Check if we're building with SELinux support.
 if test "x$have_selinux" = xyes; then
 
-$as_echo "#define HAVE_SELINUX 1" >>confdefs.h
+printf "%s\n" "#define HAVE_SELINUX 1" >>confdefs.h
 
 
   # See if we have the libaudit library
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for audit_log_user_avc_message in -laudit" >&5
-$as_echo_n "checking for audit_log_user_avc_message in -laudit... " >&6; }
-if ${ac_cv_lib_audit_audit_log_user_avc_message+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for audit_log_user_avc_message in -laudit" >&5
+printf %s "checking for audit_log_user_avc_message in -laudit... " >&6; }
+if test ${ac_cv_lib_audit_audit_log_user_avc_message+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-laudit  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -6265,48 +7520,48 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* Override any GCC internal prototype to avoid an error.
    Use char because int might match the return type of a GCC
    builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
 char audit_log_user_avc_message ();
 int
-main ()
+main (void)
 {
 return audit_log_user_avc_message ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   ac_cv_lib_audit_audit_log_user_avc_message=yes
-else
+else $as_nop
   ac_cv_lib_audit_audit_log_user_avc_message=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_audit_audit_log_user_avc_message" >&5
-$as_echo "$ac_cv_lib_audit_audit_log_user_avc_message" >&6; }
-if test "x$ac_cv_lib_audit_audit_log_user_avc_message" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_audit_audit_log_user_avc_message" >&5
+printf "%s\n" "$ac_cv_lib_audit_audit_log_user_avc_message" >&6; }
+if test "x$ac_cv_lib_audit_audit_log_user_avc_message" = xyes
+then :
   have_libaudit=yes
-else
+else $as_nop
   have_libaudit=no
 fi
 
   if test "x$have_libaudit" = xyes; then
 
-$as_echo "#define HAVE_LIBAUDIT 1" >>confdefs.h
+printf "%s\n" "#define HAVE_LIBAUDIT 1" >>confdefs.h
 
   fi
 
 
   # See if we have the libcap library
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cap_init in -lcap" >&5
-$as_echo_n "checking for cap_init in -lcap... " >&6; }
-if ${ac_cv_lib_cap_cap_init+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cap_init in -lcap" >&5
+printf %s "checking for cap_init in -lcap... " >&6; }
+if test ${ac_cv_lib_cap_cap_init+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lcap  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -6315,83 +7570,116 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* Override any GCC internal prototype to avoid an error.
    Use char because int might match the return type of a GCC
    builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
 char cap_init ();
 int
-main ()
+main (void)
 {
 return cap_init ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   ac_cv_lib_cap_cap_init=yes
-else
+else $as_nop
   ac_cv_lib_cap_cap_init=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cap_cap_init" >&5
-$as_echo "$ac_cv_lib_cap_cap_init" >&6; }
-if test "x$ac_cv_lib_cap_cap_init" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cap_cap_init" >&5
+printf "%s\n" "$ac_cv_lib_cap_cap_init" >&6; }
+if test "x$ac_cv_lib_cap_cap_init" = xyes
+then :
   have_libcap=yes
-else
+else $as_nop
   have_libcap=no
 fi
 
   if test "x$have_libcap" = xyes; then
 
-$as_echo "#define HAVE_LIBCAP 1" >>confdefs.h
+printf "%s\n" "#define HAVE_LIBCAP 1" >>confdefs.h
 
   fi
 
 fi
 
 
-CPPUNDEFS=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FORTIFY_SOURCE predefine" >&5
-$as_echo_n "checking for _FORTIFY_SOURCE predefine... " >&6; }
-if ${libc_cv_predef_fortify_source+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+fortify_source=""
+no_fortify_source="-Wp,-U_FORTIFY_SOURCE"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_dynamic_object_size" >&5
+printf %s "checking for __builtin_dynamic_object_size... " >&6; }
+if test ${libc_cv___builtin_dynamic_object_size+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
-
-#ifdef _FORTIFY_SOURCE
-# error bogon
-#endif
+__builtin_dynamic_object_size("", 0)
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libc_cv_predef_fortify_source=no
-else
-  libc_cv_predef_fortify_source=yes
+if ac_fn_c_try_link "$LINENO"
+then :
+  libc_cv___builtin_dynamic_object_size=yes
+         if test "$enable_fortify_source" = yes
+then :
+  enable_fortify_source=3
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else $as_nop
+  libc_cv___builtin_dynamic_object_size=no
+         if test "$enable_fortify_source" = yes
+then :
+  enable_fortify_source=2
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_predef_fortify_source" >&5
-$as_echo "$libc_cv_predef_fortify_source" >&6; }
-if test $libc_cv_predef_fortify_source = yes; then
-  CPPUNDEFS="${CPPUNDEFS:+$CPPUNDEFS }-U_FORTIFY_SOURCE"
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
 
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv___builtin_dynamic_object_size" >&5
+printf "%s\n" "$libc_cv___builtin_dynamic_object_size" >&6; }
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the assembler requires one version per symbol" >&5
-$as_echo_n "checking whether the assembler requires one version per symbol... " >&6; }
-if ${libc_cv_symver_needs_alias+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+case $enable_fortify_source in #(
+  1|2) :
+    libc_cv_fortify_source=yes ;; #(
+  3) :
+    if test "$libc_cv___builtin_dynamic_object_size" = yes
+then :
+  libc_cv_fortify_source=yes
+else $as_nop
+  as_fn_error $? "Compiler doesn't provide necessary support for _FORTIFY_SOURCE=3" "$LINENO" 5
+fi ;; #(
+  *) :
+    libc_cv_fortify_source=no ;;
+esac
+
+if test "$libc_cv_fortify_source" = yes
+then :
+  fortify_source="${no_fortify_source},-D_FORTIFY_SOURCE=${enable_fortify_source}"
+
+fi
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the assembler requires one version per symbol" >&5
+printf %s "checking whether the assembler requires one version per symbol... " >&6; }
+if test ${libc_cv_symver_needs_alias+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
     cat > conftest.s <<EOF
         .text
 testfunc:
@@ -6408,31 +7696,33 @@ EOF
   rm conftest.*
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_symver_needs_alias" >&5
-$as_echo "$libc_cv_symver_needs_alias" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_symver_needs_alias" >&5
+printf "%s\n" "$libc_cv_symver_needs_alias" >&6; }
 if test "$libc_cv_symver_needs_alias" = yes; then
-  $as_echo "#define SYMVER_NEEDS_ALIAS 1" >>confdefs.h
+  printf "%s\n" "#define SYMVER_NEEDS_ALIAS 1" >>confdefs.h
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_trap with no external dependencies" >&5
-$as_echo_n "checking for __builtin_trap with no external dependencies... " >&6; }
-if ${libc_cv_builtin_trap+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_trap with no external dependencies" >&5
+printf %s "checking for __builtin_trap with no external dependencies... " >&6; }
+if test ${libc_cv_builtin_trap+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   libc_cv_builtin_trap=no
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 __builtin_trap ()
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
 
 libc_undefs=`$NM -u conftest.o |
   LC_ALL=C $AWK '$1 == "U" { print $2 | "sort -u"; next } { exit(1) }' \
@@ -6444,12 +7734,12 @@ if test -z "$libc_undefs"; then
   libc_cv_builtin_trap=yes
 fi
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_builtin_trap" >&5
-$as_echo "$libc_cv_builtin_trap" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_builtin_trap" >&5
+printf "%s\n" "$libc_cv_builtin_trap" >&6; }
 if test $libc_cv_builtin_trap = yes; then
-  $as_echo "#define HAVE_BUILTIN_TRAP 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_BUILTIN_TRAP 1" >>confdefs.h
 
 fi
 
@@ -6460,11 +7750,12 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler supports thread_local" >&5
-$as_echo_n "checking whether the C++ compiler supports thread_local... " >&6; }
-if ${libc_cv_cxx_thread_local+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler supports thread_local" >&5
+printf %s "checking whether the C++ compiler supports thread_local... " >&6; }
+if test ${libc_cv_cxx_thread_local+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
 old_CXXFLAGS="$CXXFLAGS"
 CXXFLAGS="$CXXFLAGS -std=gnu++11"
@@ -6488,17 +7779,18 @@ S * get () { return &s; }
 #endif
 
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
   libc_cv_cxx_thread_local=yes
-else
+else $as_nop
   libc_cv_cxx_thread_local=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 CXXFLAGS="$old_CXXFLAGS"
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cxx_thread_local" >&5
-$as_echo "$libc_cv_cxx_thread_local" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cxx_thread_local" >&5
+printf "%s\n" "$libc_cv_cxx_thread_local" >&6; }
 
 
 ac_ext=c
@@ -6528,8 +7820,8 @@ for dir in $sysnames; do
     *)  dest=$srcdir/$dir ;;
   esac
   if test -r $dest/configure; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: running configure fragment for $dir" >&5
-$as_echo "running configure fragment for $dir" >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: running configure fragment for $dir" >&5
+printf "%s\n" "running configure fragment for $dir" >&6; }
     . $dest/configure
   fi
 done
@@ -6544,7 +7836,7 @@ build-mathvec = $build_mathvec"
 
 
 if test x$libc_cv_gcc_unwind_find_fde = xyes; then
-  $as_echo "#define EXPORT_UNWIND_FIND_FDE 1" >>confdefs.h
+  printf "%s\n" "#define EXPORT_UNWIND_FIND_FDE 1" >>confdefs.h
 
 fi
 
@@ -6552,14 +7844,14 @@ fi
 # A sysdeps configure fragment can reset this if IFUNC is not actually
 # usable even though the assembler knows how to generate the symbol type.
 if test x"$libc_cv_ld_gnu_indirect_function" = xyes; then
-  $as_echo "#define HAVE_IFUNC 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_IFUNC 1" >>confdefs.h
 
 fi
 config_vars="$config_vars
 have-ifunc = $libc_cv_ld_gnu_indirect_function"
 
 if test x"$libc_cv_gcc_indirect_function" = xyes; then
-  $as_echo "#define HAVE_GCC_IFUNC 1" >>confdefs.h
+  printf "%s\n" "#define HAVE_GCC_IFUNC 1" >>confdefs.h
 
 fi
 config_vars="$config_vars
@@ -6569,7 +7861,7 @@ have-gcc-ifunc = $libc_cv_gcc_indirect_function"
 # configure fragment can override the value to prevent this AC_DEFINE.
 
 if test "x$use_nscd" != xno; then
-  $as_echo "#define USE_NSCD 1" >>confdefs.h
+  printf "%s\n" "#define USE_NSCD 1" >>confdefs.h
 
 fi
 if test "x$build_nscd" = xdefault; then
@@ -6584,7 +7876,7 @@ fi
 
 
 if test x$use_ldconfig = xyes; then
-  $as_echo "#define USE_LDCONFIG 1" >>confdefs.h
+  printf "%s\n" "#define USE_LDCONFIG 1" >>confdefs.h
 
 fi
 
@@ -6593,11 +7885,12 @@ fi
 
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -fPIC is default" >&5
-$as_echo_n "checking whether -fPIC is default... " >&6; }
-if ${libc_cv_pic_default+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -fPIC is default" >&5
+printf %s "checking whether -fPIC is default... " >&6; }
+if test ${libc_cv_pic_default+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   libc_cv_pic_default=yes
 cat > conftest.c <<EOF
 #if defined __PIC__ || defined __pic__ || defined PIC || defined pic
@@ -6609,16 +7902,17 @@ if eval "${CC-cc} -S conftest.c 2>&5 1>&5"; then
 fi
 rm -f conftest.*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_pic_default" >&5
-$as_echo "$libc_cv_pic_default" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_pic_default" >&5
+printf "%s\n" "$libc_cv_pic_default" >&6; }
 config_vars="$config_vars
 build-pic-default = $libc_cv_pic_default"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -fPIE is default" >&5
-$as_echo_n "checking whether -fPIE is default... " >&6; }
-if ${libc_cv_cc_pie_default+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -fPIE is default" >&5
+printf %s "checking whether -fPIE is default... " >&6; }
+if test ${libc_cv_cc_pie_default+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   libc_cv_cc_pie_default=yes
 cat > conftest.c <<EOF
 #if defined __PIE__ || defined __pie__ || defined PIE || defined pie
@@ -6630,27 +7924,28 @@ if eval "${CC-cc} -S conftest.c 2>&5 1>&5"; then
 fi
 rm -f conftest.*
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_pie_default" >&5
-$as_echo "$libc_cv_cc_pie_default" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_pie_default" >&5
+printf "%s\n" "$libc_cv_cc_pie_default" >&6; }
 config_vars="$config_vars
 cc-pie-default = $libc_cv_cc_pie_default"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can build programs as PIE" >&5
-$as_echo_n "checking if we can build programs as PIE... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can build programs as PIE" >&5
+printf %s "checking if we can build programs as PIE... " >&6; }
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #ifdef PIE_UNSUPPORTED
 # error PIE is not supported
 #endif
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   libc_cv_pie_supported=yes
-else
+else $as_nop
   libc_cv_pie_supported=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_pie_supported" >&5
-$as_echo "$libc_cv_pie_supported" >&6; }
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_pie_supported" >&5
+printf "%s\n" "$libc_cv_pie_supported" >&6; }
 # Disable build-pie-default if target does not support it or glibc is
 # configured with --disable-default-pie.
 if test "x$default_pie" = xno; then
@@ -6661,8 +7956,8 @@ fi
 config_vars="$config_vars
 build-pie-default = $build_pie_default"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can build static PIE programs" >&5
-$as_echo_n "checking if we can build static PIE programs... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can build static PIE programs" >&5
+printf %s "checking if we can build static PIE programs... " >&6; }
 libc_cv_static_pie_supported=$libc_cv_pie_supported
 if test "x$libc_cv_pie_supported" != xno \
    -a "$libc_cv_no_dynamic_linker" = yes; then
@@ -6672,15 +7967,16 @@ if test "x$libc_cv_pie_supported" != xno \
 # error static PIE is not supported
 #endif
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   libc_cv_static_pie_supported=yes
-else
+else $as_nop
   libc_cv_static_pie_supported=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_static_pie_supported" >&5
-$as_echo "$libc_cv_static_pie_supported" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_static_pie_supported" >&5
+printf "%s\n" "$libc_cv_static_pie_supported" >&6; }
 
 # Enable static-pie only if it is available and glibc isn't configured
 # with --disable-default-pie.
@@ -6690,7 +7986,7 @@ else
   libc_cv_static_pie=$libc_cv_static_pie_supported
 fi
 if test "$libc_cv_static_pie" = "yes"; then
-  $as_echo "#define ENABLE_STATIC_PIE 1" >>confdefs.h
+  printf "%s\n" "#define ENABLE_STATIC_PIE 1" >>confdefs.h
 
 fi
 config_vars="$config_vars
@@ -6714,7 +8010,7 @@ RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h`
 
 
 if test "$pthread_in_libc" = yes; then
-  $as_echo "#define PTHREAD_IN_LIBC 1" >>confdefs.h
+  printf "%s\n" "#define PTHREAD_IN_LIBC 1" >>confdefs.h
 
 fi
 
@@ -6750,8 +8046,8 @@ _ACEOF
     case $ac_val in #(
     *${as_nl}*)
       case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       esac
       case $ac_var in #(
       _ | IFS | as_nl) ;; #(
@@ -6781,15 +8077,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      /^ac_cv_env_/b end
      t clear
      :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
      t end
      s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
      :end' >>confcache
 if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
   if test -w "$cache_file"; then
     if test "x$cache_file" != "x/dev/null"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
       if test ! -f "$cache_file" || test -h "$cache_file"; then
 	cat confcache >"$cache_file"
       else
@@ -6803,8 +8099,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
       fi
     fi
   else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
   fi
 fi
 rm -f confcache
@@ -6821,7 +8117,7 @@ U=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
   ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
   # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
   #    will be set to the directory where LIBOBJS objects are built.
   as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -6837,8 +8133,8 @@ LTLIBOBJS=$ac_ltlibobjs
 ac_write_fail=0
 ac_clean_files_save=$ac_clean_files
 ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
 as_write_fail=0
 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
 #! $SHELL
@@ -6861,14 +8157,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
 
 # Be more Bourne compatible
 DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
   emulate sh
   NULLCMD=:
   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
-else
+else $as_nop
   case `(set -o) 2>/dev/null` in #(
   *posix*) :
     set -o posix ;; #(
@@ -6878,46 +8176,46 @@ esac
 fi
 
 
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
 as_nl='
 '
 export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" ""	$as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2)            ; then :; else exec 2>/dev/null; fi
 
 # The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
   PATH_SEPARATOR=:
   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -6926,13 +8224,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
 fi
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
 # Find who we are.  Look in the path if we contain no directory separator.
 as_myself=
 case $0 in #((
@@ -6941,8 +8232,12 @@ case $0 in #((
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    test -r "$as_dir$0" && as_myself=$as_dir$0 && break
   done
 IFS=$as_save_IFS
 
@@ -6954,30 +8249,10 @@ if test "x$as_myself" = x; then
   as_myself=$0
 fi
 if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
   exit 1
 fi
 
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 
 # as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -6990,13 +8265,14 @@ as_fn_error ()
   as_status=$1; test $as_status -eq 0 && as_status=1
   if test "$4"; then
     as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
   fi
-  $as_echo "$as_me: error: $2" >&2
+  printf "%s\n" "$as_me: error: $2" >&2
   as_fn_exit $as_status
 } # as_fn_error
 
 
+
 # as_fn_set_status STATUS
 # -----------------------
 # Set $? to STATUS, without forking.
@@ -7023,18 +8299,20 @@ as_fn_unset ()
   { eval $1=; unset $1;}
 }
 as_unset=as_fn_unset
+
 # as_fn_append VAR VALUE
 # ----------------------
 # Append the text in VALUE to the end of the definition contained in VAR. Take
 # advantage of any shell optimizations that allow amortized linear growth over
 # repeated appends, instead of the typical quadratic growth present in naive
 # implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
   eval 'as_fn_append ()
   {
     eval $1+=\$2
   }'
-else
+else $as_nop
   as_fn_append ()
   {
     eval $1=\$$1\$2
@@ -7046,12 +8324,13 @@ fi # as_fn_append
 # Perform arithmetic evaluation on the ARGs, and store the result in the
 # global $as_val. Take advantage of shells that can avoid forks. The arguments
 # must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
   eval 'as_fn_arith ()
   {
     as_val=$(( $* ))
   }'
-else
+else $as_nop
   as_fn_arith ()
   {
     as_val=`expr "$@" || test $? -eq 1`
@@ -7082,7 +8361,7 @@ as_me=`$as_basename -- "$0" ||
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
     sed '/^.*\/\([^/][^/]*\)\/*$/{
 	    s//\1/
 	    q
@@ -7104,6 +8383,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
 as_cr_digits='0123456789'
 as_cr_alnum=$as_cr_Letters$as_cr_digits
 
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
 ECHO_C= ECHO_N= ECHO_T=
 case `echo -n x` in #(((((
 -n*)
@@ -7117,6 +8400,12 @@ case `echo -n x` in #(((((
   ECHO_N='-n';;
 esac
 
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n.  New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
 rm -f conf$$ conf$$.exe conf$$.file
 if test -d conf$$.dir; then
   rm -f conf$$.dir/conf$$.file
@@ -7158,7 +8447,7 @@ as_fn_mkdir_p ()
     as_dirs=
     while :; do
       case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
       *) as_qdir=$as_dir;;
       esac
       as_dirs="'$as_qdir' $as_dirs"
@@ -7167,7 +8456,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
 	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -7230,7 +8519,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # values after options handling.
 ac_log="
 This file was extended by GNU C Library $as_me (see version.h), which was
-generated by GNU Autoconf 2.69.  Invocation command line was
+generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -7291,17 +8580,19 @@ $config_commands
 
 Report bugs to <https://sourceware.org/bugzilla/>.
 GNU C Library home page: <https://www.gnu.org/software/glibc/>.
-General help using GNU software: <http://www.gnu.org/gethelp/>."
+General help using GNU software: <https://www.gnu.org/gethelp/>."
 
 _ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
 GNU C Library config.status (see version.h)
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -7339,15 +8630,15 @@ do
   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
     ac_cs_recheck=: ;;
   --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
+    printf "%s\n" "$ac_cs_version"; exit ;;
   --config | --confi | --conf | --con | --co | --c )
-    $as_echo "$ac_cs_config"; exit ;;
+    printf "%s\n" "$ac_cs_config"; exit ;;
   --debug | --debu | --deb | --de | --d | -d )
     debug=: ;;
   --file | --fil | --fi | --f )
     $ac_shift
     case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
     '') as_fn_error $? "missing file argument" ;;
     esac
     as_fn_append CONFIG_FILES " '$ac_optarg'"
@@ -7355,7 +8646,7 @@ do
   --header | --heade | --head | --hea )
     $ac_shift
     case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     as_fn_append CONFIG_HEADERS " '$ac_optarg'"
     ac_need_defaults=false;;
@@ -7364,7 +8655,7 @@ do
     as_fn_error $? "ambiguous option: \`$1'
 Try \`$0 --help' for more information.";;
   --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
+    printf "%s\n" "$ac_cs_usage"; exit ;;
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil | --si | --s)
     ac_cs_silent=: ;;
@@ -7392,7 +8683,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 if \$ac_cs_recheck; then
   set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
   shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
   CONFIG_SHELL='$SHELL'
   export CONFIG_SHELL
   exec "\$@"
@@ -7406,7 +8697,7 @@ exec 5>>config.log
   sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
 ## Running $as_me. ##
 _ASBOX
-  $as_echo "$ac_log"
+  printf "%s\n" "$ac_log"
 } >&5
 
 _ACEOF
@@ -7439,9 +8730,9 @@ done
 # We use the long form for the default assignment because of an extremely
 # bizarre bug on SunOS 4.1.3.
 if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+  test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+  test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+  test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
 fi
 
 # Have a temporary directory for convenience.  Make it in the build tree
@@ -7777,7 +9068,7 @@ do
 	   esac ||
 	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
       esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
       as_fn_append ac_file_inputs " '$ac_f'"
     done
 
@@ -7785,17 +9076,17 @@ do
     # use $as_me), people would be surprised to read:
     #    /* config.h.  Generated by config.status.  */
     configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	  printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
 	`' by configure.'
     if test x"$ac_file" != x-; then
       configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
     fi
     # Neutralize special characters interpreted by sed in replacement strings.
     case $configure_input in #(
     *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
+       ac_sed_conf_input=`printf "%s\n" "$configure_input" |
        sed 's/[\\\\&|]/\\\\&/g'`;; #(
     *) ac_sed_conf_input=$configure_input;;
     esac
@@ -7812,7 +9103,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$ac_file" : 'X\(//\)[^/]' \| \
 	 X"$ac_file" : 'X\(//\)$' \| \
 	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -7836,9 +9127,9 @@ $as_echo X"$ac_file" |
 case "$ac_dir" in
 .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
 *)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
   # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
   case $ac_top_builddir_sub in
   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -7895,8 +9186,8 @@ ac_sed_dataroot='
 case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
 *datarootdir*) ac_datarootdir_seen=yes;;
 *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
   ac_datarootdir_hack='
@@ -7939,9 +9230,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
   { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
   { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
       "$ac_tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
 which seems to be undefined.  Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
 which seems to be undefined.  Please make sure it is defined" >&2;}
 
   rm -f "$ac_tmp/stdin"
@@ -7957,27 +9248,27 @@ which seems to be undefined.  Please make sure it is defined" >&2;}
   #
   if test x"$ac_file" != x-; then
     {
-      $as_echo "/* $configure_input  */" \
+      printf "%s\n" "/* $configure_input  */" >&1 \
       && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
     } >"$ac_tmp/config.h" \
       || as_fn_error $? "could not create $ac_file" "$LINENO" 5
     if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
     else
       rm -f "$ac_file"
       mv "$ac_tmp/config.h" "$ac_file" \
 	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
     fi
   else
-    $as_echo "/* $configure_input  */" \
+    printf "%s\n" "/* $configure_input  */" >&1 \
       && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
       || as_fn_error $? "could not create -" "$LINENO" 5
   fi
  ;;
 
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
+  :C)  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
  ;;
   esac
 
@@ -8061,7 +9352,7 @@ if test "$no_recursion" != yes; then
       ;;
     *)
       case $ac_arg in
-      *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+      *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
       esac
       as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
     esac
@@ -8071,7 +9362,7 @@ if test "$no_recursion" != yes; then
   # in subdir configurations.
   ac_arg="--prefix=$prefix"
   case $ac_arg in
-  *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
   esac
   ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
 
@@ -8092,17 +9383,17 @@ if test "$no_recursion" != yes; then
     test -d "$srcdir/$ac_dir" || continue
 
     ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
-    $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
-    $as_echo "$ac_msg" >&6
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
+    printf "%s\n" "$ac_msg" >&6
     as_dir="$ac_dir"; as_fn_mkdir_p
     ac_builddir=.
 
 case "$ac_dir" in
 .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
 *)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
   # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
   case $ac_top_builddir_sub in
   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -8132,17 +9423,15 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
     cd "$ac_dir"
 
-    # Check for guested configure; otherwise get Cygnus style configure.
+    # Check for configure.gnu first; this name is used for a wrapper for
+    # Metaconfig's "Configure" on case-insensitive file systems.
     if test -f "$ac_srcdir/configure.gnu"; then
       ac_sub_configure=$ac_srcdir/configure.gnu
     elif test -f "$ac_srcdir/configure"; then
       ac_sub_configure=$ac_srcdir/configure
-    elif test -f "$ac_srcdir/configure.in"; then
-      # This should be Cygnus configure.
-      ac_sub_configure=$ac_aux_dir/configure
     else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
-$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
+printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
       ac_sub_configure=
     fi
 
@@ -8155,8 +9444,8 @@ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
 	ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
       esac
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
-$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+printf "%s\n" "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
       # The eval makes quoting arguments work.
       eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
 	   --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
@@ -8167,7 +9456,8 @@ $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cach
   done
 fi
 if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
diff --git a/configure.ac b/configure.ac
index ec4de6e551..ccf1ca6415 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,6 @@
 dnl Process this file with autoconf to produce a configure script.
-dnl Note we do not use AC_PREREQ here!  See aclocal.m4 for what we use instead.
-AC_INIT([GNU C Library], [(see version.h)], [https://sourceware.org/bugzilla/],
-  [glibc], [https://www.gnu.org/software/glibc/])
+dnl Note we do not use AC_PREREQ([2.71]) here!  See aclocal.m4 for what we use instead.
+AC_INIT([GNU C Library],[(see version.h)],[https://sourceware.org/bugzilla/],[glibc],[https://www.gnu.org/software/glibc/])
 AC_CONFIG_SRCDIR([include/features.h])
 AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_AUX_DIR([scripts])
@@ -231,7 +230,7 @@ AC_ARG_ENABLE([stack-protector],
 	      [enable_stack_protector=no])
 case "$enable_stack_protector" in
 all|yes|no|strong) ;;
-*) AC_MSG_ERROR([Not a valid argument for --enable-stack-protector: \"$enable_stack_protector\"]);;
+*) AC_MSG_ERROR([Not a valid argument for --enable-stack-protector: "$enable_stack_protector"]);;
 esac
 
 dnl On some platforms we cannot use dynamic loading.  We must provide
@@ -459,8 +458,7 @@ AC_ARG_ENABLE([cet],
 	      [enable_cet=$libc_cv_compiler_default_cet])
 
 AC_ARG_ENABLE([scv],
-	      AC_HELP_STRING([--disable-scv],
-			     [syscalls will not use scv instruction, even if the kernel supports it, powerpc only]),
+	      AS_HELP_STRING([--disable-scv],[syscalls will not use scv instruction, even if the kernel supports it, powerpc only]),
 	      [use_scv=$enableval],
 	      [use_scv=yes])
 
diff --git a/sysdeps/generic/libc-symver.h b/sysdeps/generic/libc-symver.h
index ac2b827f72..64e3cfda24 100644
--- a/sysdeps/generic/libc-symver.h
+++ b/sysdeps/generic/libc-symver.h
@@ -47,7 +47,7 @@
   __asm__ (".symver " #real "," #name "@" #version)
 #endif  /* !__ASSEMBLER__ */
 
-#if SYMVER_NEEDS_ALIAS
+#if defined SYMVER_NEEDS_ALIAS && SYMVER_NEEDS_ALIAS
 /* If the assembler cannot support multiple versions for the same
    symbol, introduce __SInnn_ aliases to which the symbol version is
    attached.  */
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 03/21] Exclude routines from fortification
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 01/21] Add --enable-fortify-source option Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 02/21] Configure: regenerate for autoconf 2.71 Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 04/21] sysdeps/{i386,x86_64}/mempcpy_chk.S: fix linknamespace for __mempcpy_chk Frédéric Bérat
                   ` (17 subsequent siblings)
  20 siblings, 0 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

Since the _FORTIFY_SOURCE feature uses some routines of Glibc, they need to
be excluded from the fortification.

On top of that:
 - some tests explicitly verify that some level of fortification works
   appropriately, we therefore shouldn't modify the level set for them.
 - some objects need to be build with optimization disabled, which
   prevents _FORTIFY_SOURCE to be used for them.

Assembler files that implement architecture specific versions of the
fortified routines were not excluded from _FORTIFY_SOURCE as there is no
C header included that would impact their behavior.
---
 debug/Makefile                              | 12 +--
 io/Makefile                                 | 16 ++++
 libio/Makefile                              | 21 +++++-
 login/Makefile                              |  6 ++
 misc/Makefile                               |  7 ++
 posix/Makefile                              | 11 +++
 rt/Makefile                                 |  5 ++
 setjmp/Makefile                             |  5 ++
 socket/Makefile                             |  6 ++
 stdio-common/Makefile                       | 15 +++-
 stdlib/Makefile                             |  7 ++
 string/Makefile                             | 17 +++++
 sysdeps/ieee754/ldbl-128ibm-compat/Makefile | 81 +++++++++++++++++----
 sysdeps/ieee754/ldbl-opt/Makefile           | 29 ++++++++
 sysdeps/pthread/Makefile                    |  4 +
 sysdeps/unix/sysv/linux/Makefile            |  3 +
 wcsmbs/Makefile                             | 23 +++++-
 17 files changed, 243 insertions(+), 25 deletions(-)

diff --git a/debug/Makefile b/debug/Makefile
index 9d658e3002..434e52f780 100644
--- a/debug/Makefile
+++ b/debug/Makefile
@@ -171,13 +171,13 @@ CFLAGS-recvfrom_chk.c += -fexceptions -fasynchronous-unwind-tables
 # set up for us, so keep the CFLAGS/CPPFLAGS split logical as the order is:
 # <user CFLAGS> <test CFLAGS> <user CPPFLAGS> <test CPPFLAGS>
 CFLAGS-tst-longjmp_chk.c += -fexceptions -fasynchronous-unwind-tables
-CPPFLAGS-tst-longjmp_chk.c += -D_FORTIFY_SOURCE=1
+CPPFLAGS-tst-longjmp_chk.c += $(no-fortify-source),-D_FORTIFY_SOURCE=1
 CFLAGS-tst-longjmp_chk2.c += -fexceptions -fasynchronous-unwind-tables
-CPPFLAGS-tst-longjmp_chk2.c += -D_FORTIFY_SOURCE=1
+CPPFLAGS-tst-longjmp_chk2.c += $(no-fortify-source),-D_FORTIFY_SOURCE=1
 CFLAGS-tst-longjmp_chk3.c += -fexceptions -fasynchronous-unwind-tables
-CPPFLAGS-tst-longjmp_chk3.c += -D_FORTIFY_SOURCE=1
-CPPFLAGS-tst-realpath-chk.c += -D_FORTIFY_SOURCE=2
-CPPFLAGS-tst-chk-cancel.c += -D_FORTIFY_SOURCE=2
+CPPFLAGS-tst-longjmp_chk3.c += $(no-fortify-source),-D_FORTIFY_SOURCE=1
+CPPFLAGS-tst-realpath-chk.c += $(no-fortify-source),-D_FORTIFY_SOURCE=2
+CPPFLAGS-tst-chk-cancel.c += $(no-fortify-source),-D_FORTIFY_SOURCE=2
 
 # _FORTIFY_SOURCE tests.
 # Auto-generate tests for _FORTIFY_SOURCE for different levels, compilers and
@@ -215,7 +215,7 @@ src-chk-nongnu = \#undef _GNU_SOURCE
 # cannot be disabled via pragmas, so require -Wno-error to be used.
 define gen-chk-test
 tests-$(1)-$(4)-chk += tst-fortify-$(1)-$(2)-$(3)-$(4)
-CFLAGS-tst-fortify-$(1)-$(2)-$(3)-$(4).$(1) += -D_FORTIFY_SOURCE=$(3) -Wno-format \
+CFLAGS-tst-fortify-$(1)-$(2)-$(3)-$(4).$(1) += $(no-fortify-source),-D_FORTIFY_SOURCE=$(3) -Wno-format \
 					  -Wno-deprecated-declarations \
 					  -Wno-error
 $(eval $(call cflags-$(2),$(1),$(3),$(4)))
diff --git a/io/Makefile b/io/Makefile
index d573064ecc..6ccc0e8691 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -149,6 +149,22 @@ routines := \
   write \
   # routines
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  getcwd \
+  getwd \
+  open \
+  open64 \
+  openat \
+  openat64 \
+  poll \
+  ppoll \
+  read \
+  readlink \
+  readlinkat \
+  ttyname_r \
+  # routines_no_fortify
+
 others := \
  pwd \
  # others
diff --git a/libio/Makefile b/libio/Makefile
index 2877fec484..f5c487d9f5 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -53,6 +53,21 @@ routines	:=							      \
 
 gen-as-const-headers += libio-macros.sym
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  fwprintf \
+  iofgets \
+  iofgets_u \
+  iofgetws \
+  iofgetws_u \
+  swprintf \
+  vasprintf \
+  vsnprintf \
+  vswprintf \
+  vwprintf \
+  wprintf \
+  # routines_no_fortify
+
 tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc   \
 	tst_wprintf2 tst-widetext test-fmemopen tst-ext tst-ext2 \
 	tst-fgetws tst-ungetwc1 tst-ungetwc2 tst-swscanf tst-sscanf	      \
@@ -165,11 +180,15 @@ CFLAGS-iofgets_u.c += $(config-cflags-wno-ignored-attributes)
 CFLAGS-iofputs_u.c += $(config-cflags-wno-ignored-attributes)
 # XXX Do we need filedoalloc and wfiledoalloc?  Others?
 
+# Prevent fortification as these are built with -O0
+CFLAGS-tst-bz24051.c += $(no-fortify-source)
+CFLAGS-tst-bz24153.c += $(no-fortify-source)
+
 CFLAGS-tst_putwc.c += -DOBJPFX=\"$(objpfx)\"
 
 # These test cases intentionally use overlapping arguments
 CFLAGS-tst-sprintf-ub.c += -Wno-restrict
-CFLAGS-tst-sprintf-chk-ub.c += -Wno-restrict
+CFLAGS-tst-sprintf-chk-ub.c += -Wno-restrict $(no-fortify-source)
 
 LDFLAGS-tst-bz24228 = -Wl,--version-script=tst-bz24228.map
 
diff --git a/login/Makefile b/login/Makefile
index 13b155d344..74216cbcb2 100644
--- a/login/Makefile
+++ b/login/Makefile
@@ -66,6 +66,12 @@ include ../Rules
 CFLAGS-getpt.c += -fexceptions
 CFLAGS-getlogin_r.c += $(config-cflags-wno-ignored-attributes)
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  getlogin_r \
+  ptsname_r \
+  # routines_no_fortify
+
 ifeq (yesyes,$(have-fpie)$(build-shared))
 pt_chown-cflags += $(pie-ccflag)
 endif
diff --git a/misc/Makefile b/misc/Makefile
index 84aa4cb0ad..36ba7a0bad 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -205,6 +205,13 @@ routines := \
   writev \
   # routines
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  getdomain \
+  gethostname \
+  syslog \
+  # routines_no_fortify
+
 generated += \
   tst-allocate_once-mem.out \
   tst-allocate_once.mtrace \
diff --git a/posix/Makefile b/posix/Makefile
index ad43cbdec6..5113ee3b74 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -183,6 +183,14 @@ routines := \
   wordexp \
   # routines
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  confstr \
+  getgroups \
+  pread \
+  pread64 \
+  # routines_no_fortify
+
 aux := \
   environ \
   init-posix \
@@ -604,6 +612,9 @@ bug-glob1-ARGS = "$(objpfx)"
 tst-execvp3-ARGS = --test-dir=$(objpfx)
 CFLAGS-tst-spawn3.c += -DOBJPFX=\"$(objpfx)\"
 
+# Test voluntarily overflows struct dirent
+CFLAGS-bug-glob2.c += $(no-fortify-source)
+
 $(objpfx)testcases.h: TESTS TESTS2C.sed
 	LC_ALL=C sed -f TESTS2C.sed < $< > $@T
 	mv $@T $@
diff --git a/rt/Makefile b/rt/Makefile
index a97333dc02..3d4a3f0eec 100644
--- a/rt/Makefile
+++ b/rt/Makefile
@@ -100,6 +100,11 @@ CFLAGS-aio_suspend.c += -fexceptions
 CFLAGS-mq_timedreceive.c += -fexceptions -fasynchronous-unwind-tables
 CFLAGS-mq_timedsend.c += -fexceptions -fasynchronous-unwind-tables
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  mq_open \
+  # routines_no_fortify
+
 LDFLAGS-rt.so = -Wl,--enable-new-dtags,-z,nodelete
 
 $(objpfx)librt.so: $(shared-thread-library)
diff --git a/setjmp/Makefile b/setjmp/Makefile
index e5733a8c52..90463e3754 100644
--- a/setjmp/Makefile
+++ b/setjmp/Makefile
@@ -38,4 +38,9 @@ gen-as-const-headers += jmp_buf-macros.sym
 
 include ../Rules
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  longjmp \
+  # routines_no_fortify
+
 $(objpfx)tst-setjmp-fp: $(libm)
diff --git a/socket/Makefile b/socket/Makefile
index d9b0b4af64..08f20118cd 100644
--- a/socket/Makefile
+++ b/socket/Makefile
@@ -60,6 +60,12 @@ routines := \
   socketpair \
   # routines
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  recv \
+  recvfrom \
+  # routines_no_fortify
+
 tests := \
   tst-accept4 \
   tst-cmsg_cloexec \
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index 8871ec7668..fe304b8373 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -117,6 +117,19 @@ routines := \
   wprintf_function_invoke \
   # routines
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  asprintf \
+  dprintf \
+  fprintf \
+  printf \
+  snprintf \
+  sprintf \
+  vfprintf \
+  vfwprintf \
+  vprintf \
+  # routines_no_fortify
+
 aux := \
   errlist \
   errlist-data \
@@ -461,7 +474,7 @@ CFLAGS-tst-gets.c += -Wno-deprecated-declarations
 
 # BZ #11319 was first fixed for regular vdprintf, then reopened because
 # the fortified version had the same bug.
-CFLAGS-tst-bz11319-fortify2.c += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
+CFLAGS-tst-bz11319-fortify2.c += $(no-fortify-source),-D_FORTIFY_SOURCE=2
 
 CFLAGS-tst-memstream-string.c += -fno-builtin-fprintf
 
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 0975f55ee6..25e42a77e7 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -145,6 +145,13 @@ routines := \
   xpg_basename \
   # routines
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  mbstowcs \
+  wcstombs \
+  wctomb \
+  # routines_no_fortify
+
 aux = \
   grouping \
   groupingwc \
diff --git a/string/Makefile b/string/Makefile
index d3106d10a9..8cdfd5b000 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -118,6 +118,23 @@ routines := \
   xpg-strerror \
 # routines
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  explicit_bzero \
+  memcpy \
+  memmove \
+  mempcpy \
+  memset \
+  stpcpy \
+  stpncpy \
+  strcat \
+  strcpy \
+  strlcat \
+  strlcpy \
+  strncat \
+  strncpy \
+  # routines_no_fortify
+
 tests := \
   bug-envz1 \
   bug-strcoll1 \
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
index 42cca25a09..34273a5f58 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
@@ -88,13 +88,19 @@ tests-internal += test-wprintf-ieee128 test-wprintf-ibm128
 CFLAGS-test-wprintf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
 CFLAGS-test-wprintf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
 
+# The following tests are setting _FORTIFY_SOURCE internally
 tests-internal += test-obstack-ieee128 test-obstack-ibm128
-CFLAGS-test-obstack-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
-CFLAGS-test-obstack-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
+CFLAGS-test-obstack-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi \
+				 $(no-fortify-source)
+CFLAGS-test-obstack-ibm128.c += -mabi=ibmlongdouble -Wno-psabi \
+				$(no-fortify-source)
 
+# The following tests are setting _FORTIFY_SOURCE internally
 tests-internal += test-obstack-chk-ieee128 test-obstack-chk-ibm128
-CFLAGS-test-obstack-chk-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
-CFLAGS-test-obstack-chk-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
+CFLAGS-test-obstack-chk-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi \
+				     $(no-fortify-source)
+CFLAGS-test-obstack-chk-ibm128.c += -mabi=ibmlongdouble -Wno-psabi \
+				    $(no-fortify-source)
 
 tests-internal += test-scanf-ieee128 test-scanf-ibm128
 CFLAGS-test-scanf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi -std=c89 -D_GNU_SOURCE
@@ -216,25 +222,37 @@ ldbl-extra-routines += asprintf_chk \
 		       obstack_chk \
 		       vobstack_chk
 
+# The following tests are setting _FORTIFY_SOURCE internally
 tests-internal += test-printf-chk-ieee128 test-printf-chk-ibm128
-CFLAGS-test-printf-chk-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
-CFLAGS-test-printf-chk-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
+CFLAGS-test-printf-chk-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi \
+				    $(no-fortify-source)
+CFLAGS-test-printf-chk-ibm128.c += -mabi=ibmlongdouble -Wno-psabi \
+				   $(no-fortify-source)
 
+# The following tests are setting _FORTIFY_SOURCE internally
 tests-internal += test-printf-chk-redir-ieee128 test-printf-chk-redir-ibm128
 CFLAGS-test-printf-chk-redir-ieee128.c += -mfloat128 -mabi=ieeelongdouble \
-					  -Wno-psabi -Wno-unused-result
+					  -Wno-psabi -Wno-unused-result \
+					  $(no-fortify-source)
 CFLAGS-test-printf-chk-redir-ibm128.c += -mabi=ibmlongdouble -Wno-psabi \
-					 -Wno-unused-result
+					 -Wno-unused-result \
+					 $(no-fortify-source)
 
+# The following tests are setting _FORTIFY_SOURCE internally
 tests-internal += test-wprintf-chk-ieee128 test-wprintf-chk-ibm128
-CFLAGS-test-wprintf-chk-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
-CFLAGS-test-wprintf-chk-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
+CFLAGS-test-wprintf-chk-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi \
+				     $(no-fortify-source)
+CFLAGS-test-wprintf-chk-ibm128.c += -mabi=ibmlongdouble -Wno-psabi \
+				    $(no-fortify-source)
 
+# The following tests are setting _FORTIFY_SOURCE internally
 tests-internal += test-wprintf-chk-redir-ieee128 test-wprintf-chk-redir-ibm128
 CFLAGS-test-wprintf-chk-redir-ieee128.c += -mfloat128 -mabi=ieeelongdouble \
-					   -Wno-psabi -Wno-unused-result
+					   -Wno-psabi -Wno-unused-result \
+					   $(no-fortify-source)
 CFLAGS-test-wprintf-chk-redir-ibm128.c += -mabi=ibmlongdouble -Wno-psabi \
-					  -Wno-unused-result
+					  -Wno-unused-result \
+					  $(no-fortify-source)
 endif
 
 ifeq ($(subdir),argp)
@@ -281,13 +299,19 @@ CFLAGS-tst-ieee128-error.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
 CFLAGS-tst-ieee128-efgcvt.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
 CFLAGS-tst-ieee128-errorfptr.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
 
+# The following tests are setting _FORTIFY_SOURCE internally
 tests-container += test-syslog-ieee128 test-syslog-ibm128
-CFLAGS-test-syslog-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
-CFLAGS-test-syslog-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
+CFLAGS-test-syslog-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi \
+				$(no-fortify-source)
+CFLAGS-test-syslog-ibm128.c += -mabi=ibmlongdouble -Wno-psabi \
+			       $(no-fortify-source)
 
+# The following tests are setting _FORTIFY_SOURCE internally
 tests-container += test-syslog-chk-ieee128 test-syslog-chk-ibm128
-CFLAGS-test-syslog-chk-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
-CFLAGS-test-syslog-chk-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
+CFLAGS-test-syslog-chk-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi \
+				    $(no-fortify-source)
+CFLAGS-test-syslog-chk-ibm128.c += -mabi=ibmlongdouble -Wno-psabi \
+				   $(no-fortify-source)
 endif
 
 ifeq ($(subdir),stdlib)
@@ -395,6 +419,31 @@ endif
 # Add IEEE binary128 files as make targets.
 routines += $(foreach r,$(ldbl-extra-routines),ieee128-$(r))
 
+routines_no_fortify += \
+  ieee128-asprintf \
+  ieee128-dprintf \
+  ieee128-fprintf \
+  ieee128-fwprintf \
+  ieee128-obstack \
+  ieee128-printf \
+  ieee128-snprintf \
+  ieee128-sprintf \
+  ieee128-swprintf \
+  ieee128-syslog \
+  ieee128-vasprintf \
+  ieee128-vdprintf \
+  ieee128-vfprintf \
+  ieee128-vfwprintf \
+  ieee128-vobstack \
+  ieee128-vprintf \
+  ieee128-vsnprintf \
+  ieee128-vsprintf \
+  ieee128-vswprintf \
+  ieee128-vsyslog \
+  ieee128-vwprintf \
+  ieee128-wprintf \
+  # routines_no_fortify
+
 # On powerpc64le, the routines responsible for converting between long
 # double and string (e.g.: printf, scanf, strtold, strfroml) default to
 # IBM long double mode.  When support for TS 18661-3 was added, several
diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile
index 22e778ad0e..0ed1cd2cae 100644
--- a/sysdeps/ieee754/ldbl-opt/Makefile
+++ b/sysdeps/ieee754/ldbl-opt/Makefile
@@ -269,3 +269,32 @@ CFLAGS-tst-nldbl-wscanf-binary-gnu89.c += -mlong-double-64 -std=gnu89 \
 					  -DOBJPFX=\"$(objpfx)\"
 
 endif
+
+routines_no_fortify += \
+  nldbl-asprintf \
+  nldbl-dprintf \
+  nldbl-fprintf \
+  nldbl-fwprintf \
+  nldbl-obstack_printf \
+  nldbl-obstack_vprintf \
+  nldbl-printf \
+  nldbl-snprintf \
+  nldbl-sprintf \
+  nldbl-swprintf \
+  nldbl-syslog \
+  nldbl-vasprintf \
+  nldbl-vdprintf \
+  nldbl-vfprintf \
+  nldbl-vfwprintf \
+  nldbl-vprintf \
+  nldbl-vsnprintf \
+  nldbl-vsprintf \
+  nldbl-vswprintf \
+  nldbl-vsyslog \
+  nldbl-vwprintf \
+  nldbl-wprintf \
+  # routines_no_fortify
+
+# We can't rely on Makeconfig here for whatever reason
+CFLAGS-.oS += $(call elide-fortify-source,.oS,$(routines_no_fortify))
+CFLAGS-.oS += $(call elide-fortify-source,_chk.oS,$(routines_no_fortify))
diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
index 32cf4eb119..31028406d5 100644
--- a/sysdeps/pthread/Makefile
+++ b/sysdeps/pthread/Makefile
@@ -304,6 +304,10 @@ tests-nolibpthread += \
 CFLAGS-tst-cleanup2.c += -fno-builtin
 CFLAGS-tst-cleanupx2.c += -fno-builtin
 
+# Disable fortification due to sprintf(NULL,...)
+CFLAGS-tst-cleanup2.c += $(no-fortify-source)
+CFLAGS-tst-cleanupx2.c += $(no-fortify-source)
+
 tests += \
   tst-cancelx2 \
   tst-cancelx3 \
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 594a5dc53e..9108b7d2ed 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -120,6 +120,9 @@ CFLAGS-sync_file_range.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-pselect32.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-tst-writev.c += "-DARTIFICIAL_LIMIT=(0x80000000-sysconf(_SC_PAGESIZE))"
 
+# The test triggers FORTIFY abortion due to purposely wrong parameters
+CFLAGS-test-errno-linux.c += $(no-fortify-source)
+
 sysdep_headers += \
   bits/a.out.h \
   bits/epoll.h \
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index 22192985e1..d25a2214f8 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -121,6 +121,27 @@ routines := \
   wmemset \
   # routines
 
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+  mbsnrtowcs \
+  mbsrtowcs \
+  wcpcpy \
+  wcpncpy \
+  wcrtomb \
+  wcscat \
+  wcscpy \
+  wcslcat \
+  wcslcpy \
+  wcsncat \
+  wcsncpy \
+  wcsnrtombs \
+  wcsrtombs \
+  wmemcpy \
+  wmemmove \
+  wmempcpy \
+  wmemset \
+  # routines_no_fortify
+
 tests := \
   test-c8rtomb \
   test-char-types \
@@ -231,7 +252,7 @@ CFLAGS-wcstod_l.c += $(strtox-CFLAGS) $(config-cflags-wno-ignored-attributes)
 CFLAGS-wcstold_l.c += $(strtox-CFLAGS) $(config-cflags-wno-ignored-attributes)
 CFLAGS-wcstof128_l.c += $(strtox-CFLAGS)
 CFLAGS-wcstof_l.c += $(strtox-CFLAGS) $(config-cflags-wno-ignored-attributes)
-CPPFLAGS-tst-wchar-h.c += -D_FORTIFY_SOURCE=2
+CPPFLAGS-tst-wchar-h.c += $(no-fortify-source),-D_FORTIFY_SOURCE=2
 
 CFLAGS-wcschr.c += $(config-cflags-wno-ignored-attributes)
 CFLAGS-wmemchr.c += $(config-cflags-wno-ignored-attributes)
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 04/21] sysdeps/{i386,x86_64}/mempcpy_chk.S: fix linknamespace for __mempcpy_chk
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (2 preceding siblings ...)
  2023-06-20 18:18 ` [PATCH 03/21] Exclude routines from fortification Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-21 12:27   ` Siddhesh Poyarekar
  2023-06-20 18:18 ` [PATCH 05/21] stdio-common: tests: Incorrect maxlen parameter for swprintf Frédéric Bérat
                   ` (16 subsequent siblings)
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

On i386 and x86_64, for libc.a specifically, __mempcpy_chk calls
mempcpy which leads POSIX routines to call non-POSIX mempcpy indirectly.

This leads the linknamespace test to fail when glibc is built with
__FORTIFY_SOURCE=3.

Since calling mempcpy doesn't bring any benefit for libc.a, directly
call __mempcpy instead.
---
 sysdeps/i386/mempcpy_chk.S   | 2 +-
 sysdeps/x86_64/mempcpy_chk.S | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/sysdeps/i386/mempcpy_chk.S b/sysdeps/i386/mempcpy_chk.S
index 8b785bd9a5..1e9bf71bfb 100644
--- a/sysdeps/i386/mempcpy_chk.S
+++ b/sysdeps/i386/mempcpy_chk.S
@@ -28,6 +28,6 @@ ENTRY (__mempcpy_chk)
 	movl	12(%esp), %eax
 	cmpl	%eax, 16(%esp)
 	jb	__chk_fail
-	jmp	mempcpy
+	jmp	__mempcpy
 END (__mempcpy_chk)
 #endif
diff --git a/sysdeps/x86_64/mempcpy_chk.S b/sysdeps/x86_64/mempcpy_chk.S
index b1ddb02f78..b60ee4ff08 100644
--- a/sysdeps/x86_64/mempcpy_chk.S
+++ b/sysdeps/x86_64/mempcpy_chk.S
@@ -28,6 +28,6 @@
 ENTRY (__mempcpy_chk)
 	cmpq	%rdx, %rcx
 	jb	__chk_fail
-	jmp	mempcpy
+	jmp	__mempcpy
 END (__mempcpy_chk)
 #endif
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 05/21] stdio-common: tests: Incorrect maxlen parameter for swprintf
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (3 preceding siblings ...)
  2023-06-20 18:18 ` [PATCH 04/21] sysdeps/{i386,x86_64}/mempcpy_chk.S: fix linknamespace for __mempcpy_chk Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-21 12:29   ` Siddhesh Poyarekar
  2023-06-20 18:18 ` [PATCH 06/21] sysdeps: Ensure ieee128*_chk routines to be properly named Frédéric Bérat
                   ` (15 subsequent siblings)
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

Few tests using swprintf are passing incorrect maxlen parameter.
This triggers an abort when _FORTIFY_SOURCE is enabled.
---
 stdio-common/tst-printf-bz25691.c    |  8 ++++----
 stdio-common/tst-vfprintf-mbs-prec.c | 15 ++++++++-------
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/stdio-common/tst-printf-bz25691.c b/stdio-common/tst-printf-bz25691.c
index db81fdf590..44e9ea7d9d 100644
--- a/stdio-common/tst-printf-bz25691.c
+++ b/stdio-common/tst-printf-bz25691.c
@@ -78,12 +78,12 @@ do_test (void)
     wchar_t *result = xmalloc (resultsize);
     int ret;
 
-    ret = swprintf (result, resultsize, L"%.65537s", mbs);
+    ret = swprintf (result, mbssize, L"%.65537s", mbs);
     TEST_COMPARE (ret, mbssize - 1);
     TEST_COMPARE_BLOB (result, (ret + 1) * sizeof (wchar_t),
 		       expected, expectedsize * sizeof (wchar_t));
 
-    ret = swprintf (result, resultsize, L"%1$.65537s", mbs);
+    ret = swprintf (result, mbssize, L"%1$.65537s", mbs);
     TEST_COMPARE (ret, mbssize - 1);
     TEST_COMPARE_BLOB (result, (ret + 1) * sizeof (wchar_t),
 		       expected, expectedsize * sizeof (wchar_t));
@@ -91,10 +91,10 @@ do_test (void)
     /* Same test, but with an invalid multibyte sequence.  */
     mbs[mbssize - 2] = 0xff;
 
-    ret = swprintf (result, resultsize, L"%.65537s", mbs);
+    ret = swprintf (result, mbssize, L"%.65537s", mbs);
     TEST_COMPARE (ret, -1);
 
-    ret = swprintf (result, resultsize, L"%1$.65537s", mbs);
+    ret = swprintf (result, mbssize, L"%1$.65537s", mbs);
     TEST_COMPARE (ret, -1);
 
     free (mbs);
diff --git a/stdio-common/tst-vfprintf-mbs-prec.c b/stdio-common/tst-vfprintf-mbs-prec.c
index 38350ed60f..41c4139f21 100644
--- a/stdio-common/tst-vfprintf-mbs-prec.c
+++ b/stdio-common/tst-vfprintf-mbs-prec.c
@@ -441,7 +441,8 @@ test_mbs_long (const char *mbs, const wchar_t *wide, const size_t *length)
 static void
 test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
 {
-  wchar_t buf[2000];
+#define BUF_SIZE 2000
+  wchar_t buf[BUF_SIZE];
   _Static_assert (sizeof (buf) > sizeof (wchar_t) * WIDE_STRING_LENGTH,
                   "buffer size consistent with string length");
   const wchar_t *suffix = L"||TERM";
@@ -450,13 +451,13 @@ test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
 
   /* Test formatting of the entire string.  */
   {
-    int ret = swprintf (buf, sizeof (buf), L"%s%ls", mbs, suffix);
+    int ret = swprintf (buf, BUF_SIZE, L"%s%ls", mbs, suffix);
     TEST_VERIFY (ret == WIDE_STRING_LENGTH + wcslen (suffix));
     TEST_VERIFY (wmemcmp (buf, wide, WIDE_STRING_LENGTH) == 0);
     TEST_VERIFY (wcscmp (buf + WIDE_STRING_LENGTH, suffix) == 0);
 
     /* Left-justified string, printed in full.  */
-    ret = swprintf (buf, sizeof (buf), L"%-1500s%ls", mbs, suffix);
+    ret = swprintf (buf, BUF_SIZE, L"%-1500s%ls", mbs, suffix);
     TEST_VERIFY (ret == 1500 + wcslen (suffix));
     TEST_VERIFY (wmemcmp (buf, wide, WIDE_STRING_LENGTH) == 0);
     for (size_t i = WIDE_STRING_LENGTH; i < 1500; ++i)
@@ -464,7 +465,7 @@ test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
     TEST_VERIFY (wcscmp (buf + 1500, suffix) == 0);
 
     /* Right-justified string, printed in full.   */
-    ret = swprintf (buf, sizeof (buf), L"%1500s%ls", mbs, suffix);
+    ret = swprintf (buf, BUF_SIZE, L"%1500s%ls", mbs, suffix);
     TEST_VERIFY (ret == 1500 + wcslen (suffix));
     size_t padding = 1500 - WIDE_STRING_LENGTH;
     for (size_t i = 0; i < padding; ++i)
@@ -484,14 +485,14 @@ test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
         printf ("info: %s: wide_len=%d actual_wide_len=%zu\n",
                 __func__, wide_len, actual_wide_len);
 
-      int ret = swprintf (buf, sizeof (buf), L"%.*s%ls",
+      int ret = swprintf (buf, BUF_SIZE, L"%.*s%ls",
                           wide_len, mbs, suffix);
       TEST_VERIFY (ret == actual_wide_len + wcslen (suffix));
       TEST_VERIFY (wmemcmp (buf, wide, actual_wide_len) == 0);
       TEST_VERIFY (wcscmp (buf + actual_wide_len, suffix) == 0);
 
       /* Left-justified string, printed in full.  */
-      ret = swprintf (buf, sizeof (buf), L"%-1500.*s%ls",
+      ret = swprintf (buf, BUF_SIZE, L"%-1500.*s%ls",
                       wide_len, mbs, suffix);
       TEST_VERIFY (ret == 1500 + wcslen (suffix));
       TEST_VERIFY (wmemcmp (buf, wide, actual_wide_len) == 0);
@@ -500,7 +501,7 @@ test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
       TEST_VERIFY (wcscmp (buf + 1500, suffix) == 0);
 
       /* Right-justified string, printed in full.   */
-      ret = swprintf (buf, sizeof (buf), L"%1500.*s%ls",
+      ret = swprintf (buf, BUF_SIZE, L"%1500.*s%ls",
                       wide_len, mbs, suffix);
       TEST_VERIFY (ret == 1500 + wcslen (suffix));
       size_t padding = 1500 - actual_wide_len;
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 06/21] sysdeps: Ensure ieee128*_chk routines to be properly named
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (4 preceding siblings ...)
  2023-06-20 18:18 ` [PATCH 05/21] stdio-common: tests: Incorrect maxlen parameter for swprintf Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 07/21] string: Ensure *_chk routines have their hidden builtin definition available Frédéric Bérat
                   ` (14 subsequent siblings)
  20 siblings, 0 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

The *_chk routines naming doesn't match the name that would be generated
using libc_hidden_ldbl_proto. Since the macro is needed for some of
these *_chk functions for _FORTIFY_SOURCE to be enabled, that needed to
be fixed.
While at it, all the *_chk function get renamed appropriately for
consistency, even if not strictly necessary.
---
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dprintf_chk.c  | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c  | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf_chk.c | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-printf_chk.c   | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-snprintf_chk.c | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c  | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf_chk.c | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c       | 8 ++++----
 .../ieee754/ldbl-128ibm-compat/ieee128-vasprintf_chk.c    | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vdprintf_chk.c | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfprintf_chk.c | 4 ++--
 .../ieee754/ldbl-128ibm-compat/ieee128-vfwprintf_chk.c    | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vprintf_chk.c  | 4 ++--
 .../ieee754/ldbl-128ibm-compat/ieee128-vsnprintf_chk.c    | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c | 4 ++--
 .../ieee754/ldbl-128ibm-compat/ieee128-vswprintf_chk.c    | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf_chk.c | 4 ++--
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf_chk.c  | 4 ++--
 19 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c
index a50e334a2c..fbf953a728 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c
@@ -20,7 +20,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_asprintf_chk (char **string_ptr, int flag, const char *format, ...)
+___ieee128___asprintf_chk (char **string_ptr, int flag, const char *format, ...)
 {
   va_list ap;
   int done;
@@ -35,4 +35,4 @@ ___ieee128_asprintf_chk (char **string_ptr, int flag, const char *format, ...)
 
   return done;
 }
-strong_alias (___ieee128_asprintf_chk, __asprintf_chkieee128)
+strong_alias (___ieee128___asprintf_chk, __asprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dprintf_chk.c
index b53b06a513..7121020ed5 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dprintf_chk.c
@@ -20,7 +20,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_dprintf_chk (int d, int flag, const char *format, ...)
+___ieee128___dprintf_chk (int d, int flag, const char *format, ...)
 {
   va_list ap;
   int done;
@@ -35,4 +35,4 @@ ___ieee128_dprintf_chk (int d, int flag, const char *format, ...)
 
   return done;
 }
-strong_alias (___ieee128_dprintf_chk, __dprintf_chkieee128)
+strong_alias (___ieee128___dprintf_chk, __dprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c
index 44eed0de99..bd10e9c3db 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c
@@ -20,7 +20,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_fprintf_chk (FILE *fp, int flag, const char *format, ...)
+___ieee128___fprintf_chk (FILE *fp, int flag, const char *format, ...)
 {
   va_list ap;
   int done;
@@ -35,4 +35,4 @@ ___ieee128_fprintf_chk (FILE *fp, int flag, const char *format, ...)
 
   return done;
 }
-strong_alias (___ieee128_fprintf_chk, __fprintf_chkieee128)
+strong_alias (___ieee128___fprintf_chk, __fprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf_chk.c
index 83c2f8e8d7..5b6cc3e768 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf_chk.c
@@ -20,7 +20,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_fwprintf_chk (FILE *fp, int flag, const wchar_t *format, ...)
+___ieee128___fwprintf_chk (FILE *fp, int flag, const wchar_t *format, ...)
 {
   va_list ap;
   int done;
@@ -35,4 +35,4 @@ ___ieee128_fwprintf_chk (FILE *fp, int flag, const wchar_t *format, ...)
 
   return done;
 }
-strong_alias (___ieee128_fwprintf_chk, __fwprintf_chkieee128)
+strong_alias (___ieee128___fwprintf_chk, __fwprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-printf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-printf_chk.c
index ab5fe59c37..333f4e14b1 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-printf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-printf_chk.c
@@ -20,7 +20,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_printf_chk (int flag, const char *format, ...)
+___ieee128___printf_chk (int flag, const char *format, ...)
 {
   va_list ap;
   int done;
@@ -35,4 +35,4 @@ ___ieee128_printf_chk (int flag, const char *format, ...)
 
   return done;
 }
-strong_alias (___ieee128_printf_chk, __printf_chkieee128)
+strong_alias (___ieee128___printf_chk, __printf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-snprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-snprintf_chk.c
index 0ff2486642..a65f193dc1 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-snprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-snprintf_chk.c
@@ -20,7 +20,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_snprintf_chk (char *s, size_t maxlen, int flag, size_t slen,
+___ieee128___snprintf_chk (char *s, size_t maxlen, int flag, size_t slen,
 			const char *format, ...)
 {
   va_list ap;
@@ -39,4 +39,4 @@ ___ieee128_snprintf_chk (char *s, size_t maxlen, int flag, size_t slen,
 
   return done;
 }
-strong_alias (___ieee128_snprintf_chk, __snprintf_chkieee128)
+strong_alias (___ieee128___snprintf_chk, __snprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c
index a0e598db42..0039c3b53d 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c
@@ -20,7 +20,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_sprintf_chk (char *s, int flag, size_t slen,
+___ieee128___sprintf_chk (char *s, int flag, size_t slen,
 		       const char *format, ...)
 {
   va_list ap;
@@ -43,4 +43,4 @@ ___ieee128_sprintf_chk (char *s, int flag, size_t slen,
 
   return done;
 }
-strong_alias (___ieee128_sprintf_chk, __sprintf_chkieee128)
+strong_alias (___ieee128___sprintf_chk, __sprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf_chk.c
index 2453c231b8..b81e9ccc05 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swprintf_chk.c
@@ -20,7 +20,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_swprintf_chk (wchar_t *string, size_t maxlen, int flag,
+___ieee128___swprintf_chk (wchar_t *string, size_t maxlen, int flag,
 			size_t slen, const wchar_t *format, ...)
 {
   va_list ap;
@@ -39,4 +39,4 @@ ___ieee128_swprintf_chk (wchar_t *string, size_t maxlen, int flag,
 
   return done;
 }
-strong_alias (___ieee128_swprintf_chk, __swprintf_chkieee128)
+strong_alias (___ieee128___swprintf_chk, __swprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
index 4ed4621b96..18aa7f707f 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
@@ -40,7 +40,7 @@ ___ieee128_vsyslog (int pri, const char *fmt, va_list ap)
 strong_alias (___ieee128_vsyslog, __vsyslogieee128)
 
 void
-___ieee128_syslog_chk (int pri, int flag, const char *fmt, ...)
+___ieee128___syslog_chk (int pri, int flag, const char *fmt, ...)
 {
   va_list ap;
 
@@ -52,10 +52,10 @@ ___ieee128_syslog_chk (int pri, int flag, const char *fmt, ...)
   __vsyslog_internal (pri, fmt, ap, mode);
   va_end (ap);
 }
-strong_alias (___ieee128_syslog_chk, __syslog_chkieee128)
+strong_alias (___ieee128___syslog_chk, __syslog_chkieee128)
 
 void
-___ieee128_vsyslog_chk (int pri, int flag, const char *fmt, va_list ap)
+___ieee128___vsyslog_chk (int pri, int flag, const char *fmt, va_list ap)
 {
   unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
   if (flag > 0)
@@ -63,4 +63,4 @@ ___ieee128_vsyslog_chk (int pri, int flag, const char *fmt, va_list ap)
 
   __vsyslog_internal (pri, fmt, ap, mode);
 }
-strong_alias (___ieee128_vsyslog_chk, __vsyslog_chkieee128)
+strong_alias (___ieee128___vsyslog_chk, __vsyslog_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vasprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vasprintf_chk.c
index 5350e777f3..a5a048f2b5 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vasprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vasprintf_chk.c
@@ -19,7 +19,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_vasprintf_chk (char **result_ptr, int flag, const char *format,
+___ieee128___vasprintf_chk (char **result_ptr, int flag, const char *format,
 			 va_list ap)
 {
   unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
@@ -28,4 +28,4 @@ ___ieee128_vasprintf_chk (char **result_ptr, int flag, const char *format,
 
   return __vasprintf_internal (result_ptr, format, ap, mode);
 }
-strong_alias (___ieee128_vasprintf_chk, __vasprintf_chkieee128)
+strong_alias (___ieee128___vasprintf_chk, __vasprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vdprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vdprintf_chk.c
index 7e38917cb5..ac7f26ec6d 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vdprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vdprintf_chk.c
@@ -19,7 +19,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_vdprintf_chk (int d, int flag, const char *format, va_list ap)
+___ieee128___vdprintf_chk (int d, int flag, const char *format, va_list ap)
 {
   unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
   if (flag > 0)
@@ -27,4 +27,4 @@ ___ieee128_vdprintf_chk (int d, int flag, const char *format, va_list ap)
 
   return __vdprintf_internal (d, format, ap, mode);
 }
-strong_alias (___ieee128_vdprintf_chk, __vdprintf_chkieee128)
+strong_alias (___ieee128___vdprintf_chk, __vdprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfprintf_chk.c
index bf2ace508f..50c12265bc 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfprintf_chk.c
@@ -19,7 +19,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_vfprintf_chk (FILE *fp, int flag, const char *format, va_list ap)
+___ieee128___vfprintf_chk (FILE *fp, int flag, const char *format, va_list ap)
 {
   unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
   if (flag > 0)
@@ -27,4 +27,4 @@ ___ieee128_vfprintf_chk (FILE *fp, int flag, const char *format, va_list ap)
 
   return __vfprintf_internal (fp, format, ap, mode);
 }
-strong_alias (___ieee128_vfprintf_chk, __vfprintf_chkieee128)
+strong_alias (___ieee128___vfprintf_chk, __vfprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf_chk.c
index b2379176f2..a5005927dc 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfwprintf_chk.c
@@ -19,7 +19,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_vfwprintf_chk (FILE *fp, int flag, const wchar_t *format,
+___ieee128___vfwprintf_chk (FILE *fp, int flag, const wchar_t *format,
 			 va_list ap)
 {
   unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
@@ -28,4 +28,4 @@ ___ieee128_vfwprintf_chk (FILE *fp, int flag, const wchar_t *format,
 
   return __vfwprintf_internal (fp, format, ap, mode);
 }
-strong_alias (___ieee128_vfwprintf_chk, __vfwprintf_chkieee128)
+strong_alias (___ieee128___vfwprintf_chk, __vfwprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vprintf_chk.c
index ca718d06bb..1281e41b6f 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vprintf_chk.c
@@ -19,7 +19,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_vprintf_chk (int flag, const char *format, va_list ap)
+___ieee128___vprintf_chk (int flag, const char *format, va_list ap)
 {
   unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
   if (flag > 0)
@@ -27,4 +27,4 @@ ___ieee128_vprintf_chk (int flag, const char *format, va_list ap)
 
   return __vfprintf_internal (stdout, format, ap, mode);
 }
-strong_alias (___ieee128_vprintf_chk, __vprintf_chkieee128)
+strong_alias (___ieee128___vprintf_chk, __vprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsnprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsnprintf_chk.c
index 79d359b5d4..d91e8fa956 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsnprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsnprintf_chk.c
@@ -19,7 +19,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_vsnprintf_chk (char *string, size_t maxlen, int flag,
+___ieee128___vsnprintf_chk (char *string, size_t maxlen, int flag,
 			 size_t slen, const char *format, va_list ap)
 {
   if (__glibc_unlikely (slen < maxlen))
@@ -31,4 +31,4 @@ ___ieee128_vsnprintf_chk (char *string, size_t maxlen, int flag,
 
   return __vsnprintf_internal (string, maxlen, format, ap, mode);
 }
-strong_alias (___ieee128_vsnprintf_chk, __vsnprintf_chkieee128)
+strong_alias (___ieee128___vsnprintf_chk, __vsnprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c
index b4b2b2d14f..22137269c0 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c
@@ -19,7 +19,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_vsprintf_chk (char *string, int flag, size_t slen,
+___ieee128___vsprintf_chk (char *string, int flag, size_t slen,
 			const char *format, va_list ap)
 {
   unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
@@ -35,4 +35,4 @@ ___ieee128_vsprintf_chk (char *string, int flag, size_t slen,
 
   return __vsprintf_internal (string, slen, format, ap, mode);
 }
-strong_alias (___ieee128_vsprintf_chk, __vsprintf_chkieee128)
+strong_alias (___ieee128___vsprintf_chk, __vsprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf_chk.c
index 9cd56ba5d4..888513d3c6 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswprintf_chk.c
@@ -19,7 +19,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_vswprintf_chk (wchar_t *string, size_t maxlen, int flag,
+___ieee128___vswprintf_chk (wchar_t *string, size_t maxlen, int flag,
 			 size_t slen, const wchar_t *format, va_list ap)
 {
   unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
@@ -31,4 +31,4 @@ ___ieee128_vswprintf_chk (wchar_t *string, size_t maxlen, int flag,
 
   return __vswprintf_internal (string, maxlen, format, ap, mode);
 }
-strong_alias (___ieee128_vswprintf_chk, __vswprintf_chkieee128)
+strong_alias (___ieee128___vswprintf_chk, __vswprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf_chk.c
index 3861edf480..f61f2d6c44 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vwprintf_chk.c
@@ -19,7 +19,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_vwprintf_chk (int flag, const wchar_t *format, va_list ap)
+___ieee128___vwprintf_chk (int flag, const wchar_t *format, va_list ap)
 {
   unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
   if (flag > 0)
@@ -27,4 +27,4 @@ ___ieee128_vwprintf_chk (int flag, const wchar_t *format, va_list ap)
 
   return __vfwprintf_internal (stdout, format, ap, mode);
 }
-strong_alias (___ieee128_vwprintf_chk, __vwprintf_chkieee128)
+strong_alias (___ieee128___vwprintf_chk, __vwprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf_chk.c
index 440e0691cb..19d9a92dd2 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-wprintf_chk.c
@@ -20,7 +20,7 @@
 #include <libio/libioP.h>
 
 extern int
-___ieee128_wprintf_chk (int flag, const wchar_t *format, ...)
+___ieee128___wprintf_chk (int flag, const wchar_t *format, ...)
 {
   va_list ap;
   int done;
@@ -35,4 +35,4 @@ ___ieee128_wprintf_chk (int flag, const wchar_t *format, ...)
 
   return done;
 }
-strong_alias (___ieee128_wprintf_chk, __wprintf_chkieee128)
+strong_alias (___ieee128___wprintf_chk, __wprintf_chkieee128)
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 07/21] string: Ensure *_chk routines have their hidden builtin definition available
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (5 preceding siblings ...)
  2023-06-20 18:18 ` [PATCH 06/21] sysdeps: Ensure ieee128*_chk routines to be properly named Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 08/21] stdio: " Frédéric Bérat
                   ` (13 subsequent siblings)
  20 siblings, 0 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

If libc_hidden_builtin_{def,proto} isn't properly set for *_chk routines,
there are unwanted PLT entries in libc.so.
---
 debug/memcpy_chk.c                        | 1 +
 debug/memmove_chk.c                       | 1 +
 debug/mempcpy_chk.c                       | 1 +
 debug/memset_chk.c                        | 1 +
 debug/stpcpy_chk.c                        | 1 +
 include/string.h                          | 7 +++++++
 sysdeps/i386/i586/memcpy.S                | 1 +
 sysdeps/i386/i586/memset.S                | 1 +
 sysdeps/i386/i686/memcpy.S                | 1 +
 sysdeps/i386/i686/memmove.S               | 1 +
 sysdeps/i386/i686/mempcpy.S               | 1 +
 sysdeps/i386/i686/memset.S                | 1 +
 sysdeps/i386/i686/multiarch/memcpy_chk.c  | 4 ++++
 sysdeps/i386/i686/multiarch/memmove_chk.c | 4 ++++
 sysdeps/i386/i686/multiarch/mempcpy_chk.c | 4 ++++
 sysdeps/i386/i686/multiarch/memset_chk.c  | 5 ++++-
 sysdeps/i386/memcpy_chk.S                 | 1 +
 sysdeps/i386/memmove_chk.S                | 1 +
 sysdeps/i386/mempcpy_chk.S                | 1 +
 sysdeps/i386/memset_chk.S                 | 1 +
 sysdeps/x86_64/memcpy_chk.S               | 1 +
 sysdeps/x86_64/memmove_chk.S              | 1 +
 sysdeps/x86_64/mempcpy_chk.S              | 1 +
 sysdeps/x86_64/memset_chk.S               | 1 +
 sysdeps/x86_64/multiarch/memcpy_chk.c     | 4 ++++
 sysdeps/x86_64/multiarch/memmove_chk.c    | 4 ++++
 sysdeps/x86_64/multiarch/mempcpy_chk.c    | 4 ++++
 sysdeps/x86_64/multiarch/memset_chk.c     | 4 ++++
 28 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/debug/memcpy_chk.c b/debug/memcpy_chk.c
index c6dd94c83f..1e4a82c063 100644
--- a/debug/memcpy_chk.c
+++ b/debug/memcpy_chk.c
@@ -28,3 +28,4 @@ __memcpy_chk (void *dstpp, const void *srcpp, size_t len, size_t dstlen)
 
   return memcpy (dstpp, srcpp, len);
 }
+libc_hidden_builtin_def (__memcpy_chk)
diff --git a/debug/memmove_chk.c b/debug/memmove_chk.c
index 8922a1ba26..b714aa474c 100644
--- a/debug/memmove_chk.c
+++ b/debug/memmove_chk.c
@@ -32,3 +32,4 @@ MEMMOVE_CHK (void *dest, const void *src, size_t len, size_t destlen)
 
   return memmove (dest, src, len);
 }
+libc_hidden_builtin_def (MEMMOVE_CHK)
diff --git a/debug/mempcpy_chk.c b/debug/mempcpy_chk.c
index 17a46a3b4d..b47b14ee9a 100644
--- a/debug/mempcpy_chk.c
+++ b/debug/mempcpy_chk.c
@@ -29,3 +29,4 @@ __mempcpy_chk (void *dstpp, const void *srcpp, size_t len, size_t dstlen)
 
   return __mempcpy (dstpp, srcpp, len);
 }
+libc_hidden_builtin_def (__mempcpy_chk)
diff --git a/debug/memset_chk.c b/debug/memset_chk.c
index 4fc0b55d82..93901f5f34 100644
--- a/debug/memset_chk.c
+++ b/debug/memset_chk.c
@@ -26,3 +26,4 @@ __memset_chk (void *dstpp, int c, size_t len, size_t dstlen)
 
   return memset (dstpp, c, len);
 }
+libc_hidden_builtin_def (__memset_chk)
diff --git a/debug/stpcpy_chk.c b/debug/stpcpy_chk.c
index 230b52bd01..518dd78dca 100644
--- a/debug/stpcpy_chk.c
+++ b/debug/stpcpy_chk.c
@@ -32,3 +32,4 @@ __stpcpy_chk (char *dest, const char *src, size_t destlen)
 
   return memcpy (dest, src, len + 1) + len;
 }
+libc_hidden_builtin_def (__stpcpy_chk)
diff --git a/include/string.h b/include/string.h
index 0c78ad2539..659530d1aa 100644
--- a/include/string.h
+++ b/include/string.h
@@ -208,6 +208,13 @@ extern char *__strcat_chk (char *__restrict __dest,
 extern char *__strncat_chk (char *__restrict __dest,
 			    const char *__restrict __src,
 			    size_t __len, size_t __destlen) __THROW;
+
+libc_hidden_builtin_proto (__memcpy_chk)
+libc_hidden_builtin_proto (__memmove_chk)
+libc_hidden_builtin_proto (__mempcpy_chk)
+libc_hidden_builtin_proto (__memset_chk)
+libc_hidden_builtin_proto (__stpcpy_chk)
+
 #endif
 
 #endif
diff --git a/sysdeps/i386/i586/memcpy.S b/sysdeps/i386/i586/memcpy.S
index 58061d5adf..e3405e577c 100644
--- a/sysdeps/i386/i586/memcpy.S
+++ b/sysdeps/i386/i586/memcpy.S
@@ -32,6 +32,7 @@ ENTRY (__memcpy_chk)
 	cmpl	%eax, 16(%esp)
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
 END (__memcpy_chk)
+libc_hidden_builtin_def (__memcpy_chk)
 #endif
 ENTRY (memcpy)
 
diff --git a/sysdeps/i386/i586/memset.S b/sysdeps/i386/i586/memset.S
index 413e8ec6a9..f1f0e1a99b 100644
--- a/sysdeps/i386/i586/memset.S
+++ b/sysdeps/i386/i586/memset.S
@@ -33,6 +33,7 @@ ENTRY (__memset_chk)
 	cmpl	%eax, 16(%esp)
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
 END (__memset_chk)
+libc_hidden_builtin_def (__memset_chk)
 #endif
 ENTRY (memset)
 
diff --git a/sysdeps/i386/i686/memcpy.S b/sysdeps/i386/i686/memcpy.S
index 604d3088f6..9b48ec0ea1 100644
--- a/sysdeps/i386/i686/memcpy.S
+++ b/sysdeps/i386/i686/memcpy.S
@@ -33,6 +33,7 @@ ENTRY_CHK (__memcpy_chk)
 	cmpl	%eax, 16(%esp)
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
 END_CHK (__memcpy_chk)
+libc_hidden_builtin_def (__memcpy_chk)
 #endif
 ENTRY (memcpy)
 
diff --git a/sysdeps/i386/i686/memmove.S b/sysdeps/i386/i686/memmove.S
index cff06c27e5..06fe2a7668 100644
--- a/sysdeps/i386/i686/memmove.S
+++ b/sysdeps/i386/i686/memmove.S
@@ -35,6 +35,7 @@ ENTRY_CHK (__memmove_chk)
 	cmpl	%eax, 16(%esp)
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
 END_CHK (__memmove_chk)
+libc_hidden_builtin_def (__memmove_chk)
 #endif
 
 ENTRY (memmove)
diff --git a/sysdeps/i386/i686/mempcpy.S b/sysdeps/i386/i686/mempcpy.S
index af3f2cca08..26f8501e7d 100644
--- a/sysdeps/i386/i686/mempcpy.S
+++ b/sysdeps/i386/i686/mempcpy.S
@@ -33,6 +33,7 @@ ENTRY_CHK (__mempcpy_chk)
 	cmpl	%eax, 16(%esp)
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
 END_CHK (__mempcpy_chk)
+libc_hidden_builtin_def (__mempcpy_chk)
 #endif
 ENTRY (__mempcpy)
 
diff --git a/sysdeps/i386/i686/memset.S b/sysdeps/i386/i686/memset.S
index d4891880d7..0b5e671d83 100644
--- a/sysdeps/i386/i686/memset.S
+++ b/sysdeps/i386/i686/memset.S
@@ -33,6 +33,7 @@ ENTRY_CHK (__memset_chk)
 	cmpl	%eax, 16(%esp)
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
 END_CHK (__memset_chk)
+libc_hidden_builtin_def (__memset_chk)
 #endif
 ENTRY (memset)
 
diff --git a/sysdeps/i386/i686/multiarch/memcpy_chk.c b/sysdeps/i386/i686/multiarch/memcpy_chk.c
index 5ac5cb1d7a..ec945dc91f 100644
--- a/sysdeps/i386/i686/multiarch/memcpy_chk.c
+++ b/sysdeps/i386/i686/multiarch/memcpy_chk.c
@@ -28,4 +28,8 @@
 
 libc_ifunc_redirected (__redirect_memcpy_chk, __memcpy_chk,
 		       IFUNC_SELECTOR ());
+# ifdef SHARED
+__hidden_ver1 (__memcpy_chk, __GI___memcpy_chk, __redirect_memcpy_chk)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__memcpy_chk);
+# endif
 #endif
diff --git a/sysdeps/i386/i686/multiarch/memmove_chk.c b/sysdeps/i386/i686/multiarch/memmove_chk.c
index 28161d3c27..55c7601d5d 100644
--- a/sysdeps/i386/i686/multiarch/memmove_chk.c
+++ b/sysdeps/i386/i686/multiarch/memmove_chk.c
@@ -28,4 +28,8 @@
 
 libc_ifunc_redirected (__redirect_memmove_chk, __memmove_chk,
 		       IFUNC_SELECTOR ());
+# ifdef SHARED
+__hidden_ver1 (__memmove_chk, __GI___memmove_chk, __redirect_memmove_chk)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__memmove_chk);
+# endif
 #endif
diff --git a/sysdeps/i386/i686/multiarch/mempcpy_chk.c b/sysdeps/i386/i686/multiarch/mempcpy_chk.c
index 36c81ae61a..83569cf9d9 100644
--- a/sysdeps/i386/i686/multiarch/mempcpy_chk.c
+++ b/sysdeps/i386/i686/multiarch/mempcpy_chk.c
@@ -28,4 +28,8 @@
 
 libc_ifunc_redirected (__redirect_mempcpy_chk, __mempcpy_chk,
 		       IFUNC_SELECTOR ());
+# ifdef SHARED
+__hidden_ver1 (__mempcpy_chk, __GI___mempcpy_chk, __redirect_mempcpy_chk)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__mempcpy_chk);
+# endif
 #endif
diff --git a/sysdeps/i386/i686/multiarch/memset_chk.c b/sysdeps/i386/i686/multiarch/memset_chk.c
index cf3e811327..1a7503858d 100644
--- a/sysdeps/i386/i686/multiarch/memset_chk.c
+++ b/sysdeps/i386/i686/multiarch/memset_chk.c
@@ -28,5 +28,8 @@
 
 libc_ifunc_redirected (__redirect_memset_chk, __memset_chk,
 		       IFUNC_SELECTOR ());
-
+# ifdef SHARED
+__hidden_ver1 (__memset_chk, __GI___memset_chk, __redirect_memset_chk)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__memset_chk);
+# endif
 #endif
diff --git a/sysdeps/i386/memcpy_chk.S b/sysdeps/i386/memcpy_chk.S
index b5244cc69b..7b12c12aba 100644
--- a/sysdeps/i386/memcpy_chk.S
+++ b/sysdeps/i386/memcpy_chk.S
@@ -31,4 +31,5 @@ ENTRY (__memcpy_chk)
 	jb	__chk_fail
 	jmp	memcpy
 END (__memcpy_chk)
+libc_hidden_builtin_def (__memcpy_chk)
 #endif
diff --git a/sysdeps/i386/memmove_chk.S b/sysdeps/i386/memmove_chk.S
index 517d8cb15a..604aea8305 100644
--- a/sysdeps/i386/memmove_chk.S
+++ b/sysdeps/i386/memmove_chk.S
@@ -30,4 +30,5 @@ ENTRY (__memmove_chk)
 	jb	__chk_fail
 	jmp	memmove
 END (__memmove_chk)
+libc_hidden_builtin_def (MEMMOVE_CHK)
 #endif
diff --git a/sysdeps/i386/mempcpy_chk.S b/sysdeps/i386/mempcpy_chk.S
index 1e9bf71bfb..276eab1e8a 100644
--- a/sysdeps/i386/mempcpy_chk.S
+++ b/sysdeps/i386/mempcpy_chk.S
@@ -30,4 +30,5 @@ ENTRY (__mempcpy_chk)
 	jb	__chk_fail
 	jmp	__mempcpy
 END (__mempcpy_chk)
+libc_hidden_builtin_def (__mempcpy_chk)
 #endif
diff --git a/sysdeps/i386/memset_chk.S b/sysdeps/i386/memset_chk.S
index 0e6060a0a6..a2e9208e1c 100644
--- a/sysdeps/i386/memset_chk.S
+++ b/sysdeps/i386/memset_chk.S
@@ -30,4 +30,5 @@ ENTRY (__memset_chk)
 	jb	__chk_fail
 	jmp	memset
 END (__memset_chk)
+libc_hidden_builtin_def (__memset_chk)
 #endif
diff --git a/sysdeps/x86_64/memcpy_chk.S b/sysdeps/x86_64/memcpy_chk.S
index 25cbeb37ee..43843a7abb 100644
--- a/sysdeps/x86_64/memcpy_chk.S
+++ b/sysdeps/x86_64/memcpy_chk.S
@@ -30,4 +30,5 @@ ENTRY (__memcpy_chk)
 	jb	__chk_fail
 	jmp	memcpy
 END (__memcpy_chk)
+libc_hidden_builtin_def (__memcpy_chk)
 #endif
diff --git a/sysdeps/x86_64/memmove_chk.S b/sysdeps/x86_64/memmove_chk.S
index 165d42cfa8..37e2c30ba8 100644
--- a/sysdeps/x86_64/memmove_chk.S
+++ b/sysdeps/x86_64/memmove_chk.S
@@ -30,4 +30,5 @@ ENTRY (__memmove_chk)
 	jb	__chk_fail
 	jmp	memmove
 END (__memmove_chk)
+libc_hidden_builtin_def (MEMMOVE_CHK)
 #endif
diff --git a/sysdeps/x86_64/mempcpy_chk.S b/sysdeps/x86_64/mempcpy_chk.S
index b60ee4ff08..facdac50d8 100644
--- a/sysdeps/x86_64/mempcpy_chk.S
+++ b/sysdeps/x86_64/mempcpy_chk.S
@@ -30,4 +30,5 @@ ENTRY (__mempcpy_chk)
 	jb	__chk_fail
 	jmp	__mempcpy
 END (__mempcpy_chk)
+libc_hidden_builtin_def (__mempcpy_chk)
 #endif
diff --git a/sysdeps/x86_64/memset_chk.S b/sysdeps/x86_64/memset_chk.S
index ed53b8927f..c927884b1a 100644
--- a/sysdeps/x86_64/memset_chk.S
+++ b/sysdeps/x86_64/memset_chk.S
@@ -30,4 +30,5 @@ ENTRY (__memset_chk)
 	jb	__chk_fail
 	jmp	memset
 END (__memset_chk)
+libc_hidden_builtin_def (__memset_chk)
 #endif
diff --git a/sysdeps/x86_64/multiarch/memcpy_chk.c b/sysdeps/x86_64/multiarch/memcpy_chk.c
index 5ac5cb1d7a..ec945dc91f 100644
--- a/sysdeps/x86_64/multiarch/memcpy_chk.c
+++ b/sysdeps/x86_64/multiarch/memcpy_chk.c
@@ -28,4 +28,8 @@
 
 libc_ifunc_redirected (__redirect_memcpy_chk, __memcpy_chk,
 		       IFUNC_SELECTOR ());
+# ifdef SHARED
+__hidden_ver1 (__memcpy_chk, __GI___memcpy_chk, __redirect_memcpy_chk)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__memcpy_chk);
+# endif
 #endif
diff --git a/sysdeps/x86_64/multiarch/memmove_chk.c b/sysdeps/x86_64/multiarch/memmove_chk.c
index 28161d3c27..55c7601d5d 100644
--- a/sysdeps/x86_64/multiarch/memmove_chk.c
+++ b/sysdeps/x86_64/multiarch/memmove_chk.c
@@ -28,4 +28,8 @@
 
 libc_ifunc_redirected (__redirect_memmove_chk, __memmove_chk,
 		       IFUNC_SELECTOR ());
+# ifdef SHARED
+__hidden_ver1 (__memmove_chk, __GI___memmove_chk, __redirect_memmove_chk)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__memmove_chk);
+# endif
 #endif
diff --git a/sysdeps/x86_64/multiarch/mempcpy_chk.c b/sysdeps/x86_64/multiarch/mempcpy_chk.c
index 36c81ae61a..83569cf9d9 100644
--- a/sysdeps/x86_64/multiarch/mempcpy_chk.c
+++ b/sysdeps/x86_64/multiarch/mempcpy_chk.c
@@ -28,4 +28,8 @@
 
 libc_ifunc_redirected (__redirect_mempcpy_chk, __mempcpy_chk,
 		       IFUNC_SELECTOR ());
+# ifdef SHARED
+__hidden_ver1 (__mempcpy_chk, __GI___mempcpy_chk, __redirect_mempcpy_chk)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__mempcpy_chk);
+# endif
 #endif
diff --git a/sysdeps/x86_64/multiarch/memset_chk.c b/sysdeps/x86_64/multiarch/memset_chk.c
index d81147a70c..1a7503858d 100644
--- a/sysdeps/x86_64/multiarch/memset_chk.c
+++ b/sysdeps/x86_64/multiarch/memset_chk.c
@@ -28,4 +28,8 @@
 
 libc_ifunc_redirected (__redirect_memset_chk, __memset_chk,
 		       IFUNC_SELECTOR ());
+# ifdef SHARED
+__hidden_ver1 (__memset_chk, __GI___memset_chk, __redirect_memset_chk)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__memset_chk);
+# endif
 #endif
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 08/21] stdio: Ensure *_chk routines have their hidden builtin definition available
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (6 preceding siblings ...)
  2023-06-20 18:18 ` [PATCH 07/21] string: Ensure *_chk routines have their hidden builtin definition available Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 09/21] asprintf_chk: Ensure compatibility for both s390x and ppc64le Frédéric Bérat
                   ` (12 subsequent siblings)
  20 siblings, 0 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

If libc_hidden_builtin_{def,proto} isn't properly set for *_chk routines,
there are unwanted PLT entries in libc.so.
---
 debug/asprintf_chk.c                                      | 4 +++-
 debug/fgets_u_chk.c                                       | 1 +
 debug/fprintf_chk.c                                       | 1 +
 debug/sprintf_chk.c                                       | 1 +
 include/stdio.h                                           | 8 +++++++-
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c | 1 +
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c  | 1 +
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c  | 1 +
 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c | 1 +
 9 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/debug/asprintf_chk.c b/debug/asprintf_chk.c
index 651c2cd76b..06d112de00 100644
--- a/debug/asprintf_chk.c
+++ b/debug/asprintf_chk.c
@@ -22,7 +22,7 @@
 /* Write formatted output from FORMAT to a string which is
    allocated with malloc and stored in *STRING_PTR.  */
 int
-__asprintf_chk (char **result_ptr, int flag, const char *format, ...)
+___asprintf_chk (char **result_ptr, int flag, const char *format, ...)
 {
   /* For flag > 0 (i.e. __USE_FORTIFY_LEVEL > 1) request that %n
      can only come from read-only format strings.  */
@@ -36,3 +36,5 @@ __asprintf_chk (char **result_ptr, int flag, const char *format, ...)
 
   return ret;
 }
+ldbl_hidden_def (___asprintf_chk, __asprintf_chk)
+ldbl_strong_alias (___asprintf_chk, __asprintf_chk)
diff --git a/debug/fgets_u_chk.c b/debug/fgets_u_chk.c
index a16ba655e6..74275381f5 100644
--- a/debug/fgets_u_chk.c
+++ b/debug/fgets_u_chk.c
@@ -56,3 +56,4 @@ __fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp)
   fp->_flags |= old_error;
   return result;
 }
+libc_hidden_builtin_def (__fgets_unlocked_chk)
diff --git a/debug/fprintf_chk.c b/debug/fprintf_chk.c
index b57d538d03..273051ef91 100644
--- a/debug/fprintf_chk.c
+++ b/debug/fprintf_chk.c
@@ -35,4 +35,5 @@ ___fprintf_chk (FILE *fp, int flag, const char *format, ...)
 
   return ret;
 }
+ldbl_hidden_def (___fprintf_chk, __fprintf_chk)
 ldbl_strong_alias (___fprintf_chk, __fprintf_chk)
diff --git a/debug/sprintf_chk.c b/debug/sprintf_chk.c
index b27f4afae8..e45f1e7b3b 100644
--- a/debug/sprintf_chk.c
+++ b/debug/sprintf_chk.c
@@ -42,4 +42,5 @@ ___sprintf_chk (char *s, int flag, size_t slen, const char *format, ...)
 
   return ret;
 }
+ldbl_hidden_def (___sprintf_chk, __sprintf_chk)
 ldbl_strong_alias (___sprintf_chk, __sprintf_chk)
diff --git a/include/stdio.h b/include/stdio.h
index da47d1ce99..3afb0ff77b 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -276,7 +276,13 @@ extern FILE *__open_memstream (char **, size_t *) __THROW __wur;
 libc_hidden_proto (__open_memstream)
 libc_hidden_proto (__libc_fatal)
 rtld_hidden_proto (__libc_fatal)
-libc_hidden_proto (__vsprintf_chk)
+
+libc_hidden_proto (__fgets_unlocked_chk)
+
+libc_hidden_ldbl_proto (__asprintf_chk)
+libc_hidden_ldbl_proto (__fprintf_chk)
+libc_hidden_ldbl_proto (__sprintf_chk)
+libc_hidden_ldbl_proto (__vsprintf_chk)
 
 extern FILE * __fmemopen (void *buf, size_t len, const char *mode);
 libc_hidden_proto (__fmemopen)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c
index fbf953a728..6e93ee81fc 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c
@@ -35,4 +35,5 @@ ___ieee128___asprintf_chk (char **string_ptr, int flag, const char *format, ...)
 
   return done;
 }
+hidden_def (___ieee128___asprintf_chk)
 strong_alias (___ieee128___asprintf_chk, __asprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c
index bd10e9c3db..e0865b6663 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c
@@ -35,4 +35,5 @@ ___ieee128___fprintf_chk (FILE *fp, int flag, const char *format, ...)
 
   return done;
 }
+hidden_def (___ieee128___fprintf_chk)
 strong_alias (___ieee128___fprintf_chk, __fprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c
index 0039c3b53d..762757a5c7 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c
@@ -43,4 +43,5 @@ ___ieee128___sprintf_chk (char *s, int flag, size_t slen,
 
   return done;
 }
+hidden_def (___ieee128___sprintf_chk)
 strong_alias (___ieee128___sprintf_chk, __sprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c
index 22137269c0..c251b60d4e 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c
@@ -35,4 +35,5 @@ ___ieee128___vsprintf_chk (char *string, int flag, size_t slen,
 
   return __vsprintf_internal (string, slen, format, ap, mode);
 }
+hidden_def (___ieee128___vsprintf_chk)
 strong_alias (___ieee128___vsprintf_chk, __vsprintf_chkieee128)
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 09/21] asprintf_chk: Ensure compatibility for both s390x and ppc64le
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (7 preceding siblings ...)
  2023-06-20 18:18 ` [PATCH 08/21] stdio: " Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 10/21] misc/sys/cdefs.h: Create FORTIFY redirects for internal calls Frédéric Bérat
                   ` (11 subsequent siblings)
  20 siblings, 0 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

If ldbl_* macros are used for asprintf, ABI gets broken on s390x,
if it isn't, ppc64le isn't building due to multiple asm redirections.

This is due to the inclusion of bits/stdio-lbdl.h for ppc64le whereas it
isn't for s390x. This header creates redirections, which are not
compatible with the ones generated using libc_hidden_builtin_def.
Yet, we can't use libc_hidden_ldbl_proto on s390x since it will not
create a simple strong alias (e.g. as done on x86_64), but a versioned
alias, leading to ABI breakage.
---
 debug/asprintf_chk.c | 12 ++++++++++++
 include/stdio.h      |  5 +++++
 2 files changed, 17 insertions(+)

diff --git a/debug/asprintf_chk.c b/debug/asprintf_chk.c
index 06d112de00..7da1cddacb 100644
--- a/debug/asprintf_chk.c
+++ b/debug/asprintf_chk.c
@@ -36,5 +36,17 @@ ___asprintf_chk (char **result_ptr, int flag, const char *format, ...)
 
   return ret;
 }
+#if defined __LDBL_COMPAT || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+/* This is needed since <bits/stdio-lbdl.h> is included in this case, leading to
+ * multiple asm redirection of the same symbol
+ */
 ldbl_hidden_def (___asprintf_chk, __asprintf_chk)
 ldbl_strong_alias (___asprintf_chk, __asprintf_chk)
+#else
+/* Yet, we can't use ldbl_* macros on some systems, even if they don't fall in
+ * the first case as this leads to ABI breakage due to the long_double_symbol
+ * aliasing, which is versionned.
+ */
+strong_alias (___asprintf_chk, __asprintf_chk)
+libc_hidden_builtin_def (__asprintf_chk)
+#endif
diff --git a/include/stdio.h b/include/stdio.h
index 3afb0ff77b..6755877911 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -279,7 +279,12 @@ rtld_hidden_proto (__libc_fatal)
 
 libc_hidden_proto (__fgets_unlocked_chk)
 
+#if defined __LDBL_COMPAT || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
 libc_hidden_ldbl_proto (__asprintf_chk)
+#else
+libc_hidden_proto (__asprintf_chk)
+#endif
+
 libc_hidden_ldbl_proto (__fprintf_chk)
 libc_hidden_ldbl_proto (__sprintf_chk)
 libc_hidden_ldbl_proto (__vsprintf_chk)
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 10/21] misc/sys/cdefs.h: Create FORTIFY redirects for internal calls
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (8 preceding siblings ...)
  2023-06-20 18:18 ` [PATCH 09/21] asprintf_chk: Ensure compatibility for both s390x and ppc64le Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-20 18:18 ` [PATCH 11/21] wcsmbs/bits/wchar2{,-decl}.h: Clearly separate declaration from definitions Frédéric Bérat
                   ` (10 subsequent siblings)
  20 siblings, 0 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

The __REDIRECT* macros are creating aliases which may lead to unwanted
PLT entries when fortification is enabled.
To prevent these entries, the REDIRECT alias should be set to point to the
existing __GI_* aliases.
This is done transparently by creating a __REDIRECT_FORTIFY* version of
these macros, that can be overwritten internally when necessary.
---
 include/sys/cdefs.h | 14 ++++++++++++++
 misc/sys/cdefs.h    |  8 ++++++++
 2 files changed, 22 insertions(+)

diff --git a/include/sys/cdefs.h b/include/sys/cdefs.h
index 56adb231aa..b84ad34a70 100644
--- a/include/sys/cdefs.h
+++ b/include/sys/cdefs.h
@@ -40,6 +40,20 @@ rtld_hidden_proto (__chk_fail)
 
 #endif
 
+#if defined SHARED
+#if IS_IN (libc) && __USE_FORTIFY_LEVEL > 0 && defined __fortify_function
+
+#undef __REDIRECT_FORTIFY
+#define __REDIRECT_FORTIFY(name, proto, alias) \
+  __REDIRECT(name, proto, __GI_##alias)
+
+#undef __REDIRECT_FORTIFY_NTH
+#define __REDIRECT_FORTIFY_NTH(name, proto, alias) \
+  __REDIRECT_NTH(name, proto, __GI_##alias)
+
+#endif
+#endif /* defined SHARED */
+
 #endif /* !defined _ISOMAC */
 
 #endif
diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
index 393d9091d9..90c21e2703 100644
--- a/misc/sys/cdefs.h
+++ b/misc/sys/cdefs.h
@@ -268,6 +268,14 @@
 # define __ASMNAME(cname)  __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
 # define __ASMNAME2(prefix, cname) __STRING (prefix) cname
 
+#ifndef __REDIRECT_FORTIFY
+#define __REDIRECT_FORTIFY __REDIRECT
+#endif
+
+#ifndef __REDIRECT_FORTIFY_NTH
+#define __REDIRECT_FORTIFY_NTH __REDIRECT_NTH
+#endif
+
 /*
 #elif __SOME_OTHER_COMPILER__
 
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 11/21] wcsmbs/bits/wchar2{,-decl}.h: Clearly separate declaration from definitions
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (9 preceding siblings ...)
  2023-06-20 18:18 ` [PATCH 10/21] misc/sys/cdefs.h: Create FORTIFY redirects for internal calls Frédéric Bérat
@ 2023-06-20 18:18 ` Frédéric Bérat
  2023-06-22  4:19   ` Siddhesh Poyarekar
  2023-06-20 18:19 ` [PATCH 12/21] wcsmbs/bits/wchar2{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE Frédéric Bérat
                   ` (9 subsequent siblings)
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:18 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

This will enable __REDIRECT_FORTIFY* macros to be used when _FORTIFY_SOURCE
is set.

Routine declarations that were in bits/wchar2.h are moved into the
bits/wchar2-decl.h file.
The file is now included into include/wchar.h irrespectively from
fortification.
---
 include/wchar.h           |   1 +
 wcsmbs/bits/wchar2-decl.h | 172 ++++++++++++++++++++++++++++++++++
 wcsmbs/bits/wchar2.h      | 192 --------------------------------------
 3 files changed, 173 insertions(+), 192 deletions(-)

diff --git a/include/wchar.h b/include/wchar.h
index ff4ae52045..7b763bc24f 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -12,6 +12,7 @@
 # ifndef _ISOMAC
 
 #include <bits/floatn.h>
+#include <bits/wchar2-decl.h>
 #include <stdbool.h>
 
 extern __typeof (wcscasecmp_l) __wcscasecmp_l;
diff --git a/wcsmbs/bits/wchar2-decl.h b/wcsmbs/bits/wchar2-decl.h
index 3a23069d3e..f3a2fd3c99 100644
--- a/wcsmbs/bits/wchar2-decl.h
+++ b/wcsmbs/bits/wchar2-decl.h
@@ -27,8 +27,27 @@
 extern wchar_t *__wmemcpy_chk (wchar_t *__restrict __s1,
 			       const wchar_t *__restrict __s2, size_t __n,
 			       size_t __ns1) __THROW;
+extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias,
+				(wchar_t *__restrict __s1,
+				 const wchar_t *__restrict __s2, size_t __n),
+				wmemcpy);
+extern wchar_t *__REDIRECT_NTH (__wmemcpy_chk_warn,
+				(wchar_t *__restrict __s1,
+				 const wchar_t *__restrict __s2, size_t __n,
+				 size_t __ns1), __wmemcpy_chk)
+     __warnattr ("wmemcpy called with length bigger than size of destination "
+		 "buffer");
+
 extern wchar_t *__wmemmove_chk (wchar_t *__s1, const wchar_t *__s2,
 				size_t __n, size_t __ns1) __THROW;
+extern wchar_t *__REDIRECT_NTH (__wmemmove_alias, (wchar_t *__s1,
+						   const wchar_t *__s2,
+						   size_t __n), wmemmove);
+extern wchar_t *__REDIRECT_NTH (__wmemmove_chk_warn,
+				(wchar_t *__s1, const wchar_t *__s2,
+				 size_t __n, size_t __ns1), __wmemmove_chk)
+     __warnattr ("wmemmove called with length bigger than size of destination "
+		 "buffer");
 
 
 #ifdef __USE_GNU
@@ -36,39 +55,107 @@ extern wchar_t *__wmemmove_chk (wchar_t *__s1, const wchar_t *__s2,
 extern wchar_t *__wmempcpy_chk (wchar_t *__restrict __s1,
 				const wchar_t *__restrict __s2, size_t __n,
 				size_t __ns1) __THROW;
+extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias,
+				(wchar_t *__restrict __s1,
+				 const wchar_t *__restrict __s2,
+				 size_t __n), wmempcpy);
+extern wchar_t *__REDIRECT_NTH (__wmempcpy_chk_warn,
+				(wchar_t *__restrict __s1,
+				 const wchar_t *__restrict __s2, size_t __n,
+				 size_t __ns1), __wmempcpy_chk)
+     __warnattr ("wmempcpy called with length bigger than size of destination "
+		 "buffer");
 
 #endif
 
 
 extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
 			       size_t __ns) __THROW;
+extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
+							  size_t __n), wmemset);
+extern wchar_t *__REDIRECT_NTH (__wmemset_chk_warn,
+				(wchar_t *__s, wchar_t __c, size_t __n,
+				 size_t __ns), __wmemset_chk)
+     __warnattr ("wmemset called with length bigger than size of destination "
+		 "buffer");
+
 extern wchar_t *__wcscpy_chk (wchar_t *__restrict __dest,
 			      const wchar_t *__restrict __src,
 			      size_t __n) __THROW;
+extern wchar_t *__REDIRECT_NTH (__wcscpy_alias,
+				(wchar_t *__restrict __dest,
+				 const wchar_t *__restrict __src), wcscpy);
+
 extern wchar_t *__wcpcpy_chk (wchar_t *__restrict __dest,
 			      const wchar_t *__restrict __src,
 			      size_t __destlen) __THROW;
+extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias,
+				(wchar_t *__restrict __dest,
+				 const wchar_t *__restrict __src), wcpcpy);
+
 extern wchar_t *__wcsncpy_chk (wchar_t *__restrict __dest,
 			       const wchar_t *__restrict __src, size_t __n,
 			       size_t __destlen) __THROW;
+extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias,
+				(wchar_t *__restrict __dest,
+				 const wchar_t *__restrict __src,
+				 size_t __n), wcsncpy);
+extern wchar_t *__REDIRECT_NTH (__wcsncpy_chk_warn,
+				(wchar_t *__restrict __dest,
+				 const wchar_t *__restrict __src,
+				 size_t __n, size_t __destlen), __wcsncpy_chk)
+     __warnattr ("wcsncpy called with length bigger than size of destination "
+		 "buffer");
+
 extern wchar_t *__wcpncpy_chk (wchar_t *__restrict __dest,
 			       const wchar_t *__restrict __src, size_t __n,
 			       size_t __destlen) __THROW;
+
+extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias,
+				(wchar_t *__restrict __dest,
+				 const wchar_t *__restrict __src,
+				 size_t __n), wcpncpy);
+extern wchar_t *__REDIRECT_NTH (__wcpncpy_chk_warn,
+				(wchar_t *__restrict __dest,
+				 const wchar_t *__restrict __src,
+				 size_t __n, size_t __destlen), __wcpncpy_chk)
+     __warnattr ("wcpncpy called with length bigger than size of destination "
+		 "buffer");
+
 extern wchar_t *__wcscat_chk (wchar_t *__restrict __dest,
 			      const wchar_t *__restrict __src,
 			      size_t __destlen) __THROW;
+extern wchar_t *__REDIRECT_NTH (__wcscat_alias,
+				(wchar_t *__restrict __dest,
+				 const wchar_t *__restrict __src), wcscat);
+
 extern wchar_t *__wcsncat_chk (wchar_t *__restrict __dest,
 			       const wchar_t *__restrict __src,
 			       size_t __n, size_t __destlen) __THROW;
+extern wchar_t *__REDIRECT_NTH (__wcsncat_alias,
+				(wchar_t *__restrict __dest,
+				 const wchar_t *__restrict __src,
+				 size_t __n), wcsncat);
+
 extern int __swprintf_chk (wchar_t *__restrict __s, size_t __n,
 			   int __flag, size_t __s_len,
 			   const wchar_t *__restrict __format, ...)
      __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */;
+extern int __REDIRECT_NTH_LDBL (__swprintf_alias,
+				(wchar_t *__restrict __s, size_t __n,
+				 const wchar_t *__restrict __fmt, ...),
+				swprintf);
+
 extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
 			    int __flag, size_t __s_len,
 			    const wchar_t *__restrict __format,
 			    __gnuc_va_list __arg)
      __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
+extern int __REDIRECT_NTH_LDBL (__vswprintf_alias,
+				(wchar_t *__restrict __s, size_t __n,
+				 const wchar_t *__restrict __fmt,
+				 __gnuc_va_list __ap), vswprintf);
+
 
 #if __USE_FORTIFY_LEVEL > 1
 
@@ -86,26 +173,72 @@ extern int __vwprintf_chk (int __flag, const wchar_t *__restrict __format,
 
 extern wchar_t *__fgetws_chk (wchar_t *__restrict __s, size_t __size, int __n,
 			      __FILE *__restrict __stream) __wur;
+extern wchar_t *__REDIRECT (__fgetws_alias,
+			    (wchar_t *__restrict __s, int __n,
+			     __FILE *__restrict __stream), fgetws) __wur;
+extern wchar_t *__REDIRECT (__fgetws_chk_warn,
+			    (wchar_t *__restrict __s, size_t __size, int __n,
+			     __FILE *__restrict __stream), __fgetws_chk)
+     __wur __warnattr ("fgetws called with bigger size than length "
+		       "of destination buffer");
 
 #ifdef __USE_GNU
 
 extern wchar_t *__fgetws_unlocked_chk (wchar_t *__restrict __s, size_t __size,
 				       int __n, __FILE *__restrict __stream)
        __wur;
+extern wchar_t *__REDIRECT (__fgetws_unlocked_alias,
+			    (wchar_t *__restrict __s, int __n,
+			     __FILE *__restrict __stream), fgetws_unlocked)
+  __wur;
+extern wchar_t *__REDIRECT (__fgetws_unlocked_chk_warn,
+			    (wchar_t *__restrict __s, size_t __size, int __n,
+			     __FILE *__restrict __stream),
+			    __fgetws_unlocked_chk)
+     __wur __warnattr ("fgetws_unlocked called with bigger size than length "
+		       "of destination buffer");
 
 #endif
 
 extern size_t __wcrtomb_chk (char *__restrict __s, wchar_t __wchar,
 			     mbstate_t *__restrict __p,
 			     size_t __buflen) __THROW __wur;
+extern size_t __REDIRECT_NTH (__wcrtomb_alias,
+				      (char *__restrict __s, wchar_t __wchar,
+				      mbstate_t *__restrict __ps), wcrtomb) __wur;
+
 extern size_t __mbsrtowcs_chk (wchar_t *__restrict __dst,
 			       const char **__restrict __src,
 			       size_t __len, mbstate_t *__restrict __ps,
 			       size_t __dstlen) __THROW;
+extern size_t __REDIRECT_NTH (__mbsrtowcs_alias,
+			      (wchar_t *__restrict __dst,
+			       const char **__restrict __src,
+			       size_t __len, mbstate_t *__restrict __ps),
+			      mbsrtowcs);
+extern size_t __REDIRECT_NTH (__mbsrtowcs_chk_warn,
+			      (wchar_t *__restrict __dst,
+			       const char **__restrict __src,
+			       size_t __len, mbstate_t *__restrict __ps,
+			       size_t __dstlen), __mbsrtowcs_chk)
+     __warnattr ("mbsrtowcs called with dst buffer smaller than len "
+		 "* sizeof (wchar_t)");
+
 extern size_t __wcsrtombs_chk (char *__restrict __dst,
 			       const wchar_t **__restrict __src,
 			       size_t __len, mbstate_t *__restrict __ps,
 			       size_t __dstlen) __THROW;
+extern size_t __REDIRECT_NTH (__wcsrtombs_alias,
+			      (char *__restrict __dst,
+			       const wchar_t **__restrict __src,
+			       size_t __len, mbstate_t *__restrict __ps),
+			      wcsrtombs);
+extern size_t __REDIRECT_NTH (__wcsrtombs_chk_warn,
+			      (char *__restrict __dst,
+			       const wchar_t **__restrict __src,
+			       size_t __len, mbstate_t *__restrict __ps,
+			       size_t __dstlen), __wcsrtombs_chk)
+    __warnattr ("wcsrtombs called with dst buffer smaller than len");
 
 #ifdef	__USE_XOPEN2K8
 
@@ -113,12 +246,51 @@ extern size_t __mbsnrtowcs_chk (wchar_t *__restrict __dst,
 				const char **__restrict __src, size_t __nmc,
 				size_t __len, mbstate_t *__restrict __ps,
 				size_t __dstlen) __THROW;
+extern size_t __REDIRECT_NTH (__mbsnrtowcs_alias,
+			      (wchar_t *__restrict __dst,
+			       const char **__restrict __src, size_t __nmc,
+			       size_t __len, mbstate_t *__restrict __ps),
+			      mbsnrtowcs);
+extern size_t __REDIRECT_NTH (__mbsnrtowcs_chk_warn,
+			      (wchar_t *__restrict __dst,
+			       const char **__restrict __src, size_t __nmc,
+			       size_t __len, mbstate_t *__restrict __ps,
+			       size_t __dstlen), __mbsnrtowcs_chk)
+     __warnattr ("mbsnrtowcs called with dst buffer smaller than len "
+		 "* sizeof (wchar_t)");
+
 extern size_t __wcsnrtombs_chk (char *__restrict __dst,
 				const wchar_t **__restrict __src,
 				size_t __nwc, size_t __len,
 				mbstate_t *__restrict __ps, size_t __dstlen)
        __THROW;
+extern size_t __REDIRECT_NTH (__wcsnrtombs_alias,
+			      (char *__restrict __dst,
+			       const wchar_t **__restrict __src,
+			       size_t __nwc, size_t __len,
+			       mbstate_t *__restrict __ps), wcsnrtombs);
+extern size_t __REDIRECT_NTH (__wcsnrtombs_chk_warn,
+			      (char *__restrict __dst,
+			       const wchar_t **__restrict __src,
+			       size_t __nwc, size_t __len,
+			       mbstate_t *__restrict __ps,
+			       size_t __dstlen), __wcsnrtombs_chk)
+     __warnattr ("wcsnrtombs called with dst buffer smaller than len");
 
 #endif
 
+#ifdef __USE_MISC
+extern size_t __wcslcpy_chk (wchar_t *__dest, const wchar_t *__src, size_t __n,
+			     size_t __destlen) __THROW;
+extern size_t __REDIRECT_NTH (__wcslcpy_alias,
+			      (wchar_t *__dest, const wchar_t *__src,
+			       size_t __n), wcslcpy);
+
+extern size_t __wcslcat_chk (wchar_t *__dest, const wchar_t *__src, size_t __n,
+			     size_t __destlen) __THROW;
+extern size_t __REDIRECT_NTH (__wcslcat_alias,
+			      (wchar_t *__dest, const wchar_t *__src,
+			       size_t __n), wcslcat);
+#endif /* __USE_MISC */
+
 #endif /* bits/wchar2-decl.h.  */
diff --git a/wcsmbs/bits/wchar2.h b/wcsmbs/bits/wchar2.h
index 9def8e9852..6e6234d606 100644
--- a/wcsmbs/bits/wchar2.h
+++ b/wcsmbs/bits/wchar2.h
@@ -20,18 +20,6 @@
 # error "Never include <bits/wchar2.h> directly; use <wchar.h> instead."
 #endif
 
-
-extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias,
-				(wchar_t *__restrict __s1,
-				 const wchar_t *__restrict __s2, size_t __n),
-				wmemcpy);
-extern wchar_t *__REDIRECT_NTH (__wmemcpy_chk_warn,
-				(wchar_t *__restrict __s1,
-				 const wchar_t *__restrict __s2, size_t __n,
-				 size_t __ns1), __wmemcpy_chk)
-     __warnattr ("wmemcpy called with length bigger than size of destination "
-		 "buffer");
-
 __fortify_function wchar_t *
 __NTH (wmemcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
 		size_t __n))
@@ -41,16 +29,6 @@ __NTH (wmemcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
 			    __s1, __s2, __n);
 }
 
-
-extern wchar_t *__REDIRECT_NTH (__wmemmove_alias, (wchar_t *__s1,
-						   const wchar_t *__s2,
-						   size_t __n), wmemmove);
-extern wchar_t *__REDIRECT_NTH (__wmemmove_chk_warn,
-				(wchar_t *__s1, const wchar_t *__s2,
-				 size_t __n, size_t __ns1), __wmemmove_chk)
-     __warnattr ("wmemmove called with length bigger than size of destination "
-		 "buffer");
-
 __fortify_function wchar_t *
 __NTH (wmemmove (wchar_t *__s1, const wchar_t *__s2, size_t __n))
 {
@@ -59,19 +37,7 @@ __NTH (wmemmove (wchar_t *__s1, const wchar_t *__s2, size_t __n))
 			    __s1, __s2, __n);
 }
 
-
 #ifdef __USE_GNU
-extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias,
-				(wchar_t *__restrict __s1,
-				 const wchar_t *__restrict __s2,
-				 size_t __n), wmempcpy);
-extern wchar_t *__REDIRECT_NTH (__wmempcpy_chk_warn,
-				(wchar_t *__restrict __s1,
-				 const wchar_t *__restrict __s2, size_t __n,
-				 size_t __ns1), __wmempcpy_chk)
-     __warnattr ("wmempcpy called with length bigger than size of destination "
-		 "buffer");
-
 __fortify_function wchar_t *
 __NTH (wmempcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
 		 size_t __n))
@@ -82,15 +48,6 @@ __NTH (wmempcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
 }
 #endif
 
-
-extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
-						  size_t __n), wmemset);
-extern wchar_t *__REDIRECT_NTH (__wmemset_chk_warn,
-				(wchar_t *__s, wchar_t __c, size_t __n,
-				 size_t __ns), __wmemset_chk)
-     __warnattr ("wmemset called with length bigger than size of destination "
-		 "buffer");
-
 __fortify_function wchar_t *
 __NTH (wmemset (wchar_t *__s, wchar_t __c, size_t __n))
 {
@@ -99,11 +56,6 @@ __NTH (wmemset (wchar_t *__s, wchar_t __c, size_t __n))
 			    __s, __c, __n);
 }
 
-
-extern wchar_t *__REDIRECT_NTH (__wcscpy_alias,
-				(wchar_t *__restrict __dest,
-				 const wchar_t *__restrict __src), wcscpy);
-
 __fortify_function wchar_t *
 __NTH (wcscpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
 {
@@ -113,11 +65,6 @@ __NTH (wcscpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
   return __wcscpy_alias (__dest, __src);
 }
 
-
-extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias,
-				(wchar_t *__restrict __dest,
-				 const wchar_t *__restrict __src), wcpcpy);
-
 __fortify_function wchar_t *
 __NTH (wcpcpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
 {
@@ -127,18 +74,6 @@ __NTH (wcpcpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
   return __wcpcpy_alias (__dest, __src);
 }
 
-
-extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias,
-				(wchar_t *__restrict __dest,
-				 const wchar_t *__restrict __src,
-				 size_t __n), wcsncpy);
-extern wchar_t *__REDIRECT_NTH (__wcsncpy_chk_warn,
-				(wchar_t *__restrict __dest,
-				 const wchar_t *__restrict __src,
-				 size_t __n, size_t __destlen), __wcsncpy_chk)
-     __warnattr ("wcsncpy called with length bigger than size of destination "
-		 "buffer");
-
 __fortify_function wchar_t *
 __NTH (wcsncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
 		size_t __n))
@@ -148,18 +83,6 @@ __NTH (wcsncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
 			    __dest, __src, __n);
 }
 
-
-extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias,
-				(wchar_t *__restrict __dest,
-				 const wchar_t *__restrict __src,
-				 size_t __n), wcpncpy);
-extern wchar_t *__REDIRECT_NTH (__wcpncpy_chk_warn,
-				(wchar_t *__restrict __dest,
-				 const wchar_t *__restrict __src,
-				 size_t __n, size_t __destlen), __wcpncpy_chk)
-     __warnattr ("wcpncpy called with length bigger than size of destination "
-		 "buffer");
-
 __fortify_function wchar_t *
 __NTH (wcpncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
 		size_t __n))
@@ -169,11 +92,6 @@ __NTH (wcpncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
 			    __dest, __src, __n);
 }
 
-
-extern wchar_t *__REDIRECT_NTH (__wcscat_alias,
-				(wchar_t *__restrict __dest,
-				 const wchar_t *__restrict __src), wcscat);
-
 __fortify_function wchar_t *
 __NTH (wcscat (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
 {
@@ -183,12 +101,6 @@ __NTH (wcscat (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
   return __wcscat_alias (__dest, __src);
 }
 
-
-extern wchar_t *__REDIRECT_NTH (__wcsncat_alias,
-				(wchar_t *__restrict __dest,
-				 const wchar_t *__restrict __src,
-				 size_t __n), wcsncat);
-
 __fortify_function wchar_t *
 __NTH (wcsncat (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
 		size_t __n))
@@ -200,12 +112,6 @@ __NTH (wcsncat (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
 }
 
 #ifdef __USE_MISC
-extern size_t __wcslcpy_chk (wchar_t *__dest, const wchar_t *__src, size_t __n,
-			     size_t __destlen) __THROW;
-extern size_t __REDIRECT_NTH (__wcslcpy_alias,
-			      (wchar_t *__dest, const wchar_t *__src,
-			       size_t __n), wcslcpy);
-
 __fortify_function size_t
 __NTH (wcslcpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
 		size_t __n))
@@ -219,12 +125,6 @@ __NTH (wcslcpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
   return __wcslcpy_alias (__dest, __src, __n);
 }
 
-extern size_t __wcslcat_chk (wchar_t *__dest, const wchar_t *__src, size_t __n,
-			     size_t __destlen) __THROW;
-extern size_t __REDIRECT_NTH (__wcslcat_alias,
-			      (wchar_t *__dest, const wchar_t *__src,
-			       size_t __n), wcslcat);
-
 __fortify_function size_t
 __NTH (wcslcat (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
 		size_t __n))
@@ -239,12 +139,6 @@ __NTH (wcslcat (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
 }
 #endif /* __USE_MISC */
 
-
-extern int __REDIRECT_NTH_LDBL (__swprintf_alias,
-				(wchar_t *__restrict __s, size_t __n,
-				 const wchar_t *__restrict __fmt, ...),
-				swprintf);
-
 #ifdef __va_arg_pack
 __fortify_function int
 __NTH (swprintf (wchar_t *__restrict __s, size_t __n,
@@ -265,12 +159,6 @@ __NTH (swprintf (wchar_t *__restrict __s, size_t __n,
    : swprintf (s, n, __VA_ARGS__))
 #endif
 
-
-extern int __REDIRECT_NTH_LDBL (__vswprintf_alias,
-				(wchar_t *__restrict __s, size_t __n,
-				 const wchar_t *__restrict __fmt,
-				 __gnuc_va_list __ap), vswprintf);
-
 __fortify_function int
 __NTH (vswprintf (wchar_t *__restrict __s, size_t __n,
 		  const wchar_t *__restrict __fmt, __gnuc_va_list __ap))
@@ -319,16 +207,6 @@ vfwprintf (__FILE *__restrict __stream,
 }
 
 #endif
-
-extern wchar_t *__REDIRECT (__fgetws_alias,
-			    (wchar_t *__restrict __s, int __n,
-			     __FILE *__restrict __stream), fgetws) __wur;
-extern wchar_t *__REDIRECT (__fgetws_chk_warn,
-			    (wchar_t *__restrict __s, size_t __size, int __n,
-			     __FILE *__restrict __stream), __fgetws_chk)
-     __wur __warnattr ("fgetws called with bigger size than length "
-		       "of destination buffer");
-
 __fortify_function __wur wchar_t *
 fgetws (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
 {
@@ -341,17 +219,6 @@ fgetws (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
 }
 
 #ifdef __USE_GNU
-extern wchar_t *__REDIRECT (__fgetws_unlocked_alias,
-			    (wchar_t *__restrict __s, int __n,
-			     __FILE *__restrict __stream), fgetws_unlocked)
-  __wur;
-extern wchar_t *__REDIRECT (__fgetws_unlocked_chk_warn,
-			    (wchar_t *__restrict __s, size_t __size, int __n,
-			     __FILE *__restrict __stream),
-			    __fgetws_unlocked_chk)
-     __wur __warnattr ("fgetws_unlocked called with bigger size than length "
-		       "of destination buffer");
-
 __fortify_function __wur wchar_t *
 fgetws_unlocked (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
 {
@@ -365,11 +232,6 @@ fgetws_unlocked (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
 }
 #endif
 
-
-extern size_t __REDIRECT_NTH (__wcrtomb_alias,
-			      (char *__restrict __s, wchar_t __wchar,
-			       mbstate_t *__restrict __ps), wcrtomb) __wur;
-
 __fortify_function __wur size_t
 __NTH (wcrtomb (char *__restrict __s, wchar_t __wchar,
 		mbstate_t *__restrict __ps))
@@ -387,20 +249,6 @@ __NTH (wcrtomb (char *__restrict __s, wchar_t __wchar,
   return __wcrtomb_alias (__s, __wchar, __ps);
 }
 
-
-extern size_t __REDIRECT_NTH (__mbsrtowcs_alias,
-			      (wchar_t *__restrict __dst,
-			       const char **__restrict __src,
-			       size_t __len, mbstate_t *__restrict __ps),
-			      mbsrtowcs);
-extern size_t __REDIRECT_NTH (__mbsrtowcs_chk_warn,
-			      (wchar_t *__restrict __dst,
-			       const char **__restrict __src,
-			       size_t __len, mbstate_t *__restrict __ps,
-			       size_t __dstlen), __mbsrtowcs_chk)
-     __warnattr ("mbsrtowcs called with dst buffer smaller than len "
-		 "* sizeof (wchar_t)");
-
 __fortify_function size_t
 __NTH (mbsrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
 		  size_t __len, mbstate_t *__restrict __ps))
@@ -410,19 +258,6 @@ __NTH (mbsrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
 			    __dst, __src, __len, __ps);
 }
 
-
-extern size_t __REDIRECT_NTH (__wcsrtombs_alias,
-			      (char *__restrict __dst,
-			       const wchar_t **__restrict __src,
-			       size_t __len, mbstate_t *__restrict __ps),
-			      wcsrtombs);
-extern size_t __REDIRECT_NTH (__wcsrtombs_chk_warn,
-			      (char *__restrict __dst,
-			       const wchar_t **__restrict __src,
-			       size_t __len, mbstate_t *__restrict __ps,
-			       size_t __dstlen), __wcsrtombs_chk)
-    __warnattr ("wcsrtombs called with dst buffer smaller than len");
-
 __fortify_function size_t
 __NTH (wcsrtombs (char *__restrict __dst, const wchar_t **__restrict __src,
 		  size_t __len, mbstate_t *__restrict __ps))
@@ -434,19 +269,6 @@ __NTH (wcsrtombs (char *__restrict __dst, const wchar_t **__restrict __src,
 
 
 #ifdef	__USE_XOPEN2K8
-extern size_t __REDIRECT_NTH (__mbsnrtowcs_alias,
-			      (wchar_t *__restrict __dst,
-			       const char **__restrict __src, size_t __nmc,
-			       size_t __len, mbstate_t *__restrict __ps),
-			      mbsnrtowcs);
-extern size_t __REDIRECT_NTH (__mbsnrtowcs_chk_warn,
-			      (wchar_t *__restrict __dst,
-			       const char **__restrict __src, size_t __nmc,
-			       size_t __len, mbstate_t *__restrict __ps,
-			       size_t __dstlen), __mbsnrtowcs_chk)
-     __warnattr ("mbsnrtowcs called with dst buffer smaller than len "
-		 "* sizeof (wchar_t)");
-
 __fortify_function size_t
 __NTH (mbsnrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
 		   size_t __nmc, size_t __len, mbstate_t *__restrict __ps))
@@ -456,20 +278,6 @@ __NTH (mbsnrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
 			    __dst, __src, __nmc, __len, __ps);
 }
 
-
-extern size_t __REDIRECT_NTH (__wcsnrtombs_alias,
-			      (char *__restrict __dst,
-			       const wchar_t **__restrict __src,
-			       size_t __nwc, size_t __len,
-			       mbstate_t *__restrict __ps), wcsnrtombs);
-extern size_t __REDIRECT_NTH (__wcsnrtombs_chk_warn,
-			      (char *__restrict __dst,
-			       const wchar_t **__restrict __src,
-			       size_t __nwc, size_t __len,
-			       mbstate_t *__restrict __ps,
-			       size_t __dstlen), __wcsnrtombs_chk)
-     __warnattr ("wcsnrtombs called with dst buffer smaller than len");
-
 __fortify_function size_t
 __NTH (wcsnrtombs (char *__restrict __dst, const wchar_t **__restrict __src,
 		   size_t __nwc, size_t __len, mbstate_t *__restrict __ps))
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 12/21] wcsmbs/bits/wchar2{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (10 preceding siblings ...)
  2023-06-20 18:18 ` [PATCH 11/21] wcsmbs/bits/wchar2{,-decl}.h: Clearly separate declaration from definitions Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-20 18:19 ` [PATCH 13/21] posix/bits/unistd.h: Clearly separate declaration from definitions Frédéric Bérat
                   ` (8 subsequent siblings)
  20 siblings, 0 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

The change is meant to avoid unwanted PLT entries for the wmemset and
wcrtomb routines when _FORTIFY_SOURCE is set.

On top of that, ensure that *_chk routines have their hidden builtin
definitions available.
---
 debug/wcrtomb_chk.c                               |  1 +
 debug/wmemset_chk.c                               |  1 +
 include/wchar.h                                   | 15 +++++++++++++++
 .../ldbl-128ibm-compat/ieee128-fwprintf_chk.c     |  1 +
 sysdeps/x86_64/multiarch/wmemset_chk.c            |  4 ++++
 wcsmbs/bits/wchar2-decl.h                         |  4 ++--
 6 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/debug/wcrtomb_chk.c b/debug/wcrtomb_chk.c
index 657be7471d..c156fe09c1 100644
--- a/debug/wcrtomb_chk.c
+++ b/debug/wcrtomb_chk.c
@@ -28,3 +28,4 @@ __wcrtomb_chk (char *s, wchar_t wchar, mbstate_t *ps, size_t buflen)
 {
   return __wcrtomb_internal (s, wchar, ps, buflen);
 }
+libc_hidden_def (__wcrtomb_chk)
diff --git a/debug/wmemset_chk.c b/debug/wmemset_chk.c
index e11a92815e..1e7fc4fdea 100644
--- a/debug/wmemset_chk.c
+++ b/debug/wmemset_chk.c
@@ -26,3 +26,4 @@ __wmemset_chk (wchar_t *s, wchar_t c, size_t n, size_t dstlen)
 
   return wmemset (s, c, n);
 }
+libc_hidden_builtin_def (__wmemset_chk)
diff --git a/include/wchar.h b/include/wchar.h
index 7b763bc24f..484e6b3fef 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -166,6 +166,8 @@ libc_hidden_proto (putwc)
 
 libc_hidden_proto (mbrtowc)
 libc_hidden_proto (wcrtomb)
+libc_hidden_proto (__wcrtomb_chk)
+
 extern int __wcscmp (const wchar_t *__s1, const wchar_t *__s2)
      __THROW __attribute_pure__;
 libc_hidden_proto (__wcscmp)
@@ -260,16 +262,25 @@ extern wchar_t *__wcschrnul (const wchar_t *__s, wchar_t __wc)
 
 extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
 			       size_t __ns) __THROW;
+libc_hidden_builtin_proto (__wmemset_chk)
 
 extern int __vfwscanf (__FILE *__restrict __s,
 		       const wchar_t *__restrict __format,
 		       __gnuc_va_list __arg)
      attribute_hidden
      /* __attribute__ ((__format__ (__wscanf__, 2, 0)) */;
+
+extern int __swprintf_chk (wchar_t *__restrict __s, size_t __n,
+			   int __flag, size_t __s_len,
+			   const wchar_t *__restrict __format, ...)
+     __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */;
+
 extern int __fwprintf (__FILE *__restrict __s,
 		       const wchar_t *__restrict __format, ...)
      attribute_hidden
      /* __attribute__ ((__format__ (__wprintf__, 2, 3))) */;
+extern int __wprintf_chk (int __flag, const wchar_t *__restrict __format,
+			  ...);
 extern int __vfwprintf_chk (FILE *__restrict __s, int __flag,
 			    const wchar_t *__restrict __format,
 			    __gnuc_va_list __arg)
@@ -279,6 +290,10 @@ extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
 			    const wchar_t *__restrict __format,
 			    __gnuc_va_list __arg)
      /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
+extern int __fwprintf_chk (__FILE *__restrict __stream, int __flag,
+			   const wchar_t *__restrict __format, ...);
+extern int __vwprintf_chk (int __flag, const wchar_t *__restrict __format,
+			   __gnuc_va_list __ap);
 
 extern int __isoc99_fwscanf (__FILE *__restrict __stream,
 			     const wchar_t *__restrict __format, ...);
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf_chk.c
index 5b6cc3e768..10658ab125 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fwprintf_chk.c
@@ -17,6 +17,7 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <stdarg.h>
+#include <wchar.h>
 #include <libio/libioP.h>
 
 extern int
diff --git a/sysdeps/x86_64/multiarch/wmemset_chk.c b/sysdeps/x86_64/multiarch/wmemset_chk.c
index ac93a1f376..00edf44918 100644
--- a/sysdeps/x86_64/multiarch/wmemset_chk.c
+++ b/sysdeps/x86_64/multiarch/wmemset_chk.c
@@ -28,4 +28,8 @@
 
 libc_ifunc_redirected (__redirect_wmemset_chk, __wmemset_chk,
 		       IFUNC_SELECTOR ());
+# ifdef SHARED
+__hidden_ver1 (__wmemset_chk, __GI___wmemset_chk, __redirect_wmemset_chk)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__wmemset_chk);
+# endif
 #endif
diff --git a/wcsmbs/bits/wchar2-decl.h b/wcsmbs/bits/wchar2-decl.h
index f3a2fd3c99..08c8ebd0e8 100644
--- a/wcsmbs/bits/wchar2-decl.h
+++ b/wcsmbs/bits/wchar2-decl.h
@@ -71,7 +71,7 @@ extern wchar_t *__REDIRECT_NTH (__wmempcpy_chk_warn,
 
 extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
 			       size_t __ns) __THROW;
-extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
+extern wchar_t *__REDIRECT_FORTIFY_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
 							  size_t __n), wmemset);
 extern wchar_t *__REDIRECT_NTH (__wmemset_chk_warn,
 				(wchar_t *__s, wchar_t __c, size_t __n,
@@ -203,7 +203,7 @@ extern wchar_t *__REDIRECT (__fgetws_unlocked_chk_warn,
 extern size_t __wcrtomb_chk (char *__restrict __s, wchar_t __wchar,
 			     mbstate_t *__restrict __p,
 			     size_t __buflen) __THROW __wur;
-extern size_t __REDIRECT_NTH (__wcrtomb_alias,
+extern size_t __REDIRECT_FORTIFY_NTH (__wcrtomb_alias,
 				      (char *__restrict __s, wchar_t __wchar,
 				      mbstate_t *__restrict __ps), wcrtomb) __wur;
 
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 13/21] posix/bits/unistd.h: Clearly separate declaration from definitions
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (11 preceding siblings ...)
  2023-06-20 18:19 ` [PATCH 12/21] wcsmbs/bits/wchar2{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-22  4:17   ` Siddhesh Poyarekar
  2023-06-20 18:19 ` [PATCH 14/21] posix/bits/unistd{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE Frédéric Bérat
                   ` (7 subsequent siblings)
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

This change is similar to what was done for bits/wchar2.h.
Routines declaration are moved into a dedicated bits/unistd-decl.h file
which is then included into the bits/unistd.h file.

This will allow to adapt the files so that PLT entries are not created when
_FORTIFY_SOURCE is enabled.
---
 include/bits/unistd-decl.h |   1 +
 include/unistd.h           |   1 +
 posix/Makefile             |   1 +
 posix/bits/unistd-decl.h   | 198 +++++++++++++++++++++++++++++++++++++
 posix/bits/unistd.h        | 154 +----------------------------
 5 files changed, 202 insertions(+), 153 deletions(-)
 create mode 100644 include/bits/unistd-decl.h
 create mode 100644 posix/bits/unistd-decl.h

diff --git a/include/bits/unistd-decl.h b/include/bits/unistd-decl.h
new file mode 100644
index 0000000000..7fcbd272ac
--- /dev/null
+++ b/include/bits/unistd-decl.h
@@ -0,0 +1 @@
+#include <posix/bits/unistd-decl.h>
diff --git a/include/unistd.h b/include/unistd.h
index 4345d08d60..b042a485f9 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -5,6 +5,7 @@
 
 #  include <stdbool.h>
 #  include <kernel-features.h>
+#  include <bits/unistd-decl.h>
 
 libc_hidden_proto (_exit, __noreturn__)
 #  ifndef NO_RTLD_HIDDEN
diff --git a/posix/Makefile b/posix/Makefile
index 5113ee3b74..3d368b91f6 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -42,6 +42,7 @@ headers := \
   bits/types/idtype_t.h \
   bits/types/struct_sched_param.h \
   bits/typesizes.h \
+  bits/unistd-decl.h \
   bits/unistd.h \
   bits/unistd_ext.h \
   bits/utsname.h \
diff --git a/posix/bits/unistd-decl.h b/posix/bits/unistd-decl.h
new file mode 100644
index 0000000000..440911b20a
--- /dev/null
+++ b/posix/bits/unistd-decl.h
@@ -0,0 +1,198 @@
+/* Checking routines for unistd functions. Declaration only.
+   Copyright (C) 2023 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/>.  */
+
+#ifndef _BITS_UNISTD_DECL_H
+#define _BITS_UNISTD_DECL_H 1
+
+#ifndef _UNISTD_H
+# error "Never include <bits/unistd.h> directly; use <unistd.h> instead."
+#endif
+
+extern ssize_t __read_chk (int __fd, void *__buf, size_t __nbytes,
+			   size_t __buflen)
+     __wur __attr_access ((__write_only__, 2, 3));
+extern ssize_t __REDIRECT (__read_alias, (int __fd, void *__buf,
+						  size_t __nbytes), read)
+     __wur __attr_access ((__write_only__, 2, 3));
+extern ssize_t __REDIRECT (__read_chk_warn,
+			   (int __fd, void *__buf, size_t __nbytes,
+			    size_t __buflen), __read_chk)
+     __wur __warnattr ("read called with bigger length than size of "
+		       "the destination buffer");
+
+#if defined __USE_UNIX98 || defined __USE_XOPEN2K8
+extern ssize_t __pread_chk (int __fd, void *__buf, size_t __nbytes,
+			    __off_t __offset, size_t __bufsize)
+     __wur __attr_access ((__write_only__, 2, 3));
+extern ssize_t __pread64_chk (int __fd, void *__buf, size_t __nbytes,
+			      __off64_t __offset, size_t __bufsize)
+     __wur __attr_access ((__write_only__, 2, 3));
+extern ssize_t __REDIRECT (__pread_alias,
+			   (int __fd, void *__buf, size_t __nbytes,
+			    __off_t __offset), pread)
+     __wur __attr_access ((__write_only__, 2, 3));
+extern ssize_t __REDIRECT (__pread64_alias,
+			   (int __fd, void *__buf, size_t __nbytes,
+			    __off64_t __offset), pread64)
+     __wur __attr_access ((__write_only__, 2, 3));
+extern ssize_t __REDIRECT (__pread_chk_warn,
+			   (int __fd, void *__buf, size_t __nbytes,
+			    __off_t __offset, size_t __bufsize), __pread_chk)
+     __wur __warnattr ("pread called with bigger length than size of "
+		       "the destination buffer");
+extern ssize_t __REDIRECT (__pread64_chk_warn,
+			   (int __fd, void *__buf, size_t __nbytes,
+			    __off64_t __offset, size_t __bufsize),
+			    __pread64_chk)
+     __wur __warnattr ("pread64 called with bigger length than size of "
+		       "the destination buffer");
+#endif
+
+#if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K
+extern ssize_t __readlink_chk (const char *__restrict __path,
+			       char *__restrict __buf, size_t __len,
+			       size_t __buflen)
+     __THROW __nonnull ((1, 2)) __wur __attr_access ((__write_only__, 2, 3));
+extern ssize_t __REDIRECT_NTH (__readlink_alias,
+			       (const char *__restrict __path,
+				char *__restrict __buf, size_t __len), readlink)
+     __nonnull ((1, 2)) __wur __attr_access ((__write_only__, 2, 3));
+extern ssize_t __REDIRECT_NTH (__readlink_chk_warn,
+			       (const char *__restrict __path,
+				char *__restrict __buf, size_t __len,
+				size_t __buflen), __readlink_chk)
+     __nonnull ((1, 2)) __wur __warnattr ("readlink called with bigger length "
+					  "than size of destination buffer");
+#endif
+
+#ifdef __USE_ATFILE
+extern ssize_t __readlinkat_chk (int __fd, const char *__restrict __path,
+				 char *__restrict __buf, size_t __len,
+				 size_t __buflen)
+     __THROW __nonnull ((2, 3)) __wur __attr_access ((__write_only__, 3, 4));
+extern ssize_t __REDIRECT_NTH (__readlinkat_alias,
+			       (int __fd, const char *__restrict __path,
+				char *__restrict __buf, size_t __len),
+			       readlinkat)
+     __nonnull ((2, 3)) __wur __attr_access ((__write_only__, 3, 4));
+extern ssize_t __REDIRECT_NTH (__readlinkat_chk_warn,
+			       (int __fd, const char *__restrict __path,
+				char *__restrict __buf, size_t __len,
+				size_t __buflen), __readlinkat_chk)
+     __nonnull ((2, 3)) __wur __warnattr ("readlinkat called with bigger "
+					  "length than size of destination "
+					  "buffer");
+#endif
+
+extern char *__getcwd_chk (char *__buf, size_t __size, size_t __buflen)
+     __THROW __wur;
+extern char *__REDIRECT_NTH (__getcwd_alias,
+			     (char *__buf, size_t __size), getcwd) __wur;
+extern char *__REDIRECT_NTH (__getcwd_chk_warn,
+			     (char *__buf, size_t __size, size_t __buflen),
+			     __getcwd_chk)
+     __wur __warnattr ("getcwd caller with bigger length than size of "
+		       "destination buffer");
+
+#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
+extern char *__getwd_chk (char *__buf, size_t buflen)
+     __THROW __nonnull ((1)) __wur __attr_access ((__write_only__, 1, 2));
+extern char *__REDIRECT_NTH (__getwd_warn, (char *__buf), getwd)
+     __nonnull ((1)) __wur __warnattr ("please use getcwd instead, as getwd "
+				       "doesn't specify buffer size");
+#endif
+
+extern size_t __confstr_chk (int __name, char *__buf, size_t __len,
+			     size_t __buflen) __THROW
+     __attr_access ((__write_only__, 2, 3));
+extern size_t __REDIRECT_NTH (__confstr_alias, (int __name, char *__buf,
+						size_t __len), confstr)
+     __attr_access ((__write_only__, 2, 3));
+extern size_t __REDIRECT_NTH (__confstr_chk_warn,
+			      (int __name, char *__buf, size_t __len,
+			       size_t __buflen), __confstr_chk)
+     __warnattr ("confstr called with bigger length than size of destination "
+		 "buffer");
+
+
+extern int __getgroups_chk (int __size, __gid_t __list[], size_t __listlen)
+     __THROW __wur __attr_access ((__write_only__, 2, 1));
+extern int __REDIRECT_NTH (__getgroups_alias, (int __size, __gid_t __list[]),
+			   getgroups) __wur __attr_access ((__write_only__, 2, 1));
+extern int __REDIRECT_NTH (__getgroups_chk_warn,
+			   (int __size, __gid_t __list[], size_t __listlen),
+			   __getgroups_chk)
+     __wur __warnattr ("getgroups called with bigger group count than what "
+		       "can fit into destination buffer");
+
+
+extern int __ttyname_r_chk (int __fd, char *__buf, size_t __buflen,
+			    size_t __nreal) __THROW __nonnull ((2))
+     __attr_access ((__write_only__, 2, 3));
+extern int __REDIRECT_NTH (__ttyname_r_alias, (int __fd, char *__buf,
+					       size_t __buflen), ttyname_r)
+     __nonnull ((2));
+extern int __REDIRECT_NTH (__ttyname_r_chk_warn,
+			   (int __fd, char *__buf, size_t __buflen,
+			    size_t __nreal), __ttyname_r_chk)
+     __nonnull ((2)) __warnattr ("ttyname_r called with bigger buflen than "
+				 "size of destination buffer");
+
+
+#ifdef __USE_POSIX199506
+extern int __getlogin_r_chk (char *__buf, size_t __buflen, size_t __nreal)
+     __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
+extern int __REDIRECT (__getlogin_r_alias, (char *__buf, size_t __buflen),
+		       getlogin_r) __nonnull ((1));
+extern int __REDIRECT (__getlogin_r_chk_warn,
+		       (char *__buf, size_t __buflen, size_t __nreal),
+		       __getlogin_r_chk)
+     __nonnull ((1)) __warnattr ("getlogin_r called with bigger buflen than "
+				 "size of destination buffer");
+#endif
+
+
+#if defined __USE_MISC || defined __USE_UNIX98
+extern int __gethostname_chk (char *__buf, size_t __buflen, size_t __nreal)
+     __THROW __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
+extern int __REDIRECT_NTH (__gethostname_alias, (char *__buf, size_t __buflen),
+			   gethostname)
+     __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
+extern int __REDIRECT_NTH (__gethostname_chk_warn,
+			   (char *__buf, size_t __buflen, size_t __nreal),
+			   __gethostname_chk)
+     __nonnull ((1)) __warnattr ("gethostname called with bigger buflen than "
+				 "size of destination buffer");
+#endif
+
+
+#if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_UNIX98)
+extern int __getdomainname_chk (char *__buf, size_t __buflen, size_t __nreal)
+     __THROW __nonnull ((1)) __wur __attr_access ((__write_only__, 1, 2));
+extern int __REDIRECT_NTH (__getdomainname_alias, (char *__buf,
+						   size_t __buflen),
+			   getdomainname) __nonnull ((1))
+     __wur __attr_access ((__write_only__, 1, 2));
+extern int __REDIRECT_NTH (__getdomainname_chk_warn,
+			   (char *__buf, size_t __buflen, size_t __nreal),
+			   __getdomainname_chk)
+     __nonnull ((1)) __wur __warnattr ("getdomainname called with bigger "
+				       "buflen than size of destination "
+				       "buffer");
+#endif
+#endif /* bits/unistd-decl.h.  */
diff --git a/posix/bits/unistd.h b/posix/bits/unistd.h
index 2a0782e6c8..6a381116a9 100644
--- a/posix/bits/unistd.h
+++ b/posix/bits/unistd.h
@@ -20,17 +20,7 @@
 # error "Never include <bits/unistd.h> directly; use <unistd.h> instead."
 #endif
 
-extern ssize_t __read_chk (int __fd, void *__buf, size_t __nbytes,
-			   size_t __buflen)
-  __wur __attr_access ((__write_only__, 2, 3));
-extern ssize_t __REDIRECT (__read_alias, (int __fd, void *__buf,
-					  size_t __nbytes), read)
-  __wur __attr_access ((__write_only__, 2, 3));
-extern ssize_t __REDIRECT (__read_chk_warn,
-			   (int __fd, void *__buf, size_t __nbytes,
-			    size_t __buflen), __read_chk)
-     __wur __warnattr ("read called with bigger length than size of "
-		       "the destination buffer");
+# include <bits/unistd-decl.h>
 
 __fortify_function __wur ssize_t
 read (int __fd, void *__buf, size_t __nbytes)
@@ -41,32 +31,6 @@ read (int __fd, void *__buf, size_t __nbytes)
 }
 
 #if defined __USE_UNIX98 || defined __USE_XOPEN2K8
-extern ssize_t __pread_chk (int __fd, void *__buf, size_t __nbytes,
-			    __off_t __offset, size_t __bufsize)
-  __wur __attr_access ((__write_only__, 2, 3));
-extern ssize_t __pread64_chk (int __fd, void *__buf, size_t __nbytes,
-			      __off64_t __offset, size_t __bufsize)
-  __wur __attr_access ((__write_only__, 2, 3));
-extern ssize_t __REDIRECT (__pread_alias,
-			   (int __fd, void *__buf, size_t __nbytes,
-			    __off_t __offset), pread)
-  __wur __attr_access ((__write_only__, 2, 3));
-extern ssize_t __REDIRECT (__pread64_alias,
-			   (int __fd, void *__buf, size_t __nbytes,
-			    __off64_t __offset), pread64)
-  __wur __attr_access ((__write_only__, 2, 3));
-extern ssize_t __REDIRECT (__pread_chk_warn,
-			   (int __fd, void *__buf, size_t __nbytes,
-			    __off_t __offset, size_t __bufsize), __pread_chk)
-     __wur __warnattr ("pread called with bigger length than size of "
-		       "the destination buffer");
-extern ssize_t __REDIRECT (__pread64_chk_warn,
-			   (int __fd, void *__buf, size_t __nbytes,
-			    __off64_t __offset, size_t __bufsize),
-			    __pread64_chk)
-     __wur __warnattr ("pread64 called with bigger length than size of "
-		       "the destination buffer");
-
 # ifndef __USE_FILE_OFFSET64
 __fortify_function __wur ssize_t
 pread (int __fd, void *__buf, size_t __nbytes, __off_t __offset)
@@ -97,21 +61,6 @@ pread64 (int __fd, void *__buf, size_t __nbytes, __off64_t __offset)
 #endif
 
 #if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K
-extern ssize_t __readlink_chk (const char *__restrict __path,
-			       char *__restrict __buf, size_t __len,
-			       size_t __buflen)
-     __THROW __nonnull ((1, 2)) __wur __attr_access ((__write_only__, 2, 3));
-extern ssize_t __REDIRECT_NTH (__readlink_alias,
-			       (const char *__restrict __path,
-				char *__restrict __buf, size_t __len), readlink)
-     __nonnull ((1, 2)) __wur __attr_access ((__write_only__, 2, 3));
-extern ssize_t __REDIRECT_NTH (__readlink_chk_warn,
-			       (const char *__restrict __path,
-				char *__restrict __buf, size_t __len,
-				size_t __buflen), __readlink_chk)
-     __nonnull ((1, 2)) __wur __warnattr ("readlink called with bigger length "
-					  "than size of destination buffer");
-
 __fortify_function __nonnull ((1, 2)) __wur ssize_t
 __NTH (readlink (const char *__restrict __path, char *__restrict __buf,
 		 size_t __len))
@@ -123,23 +72,6 @@ __NTH (readlink (const char *__restrict __path, char *__restrict __buf,
 #endif
 
 #ifdef __USE_ATFILE
-extern ssize_t __readlinkat_chk (int __fd, const char *__restrict __path,
-				 char *__restrict __buf, size_t __len,
-				 size_t __buflen)
-     __THROW __nonnull ((2, 3)) __wur __attr_access ((__write_only__, 3, 4));
-extern ssize_t __REDIRECT_NTH (__readlinkat_alias,
-			       (int __fd, const char *__restrict __path,
-				char *__restrict __buf, size_t __len),
-			       readlinkat)
-     __nonnull ((2, 3)) __wur __attr_access ((__write_only__, 3, 4));
-extern ssize_t __REDIRECT_NTH (__readlinkat_chk_warn,
-			       (int __fd, const char *__restrict __path,
-				char *__restrict __buf, size_t __len,
-				size_t __buflen), __readlinkat_chk)
-     __nonnull ((2, 3)) __wur __warnattr ("readlinkat called with bigger "
-					  "length than size of destination "
-					  "buffer");
-
 __fortify_function __nonnull ((2, 3)) __wur ssize_t
 __NTH (readlinkat (int __fd, const char *__restrict __path,
 		   char *__restrict __buf, size_t __len))
@@ -150,16 +82,6 @@ __NTH (readlinkat (int __fd, const char *__restrict __path,
 }
 #endif
 
-extern char *__getcwd_chk (char *__buf, size_t __size, size_t __buflen)
-     __THROW __wur;
-extern char *__REDIRECT_NTH (__getcwd_alias,
-			     (char *__buf, size_t __size), getcwd) __wur;
-extern char *__REDIRECT_NTH (__getcwd_chk_warn,
-			     (char *__buf, size_t __size, size_t __buflen),
-			     __getcwd_chk)
-     __wur __warnattr ("getcwd caller with bigger length than size of "
-		       "destination buffer");
-
 __fortify_function __wur char *
 __NTH (getcwd (char *__buf, size_t __size))
 {
@@ -169,12 +91,6 @@ __NTH (getcwd (char *__buf, size_t __size))
 }
 
 #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
-extern char *__getwd_chk (char *__buf, size_t buflen)
-     __THROW __nonnull ((1)) __wur __attr_access ((__write_only__, 1, 2));
-extern char *__REDIRECT_NTH (__getwd_warn, (char *__buf), getwd)
-     __nonnull ((1)) __wur __warnattr ("please use getcwd instead, as getwd "
-				       "doesn't specify buffer size");
-
 __fortify_function __nonnull ((1)) __attribute_deprecated__ __wur char *
 __NTH (getwd (char *__buf))
 {
@@ -184,18 +100,6 @@ __NTH (getwd (char *__buf))
 }
 #endif
 
-extern size_t __confstr_chk (int __name, char *__buf, size_t __len,
-			     size_t __buflen) __THROW
-  __attr_access ((__write_only__, 2, 3));
-extern size_t __REDIRECT_NTH (__confstr_alias, (int __name, char *__buf,
-						size_t __len), confstr)
-   __attr_access ((__write_only__, 2, 3));
-extern size_t __REDIRECT_NTH (__confstr_chk_warn,
-			      (int __name, char *__buf, size_t __len,
-			       size_t __buflen), __confstr_chk)
-     __warnattr ("confstr called with bigger length than size of destination "
-		 "buffer");
-
 __fortify_function size_t
 __NTH (confstr (int __name, char *__buf, size_t __len))
 {
@@ -205,16 +109,6 @@ __NTH (confstr (int __name, char *__buf, size_t __len))
 }
 
 
-extern int __getgroups_chk (int __size, __gid_t __list[], size_t __listlen)
-  __THROW __wur __attr_access ((__write_only__, 2, 1));
-extern int __REDIRECT_NTH (__getgroups_alias, (int __size, __gid_t __list[]),
-			   getgroups) __wur __attr_access ((__write_only__, 2, 1));
-extern int __REDIRECT_NTH (__getgroups_chk_warn,
-			   (int __size, __gid_t __list[], size_t __listlen),
-			   __getgroups_chk)
-     __wur __warnattr ("getgroups called with bigger group count than what "
-		       "can fit into destination buffer");
-
 __fortify_function int
 __NTH (getgroups (int __size, __gid_t __list[]))
 {
@@ -224,18 +118,6 @@ __NTH (getgroups (int __size, __gid_t __list[]))
 }
 
 
-extern int __ttyname_r_chk (int __fd, char *__buf, size_t __buflen,
-			    size_t __nreal) __THROW __nonnull ((2))
-   __attr_access ((__write_only__, 2, 3));
-extern int __REDIRECT_NTH (__ttyname_r_alias, (int __fd, char *__buf,
-					       size_t __buflen), ttyname_r)
-     __nonnull ((2));
-extern int __REDIRECT_NTH (__ttyname_r_chk_warn,
-			   (int __fd, char *__buf, size_t __buflen,
-			    size_t __nreal), __ttyname_r_chk)
-     __nonnull ((2)) __warnattr ("ttyname_r called with bigger buflen than "
-				 "size of destination buffer");
-
 __fortify_function int
 __NTH (ttyname_r (int __fd, char *__buf, size_t __buflen))
 {
@@ -246,16 +128,6 @@ __NTH (ttyname_r (int __fd, char *__buf, size_t __buflen))
 
 
 #ifdef __USE_POSIX199506
-extern int __getlogin_r_chk (char *__buf, size_t __buflen, size_t __nreal)
-     __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
-extern int __REDIRECT (__getlogin_r_alias, (char *__buf, size_t __buflen),
-		       getlogin_r) __nonnull ((1));
-extern int __REDIRECT (__getlogin_r_chk_warn,
-		       (char *__buf, size_t __buflen, size_t __nreal),
-		       __getlogin_r_chk)
-     __nonnull ((1)) __warnattr ("getlogin_r called with bigger buflen than "
-				 "size of destination buffer");
-
 __fortify_function int
 getlogin_r (char *__buf, size_t __buflen)
 {
@@ -267,17 +139,6 @@ getlogin_r (char *__buf, size_t __buflen)
 
 
 #if defined __USE_MISC || defined __USE_UNIX98
-extern int __gethostname_chk (char *__buf, size_t __buflen, size_t __nreal)
-     __THROW __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
-extern int __REDIRECT_NTH (__gethostname_alias, (char *__buf, size_t __buflen),
-			   gethostname)
-  __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
-extern int __REDIRECT_NTH (__gethostname_chk_warn,
-			   (char *__buf, size_t __buflen, size_t __nreal),
-			   __gethostname_chk)
-     __nonnull ((1)) __warnattr ("gethostname called with bigger buflen than "
-				 "size of destination buffer");
-
 __fortify_function int
 __NTH (gethostname (char *__buf, size_t __buflen))
 {
@@ -289,19 +150,6 @@ __NTH (gethostname (char *__buf, size_t __buflen))
 
 
 #if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_UNIX98)
-extern int __getdomainname_chk (char *__buf, size_t __buflen, size_t __nreal)
-     __THROW __nonnull ((1)) __wur __attr_access ((__write_only__, 1, 2));
-extern int __REDIRECT_NTH (__getdomainname_alias, (char *__buf,
-						   size_t __buflen),
-			   getdomainname) __nonnull ((1))
-  __wur __attr_access ((__write_only__, 1, 2));
-extern int __REDIRECT_NTH (__getdomainname_chk_warn,
-			   (char *__buf, size_t __buflen, size_t __nreal),
-			   __getdomainname_chk)
-     __nonnull ((1)) __wur __warnattr ("getdomainname called with bigger "
-				       "buflen than size of destination "
-				       "buffer");
-
 __fortify_function int
 __NTH (getdomainname (char *__buf, size_t __buflen))
 {
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 14/21] posix/bits/unistd{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (12 preceding siblings ...)
  2023-06-20 18:19 ` [PATCH 13/21] posix/bits/unistd.h: Clearly separate declaration from definitions Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-20 18:19 ` [PATCH 15/21] debug/readlink{,at}_chk.c: Harmonize declaration and definition Frédéric Bérat
                   ` (6 subsequent siblings)
  20 siblings, 0 replies; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

The change is meant to avoid unwanted PLT entries for the read_chk,
getdomainname_chk and getlogin_r_chk routines when _FORTIFY_SOURCE is set.
---
 debug/getdomainname_chk.c | 1 +
 debug/read_chk.c          | 1 +
 include/unistd.h          | 4 ++++
 login/getlogin_r_chk.c    | 1 +
 posix/bits/unistd-decl.h  | 6 +++---
 5 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/debug/getdomainname_chk.c b/debug/getdomainname_chk.c
index ccea1b2d9e..c0e6c7bd4b 100644
--- a/debug/getdomainname_chk.c
+++ b/debug/getdomainname_chk.c
@@ -26,3 +26,4 @@ __getdomainname_chk (char *buf, size_t buflen, size_t nreal)
 
   return getdomainname (buf, buflen);
 }
+libc_hidden_builtin_def (__getdomainname_chk)
diff --git a/debug/read_chk.c b/debug/read_chk.c
index 17588736a1..dfd87206b2 100644
--- a/debug/read_chk.c
+++ b/debug/read_chk.c
@@ -25,3 +25,4 @@ __read_chk (int fd, void *buf, size_t nbytes, size_t buflen)
 
   return __read (fd, buf, nbytes);
 }
+libc_hidden_builtin_def (__read_chk)
diff --git a/include/unistd.h b/include/unistd.h
index b042a485f9..243e52b471 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -32,6 +32,10 @@ libc_hidden_proto (readlinkat)
 libc_hidden_proto (fsync)
 libc_hidden_proto (fdatasync)
 
+libc_hidden_builtin_proto (__read_chk)
+libc_hidden_builtin_proto (__getdomainname_chk)
+libc_hidden_builtin_proto (__getlogin_r_chk)
+
 /* Now define the internal interfaces.  */
 extern int __access (const char *__name, int __type);
 libc_hidden_proto (__access)
diff --git a/login/getlogin_r_chk.c b/login/getlogin_r_chk.c
index 12a0d12bd4..576567f287 100644
--- a/login/getlogin_r_chk.c
+++ b/login/getlogin_r_chk.c
@@ -26,3 +26,4 @@ __getlogin_r_chk (char *buf, size_t buflen, size_t nreal)
 
   return getlogin_r (buf, buflen);
 }
+libc_hidden_builtin_def (__getlogin_r_chk)
diff --git a/posix/bits/unistd-decl.h b/posix/bits/unistd-decl.h
index 440911b20a..4ff5b1906a 100644
--- a/posix/bits/unistd-decl.h
+++ b/posix/bits/unistd-decl.h
@@ -26,7 +26,7 @@
 extern ssize_t __read_chk (int __fd, void *__buf, size_t __nbytes,
 			   size_t __buflen)
      __wur __attr_access ((__write_only__, 2, 3));
-extern ssize_t __REDIRECT (__read_alias, (int __fd, void *__buf,
+extern ssize_t __REDIRECT_FORTIFY (__read_alias, (int __fd, void *__buf,
 						  size_t __nbytes), read)
      __wur __attr_access ((__write_only__, 2, 3));
 extern ssize_t __REDIRECT (__read_chk_warn,
@@ -157,7 +157,7 @@ extern int __REDIRECT_NTH (__ttyname_r_chk_warn,
 #ifdef __USE_POSIX199506
 extern int __getlogin_r_chk (char *__buf, size_t __buflen, size_t __nreal)
      __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
-extern int __REDIRECT (__getlogin_r_alias, (char *__buf, size_t __buflen),
+extern int __REDIRECT_FORTIFY (__getlogin_r_alias, (char *__buf, size_t __buflen),
 		       getlogin_r) __nonnull ((1));
 extern int __REDIRECT (__getlogin_r_chk_warn,
 		       (char *__buf, size_t __buflen, size_t __nreal),
@@ -184,7 +184,7 @@ extern int __REDIRECT_NTH (__gethostname_chk_warn,
 #if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_UNIX98)
 extern int __getdomainname_chk (char *__buf, size_t __buflen, size_t __nreal)
      __THROW __nonnull ((1)) __wur __attr_access ((__write_only__, 1, 2));
-extern int __REDIRECT_NTH (__getdomainname_alias, (char *__buf,
+extern int __REDIRECT_FORTIFY_NTH (__getdomainname_alias, (char *__buf,
 						   size_t __buflen),
 			   getdomainname) __nonnull ((1))
      __wur __attr_access ((__write_only__, 1, 2));
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 15/21] debug/readlink{,at}_chk.c: Harmonize declaration and definition
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (13 preceding siblings ...)
  2023-06-20 18:19 ` [PATCH 14/21] posix/bits/unistd{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-22  4:11   ` Siddhesh Poyarekar
  2023-06-20 18:19 ` [PATCH 16/21] misc/bits/select2.h: Clearly separate declaration from definitions Frédéric Bérat
                   ` (5 subsequent siblings)
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

The declaration and definition of these routines aren't consistent.

Make the definition of __readlink_chk and __readlinkat_chk match the
declaration of the routines they fortify.  While there are no problems
today this avoids any future potential problems related to the mismatch.
---
 debug/readlink_chk.c   | 3 ++-
 debug/readlinkat_chk.c | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/debug/readlink_chk.c b/debug/readlink_chk.c
index c491db2225..99dea40c7b 100644
--- a/debug/readlink_chk.c
+++ b/debug/readlink_chk.c
@@ -24,7 +24,8 @@
 
 
 ssize_t
-__readlink_chk (const char *path, void *buf, size_t len, size_t buflen)
+__readlink_chk (const char *__restrict path, char *__restrict buf, size_t len,
+		size_t buflen)
 {
   if (len > buflen)
     __chk_fail ();
diff --git a/debug/readlinkat_chk.c b/debug/readlinkat_chk.c
index 03feac92ec..163dec8b80 100644
--- a/debug/readlinkat_chk.c
+++ b/debug/readlinkat_chk.c
@@ -20,7 +20,8 @@
 
 
 ssize_t
-__readlinkat_chk (int fd, const char *path, void *buf, size_t len,
+__readlinkat_chk (int fd, const char *__restrict path,
+		  char *__restrict buf, size_t len,
 		  size_t buflen)
 {
   if (len > buflen)
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 16/21] misc/bits/select2.h: Clearly separate declaration from definitions
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (14 preceding siblings ...)
  2023-06-20 18:19 ` [PATCH 15/21] debug/readlink{,at}_chk.c: Harmonize declaration and definition Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-22  4:16   ` Siddhesh Poyarekar
  2023-06-20 18:19 ` [PATCH 17/21] misc/bits/syslog.h: Clearly separate declaration from definition Frédéric Bérat
                   ` (4 subsequent siblings)
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

The __fdelt_chk declaration needs to be available so that
libc_hidden_builtin_proto can be used while not redefining __FD_ELT.
Thus, misc/bits/select-decl.h is created to hold the corresponding
prototypes.
---
 debug/fdelt_chk.c          |  2 ++
 include/bits/select-decl.h |  1 +
 include/sys/select.h       |  4 ++++
 misc/Makefile              |  1 +
 misc/bits/select-decl.h    | 31 +++++++++++++++++++++++++++++++
 misc/bits/select2.h        |  6 ++----
 6 files changed, 41 insertions(+), 4 deletions(-)
 create mode 100644 include/bits/select-decl.h
 create mode 100644 misc/bits/select-decl.h

diff --git a/debug/fdelt_chk.c b/debug/fdelt_chk.c
index d1d3a19460..841337a55d 100644
--- a/debug/fdelt_chk.c
+++ b/debug/fdelt_chk.c
@@ -28,3 +28,5 @@ __fdelt_chk (long int d)
   return d / __NFDBITS;
 }
 strong_alias (__fdelt_chk, __fdelt_warn)
+
+libc_hidden_builtin_def (__fdelt_chk)
diff --git a/include/bits/select-decl.h b/include/bits/select-decl.h
new file mode 100644
index 0000000000..3526ea2a9d
--- /dev/null
+++ b/include/bits/select-decl.h
@@ -0,0 +1 @@
+#include "../../misc/bits/select-decl.h"
diff --git a/include/sys/select.h b/include/sys/select.h
index a8961afbed..e87806c249 100644
--- a/include/sys/select.h
+++ b/include/sys/select.h
@@ -3,6 +3,10 @@
 
 #ifndef _ISOMAC
 /* Now define the internal interfaces.  */
+
+#include <bits/select-decl.h>
+libc_hidden_builtin_proto (__fdelt_chk)
+
 # if __TIMESIZE == 64
 #  define __pselect64 __pselect
 #  define __select64  __select
diff --git a/misc/Makefile b/misc/Makefile
index 36ba7a0bad..3497d30f3b 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -68,6 +68,7 @@ headers	:= \
   bits/syslog-ldbl.h \
   bits/syslog-path.h \
   bits/error.h \
+  bits/select-decl.h \
   bits/select2.h \
   bits/hwcap.h \
   sys/auxv.h \
diff --git a/misc/bits/select-decl.h b/misc/bits/select-decl.h
new file mode 100644
index 0000000000..927ac4549b
--- /dev/null
+++ b/misc/bits/select-decl.h
@@ -0,0 +1,31 @@
+/* Checking routines for select functions. Declaration only.
+   Copyright (C) 2023 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/>.  */
+
+#ifndef _BITS_SELECT_DECL_H
+#define _BITS_SELECT_DECL_H 1
+
+#ifndef _SYS_SELECT_H
+# error "Never include <bits/select2.h> directly; use <sys/select.h> instead."
+#endif
+
+/* Helper functions to issue warnings and errors when needed.  */
+extern long int __fdelt_chk (long int __d);
+extern long int __fdelt_warn (long int __d)
+  __warnattr ("bit outside of fd_set selected");
+
+#endif
diff --git a/misc/bits/select2.h b/misc/bits/select2.h
index abd84a19d5..91e85c87d1 100644
--- a/misc/bits/select2.h
+++ b/misc/bits/select2.h
@@ -20,10 +20,8 @@
 # error "Never include <bits/select2.h> directly; use <sys/select.h> instead."
 #endif
 
-/* Helper functions to issue warnings and errors when needed.  */
-extern long int __fdelt_chk (long int __d);
-extern long int __fdelt_warn (long int __d)
-  __warnattr ("bit outside of fd_set selected");
+#include <bits/select-decl.h>
+
 #undef __FD_ELT
 #define	__FD_ELT(d) \
   __extension__								    \
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 17/21] misc/bits/syslog.h: Clearly separate declaration from definition
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (15 preceding siblings ...)
  2023-06-20 18:19 ` [PATCH 16/21] misc/bits/select2.h: Clearly separate declaration from definitions Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-22  4:24   ` Siddhesh Poyarekar
  2023-06-20 18:19 ` [PATCH 18/21] rt/tst-mqueue4.c: Fix wrong number of argument for mq_open Frédéric Bérat
                   ` (3 subsequent siblings)
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

This allows to include bits/syslog-decl.h in include/sys/syslog.h and
therefore be able to create the libc_hidden_builtin_proto (__syslog_chk)
prototype.
---
 include/bits/syslog-decl.h                    |  1 +
 include/sys/syslog.h                          |  4 +++
 misc/Makefile                                 |  1 +
 misc/bits/syslog-decl.h                       | 35 +++++++++++++++++++
 misc/bits/syslog.h                            | 10 +-----
 misc/syslog.c                                 |  4 ++-
 .../ldbl-128ibm-compat/ieee128-syslog.c       |  1 +
 7 files changed, 46 insertions(+), 10 deletions(-)
 create mode 100644 include/bits/syslog-decl.h
 create mode 100644 misc/bits/syslog-decl.h

diff --git a/include/bits/syslog-decl.h b/include/bits/syslog-decl.h
new file mode 100644
index 0000000000..491a263777
--- /dev/null
+++ b/include/bits/syslog-decl.h
@@ -0,0 +1 @@
+#include <misc/bits/syslog-decl.h>
diff --git a/include/sys/syslog.h b/include/sys/syslog.h
index 44422eab13..1566228860 100644
--- a/include/sys/syslog.h
+++ b/include/sys/syslog.h
@@ -3,6 +3,8 @@
 #include <misc/sys/syslog.h>
 #ifndef _ISOMAC
 
+#include <bits/syslog-decl.h>
+
 libc_hidden_ldbl_proto (syslog)
 
 /* __vsyslog_internal uses the same mode_flags bits as
@@ -12,5 +14,7 @@ extern void __vsyslog_internal (int pri, const char *fmt, __gnuc_va_list ap,
      attribute_hidden
      __attribute__ ((__format__ (__printf__, 2, 0)));
 
+libc_hidden_ldbl_proto (__syslog_chk)
+
 #endif /* _ISOMAC */
 #endif /* syslog.h */
diff --git a/misc/Makefile b/misc/Makefile
index 3497d30f3b..fe0d49c1de 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -64,6 +64,7 @@ headers	:= \
   sys/xattr.h \
   syslog.h \
   sys/syslog.h \
+  bits/syslog-decl.h \
   bits/syslog.h \
   bits/syslog-ldbl.h \
   bits/syslog-path.h \
diff --git a/misc/bits/syslog-decl.h b/misc/bits/syslog-decl.h
new file mode 100644
index 0000000000..6d60cd4e31
--- /dev/null
+++ b/misc/bits/syslog-decl.h
@@ -0,0 +1,35 @@
+/* Checking routines for syslog functions. Declaration only.
+   Copyright (C) 2023 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/>.  */
+
+#ifndef _BITS_SYSLOG_DECL_H
+#define _BITS_SYSLOG_DECL_H 1
+
+#ifndef _SYS_SYSLOG_H
+# error "Never include <bits/syslog.h> directly; use <sys/syslog.h> instead."
+#endif
+
+extern void __syslog_chk (int __pri, int __flag, const char *__fmt, ...)
+     __attribute__ ((__format__ (__printf__, 3, 4)));
+
+#ifdef __USE_MISC
+extern void __vsyslog_chk (int __pri, int __flag, const char *__fmt,
+			   __gnuc_va_list __ap)
+     __attribute__ ((__format__ (__printf__, 3, 0)));
+#endif
+
+#endif
diff --git a/misc/bits/syslog.h b/misc/bits/syslog.h
index 305cac4ba0..d7de90ed14 100644
--- a/misc/bits/syslog.h
+++ b/misc/bits/syslog.h
@@ -20,15 +20,7 @@
 # error "Never include <bits/syslog.h> directly; use <sys/syslog.h> instead."
 #endif
 
-
-extern void __syslog_chk (int __pri, int __flag, const char *__fmt, ...)
-     __attribute__ ((__format__ (__printf__, 3, 4)));
-
-#ifdef __USE_MISC
-extern void __vsyslog_chk (int __pri, int __flag, const char *__fmt,
-			   __gnuc_va_list __ap)
-     __attribute__ ((__format__ (__printf__, 3, 0)));
-#endif
+#include <bits/syslog-decl.h>
 
 #include <bits/floatn.h>
 #if defined __LDBL_COMPAT || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
diff --git a/misc/syslog.c b/misc/syslog.c
index f67d4b58a4..1b8cb722c5 100644
--- a/misc/syslog.c
+++ b/misc/syslog.c
@@ -101,7 +101,7 @@ __vsyslog (int pri, const char *fmt, va_list ap)
 ldbl_weak_alias (__vsyslog, vsyslog)
 
 void
-__syslog_chk (int pri, int flag, const char *fmt, ...)
+___syslog_chk (int pri, int flag, const char *fmt, ...)
 {
   va_list ap;
 
@@ -109,6 +109,8 @@ __syslog_chk (int pri, int flag, const char *fmt, ...)
   __vsyslog_internal (pri, fmt, ap, (flag > 0) ? PRINTF_FORTIFY : 0);
   va_end (ap);
 }
+ldbl_hidden_def (___syslog_chk, __syslog_chk)
+ldbl_strong_alias (___syslog_chk, __syslog_chk)
 
 void
 __vsyslog_chk (int pri, int flag, const char *fmt, va_list ap)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
index 18aa7f707f..97810a7bbd 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
@@ -52,6 +52,7 @@ ___ieee128___syslog_chk (int pri, int flag, const char *fmt, ...)
   __vsyslog_internal (pri, fmt, ap, mode);
   va_end (ap);
 }
+hidden_def (___ieee128___syslog_chk)
 strong_alias (___ieee128___syslog_chk, __syslog_chkieee128)
 
 void
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 18/21] rt/tst-mqueue4.c: Fix wrong number of argument for mq_open
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (16 preceding siblings ...)
  2023-06-20 18:19 ` [PATCH 17/21] misc/bits/syslog.h: Clearly separate declaration from definition Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-21 12:26   ` Siddhesh Poyarekar
  2023-06-20 18:19 ` [PATCH 19/21] sysdeps/ieee754/ldbl-128ibm-compat: Fix warn unused result Frédéric Bérat
                   ` (2 subsequent siblings)
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

The mq_open routine should only get either 2 or 4 arguments, this test
wrongly passed 3.
---
 rt/tst-mqueue4.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/rt/tst-mqueue4.c b/rt/tst-mqueue4.c
index fe456287a3..9fcaef107b 100644
--- a/rt/tst-mqueue4.c
+++ b/rt/tst-mqueue4.c
@@ -175,14 +175,14 @@ do_test (void)
       result = 1;
     }
 
-  q2 = mq_open (name, O_RDONLY, 0600);
+  q2 = mq_open (name, O_RDONLY);
   if (q2 == (mqd_t) -1)
     {
       printf ("mq_open without O_CREAT failed with %m\n");
       result = 1;
     }
 
-  mqd_t q3 = mq_open (name, O_RDONLY, 0600);
+  mqd_t q3 = mq_open (name, O_RDONLY);
   if (q3 == (mqd_t) -1)
     {
       printf ("mq_open without O_CREAT failed with %m\n");
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 19/21] sysdeps/ieee754/ldbl-128ibm-compat: Fix warn unused result
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (17 preceding siblings ...)
  2023-06-20 18:19 ` [PATCH 18/21] rt/tst-mqueue4.c: Fix wrong number of argument for mq_open Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-21 11:56   ` Siddhesh Poyarekar
  2023-06-20 18:19 ` [PATCH 20/21] sysdeps/powerpc/fpu/tst-setcontext-fpscr.c: " Frédéric Bérat
  2023-06-20 18:19 ` [PATCH 21/21] benchtests: fix " Frédéric Bérat
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

Return value from *scanf and *asprintf routines are now properly checked
in test-scanf-ldbl-compat-template.c and test-printf-ldbl-compat.c.
---
 .../test-printf-ldbl-compat.c                 | 10 +++++----
 .../test-scanf-ldbl-compat-template.c         | 21 ++++++++++---------
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c
index 3c759e1427..95c1a28522 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c
@@ -30,12 +30,13 @@ do_test_call_varg (FILE *stream, const char *format, ...)
   char *buffer = NULL;
   char string[128];
   va_list args;
+  int ret;
 
   printf ("%15s", "vasprintf: ");
   va_start (args, format);
-  vasprintf (&buffer, format, args);
+  ret = vasprintf (&buffer, format, args);
   va_end (args);
-  if (buffer == NULL)
+  if (ret < 22 || buffer == NULL)
     printf ("Error using vasprintf\n");
   else
     {
@@ -82,10 +83,11 @@ do_test_call_rarg (FILE *stream, const char *format, long double ld, double d)
 {
   char *buffer = NULL;
   char string[128];
+  int ret;
 
   printf ("%15s", "asprintf: ");
-  asprintf (&buffer, format, ld, d);
-  if (buffer == NULL)
+  ret = asprintf (&buffer, format, ld, d);
+  if (ret < 22 || buffer == NULL)
     printf ("Error using asprintf\n");
   else
     {
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c
index e8da3a67f0..776c12dd16 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c
@@ -37,10 +37,10 @@
   ldptr = va_arg (args, long double *);					\
   fptr = va_arg (args, float *);					\
   va_end (args);							\
-  if (*ldptr == -1 && *fptr == -2)					\
+  if (*ldptr == -1 && *fptr == -2 && ret == 2)				\
     printf ("OK");							\
   else									\
-    printf ("ERROR (%Lf %f)", *ldptr, *fptr);				\
+    printf ("ERROR (%Lf %f %d)", *ldptr, *fptr, ret);			\
   printf ("\n");
 
 #define CLEAR_VALUE							\
@@ -48,10 +48,10 @@
   f = 0;
 
 #define CHECK_VALUE							\
-  if (ld == -1 && f == -2)						\
+  if (ld == -1 && f == -2 && ret == 2)					\
     printf ("OK");							\
   else									\
-    printf ("ERROR (%Lf %f)", ld, f);					\
+    printf ("ERROR (%Lf %f %d)", ld, f, ret);				\
   printf ("\n");
 
 static void
@@ -62,40 +62,41 @@ do_test_call (FILE *stream, CHAR *string, const CHAR *format, ...)
   float *fptr;
   long double *ldptr;
   va_list args;
+  int ret;
 
   CLEAR_VALUE
   printf ("fscanf: ");
-  FSCANF (stream, format, &ld, &f);
+  ret = FSCANF (stream, format, &ld, &f);
   CHECK_VALUE
 
   CLEAR_VALUE
   printf ("scanf: ");
-  SCANF (format, &ld, &f);
+  ret = SCANF (format, &ld, &f);
   CHECK_VALUE
 
   CLEAR_VALUE
   printf ("sscanf: ");
-  SSCANF (string, format, &ld, &f);
+  ret = SSCANF (string, format, &ld, &f);
   CHECK_VALUE
 
   CLEAR_VARGS
   printf ("vfscanf: ");
   va_start (args, format);
-  VFSCANF (stream, format, args);
+  ret = VFSCANF (stream, format, args);
   va_end (args);
   CHECK_VARGS
 
   CLEAR_VARGS
   printf ("vscanf: ");
   va_start (args, format);
-  VSCANF (format, args);
+  ret = VSCANF (format, args);
   va_end (args);
   CHECK_VARGS
 
   CLEAR_VARGS
   printf ("vsscanf: ");
   va_start (args, format);
-  VSSCANF (string, format, args);
+  ret = VSSCANF (string, format, args);
   va_end (args);
   CHECK_VARGS
 }
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 20/21] sysdeps/powerpc/fpu/tst-setcontext-fpscr.c: Fix warn unused result
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (18 preceding siblings ...)
  2023-06-20 18:19 ` [PATCH 19/21] sysdeps/ieee754/ldbl-128ibm-compat: Fix warn unused result Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-21 11:45   ` Siddhesh Poyarekar
  2023-06-20 18:19 ` [PATCH 21/21] benchtests: fix " Frédéric Bérat
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

The fread routine return value needs to be checked when fortification
is enabled, hence use xfread helper.
---
 sysdeps/powerpc/fpu/tst-setcontext-fpscr.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c b/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c
index 2fd8838bbe..2eba5f2672 100644
--- a/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c
+++ b/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c
@@ -27,6 +27,8 @@
 #include <sys/auxv.h>
 #include <support/support.h>
 
+#include <support/xstdio.h>
+
 static ucontext_t ctx[3];
 
 
@@ -61,7 +63,7 @@ ElfW(Addr) query_auxv(int type)
 
       do
 	{
-	  fread (&auxv_struct, sizeof (ElfW(auxv_t)), 1, auxv_f);
+	  xfread (&auxv_struct, sizeof (ElfW(auxv_t)), 1, auxv_f);
 	  auxv[i] = auxv_struct;
 	  i++;
 	} while(auxv_struct.a_type != AT_NULL);
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 21/21] benchtests: fix warn unused result
  2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
                   ` (19 preceding siblings ...)
  2023-06-20 18:19 ` [PATCH 20/21] sysdeps/powerpc/fpu/tst-setcontext-fpscr.c: " Frédéric Bérat
@ 2023-06-20 18:19 ` Frédéric Bérat
  2023-06-21 11:42   ` Siddhesh Poyarekar
  20 siblings, 1 reply; 50+ messages in thread
From: Frédéric Bérat @ 2023-06-20 18:19 UTC (permalink / raw)
  To: libc-alpha; +Cc: siddhesh, fberat

Few tests needed to properly check for asprintf and system calls return
values with _FORTIFY_SOURCE enabled.
---
 benchtests/bench-strcoll.c                            | 6 +++++-
 sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c | 3 ++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/benchtests/bench-strcoll.c b/benchtests/bench-strcoll.c
index b3cd5ce8a9..0bd9ada5f6 100644
--- a/benchtests/bench-strcoll.c
+++ b/benchtests/bench-strcoll.c
@@ -254,7 +254,11 @@ main (void)
 	}
 
       char *filename;
-      asprintf (&filename, INPUT_PREFIX "%s", input_files[i]);
+      if (asprintf (&filename, INPUT_PREFIX "%s", input_files[i]) < 0)
+	{
+	  printf ("asprintf failed, aborting!\n");
+	  return ERROR_FILENAME;
+	}
       result = bench_file (json_ctx, input_files[i], filename, locale + 1);
 
       if (result != OK)
diff --git a/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c b/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c
index e5cdb2b2a1..4631ec9f0b 100644
--- a/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c
+++ b/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c
@@ -24,6 +24,7 @@
 #include <sys/types.h>
 #include <sys/uio.h>
 #include <elf.h>
+#include <support/xstdlib.h>
 #include <support/xunistd.h>
 #include <support/check.h>
 #include <string.h>
@@ -44,7 +45,7 @@ tracee_func (int pid)
   char str[80];
   sprintf (str, "cat /proc/%d/maps", pid);
   puts (str);
-  system (str);
+  xsystem (str);
   fflush (stdout);
 
   TEST_VERIFY_EXIT (ptrace (PTRACE_TRACEME) == 0);
-- 
2.41.0


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-20 18:18 ` [PATCH 01/21] Add --enable-fortify-source option Frédéric Bérat
@ 2023-06-20 20:42   ` Joseph Myers
  2023-06-21 13:19     ` Frederic Berat
  2023-06-21 13:18   ` Frederic Berat
  1 sibling, 1 reply; 50+ messages in thread
From: Joseph Myers @ 2023-06-20 20:42 UTC (permalink / raw)
  To: Frédéric Bérat; +Cc: libc-alpha, siddhesh

[-- Attachment #1: Type: text/plain, Size: 638 bytes --]

On Tue, 20 Jun 2023, Frédéric Bérat via Libc-alpha wrote:

> It is now possible to enable fortification.
> The level may be given as parameter, if none is provided, the configure
> script will determine what is the highest level possible that can be set
> considering GCC built-ins availability and set it.
> If level is explicitly set to 3, configure checks if the compiler
> supports the built-in function necessary for it or raise an error if it
> isn't.

A new configure option should be documented in manual/install.texi with 
INSTALL regenerated, and should be mentioned in NEWS as well.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 02/21] Configure: regenerate for autoconf 2.71
  2023-06-20 18:18 ` [PATCH 02/21] Configure: regenerate for autoconf 2.71 Frédéric Bérat
@ 2023-06-20 20:47   ` Joseph Myers
  2023-06-22 19:07   ` Florian Weimer
  1 sibling, 0 replies; 50+ messages in thread
From: Joseph Myers @ 2023-06-20 20:47 UTC (permalink / raw)
  To: Frédéric Bérat; +Cc: libc-alpha, siddhesh

[-- Attachment #1: Type: text/plain, Size: 637 bytes --]

On Tue, 20 Jun 2023, Frédéric Bérat via Libc-alpha wrote:

> Update configure.ac to enable support for autoconf 2.71, and autoreconf
> to integrate new enable-fortify-source option.

Please don't mix an autoconf version change into a patch series with 
another purpose.  If you wish to propose an autoconf version change, do it 
in a standalone patch with its own justification, making sure to update 
manual/install.texi, regenerate INSTALL and regenerate any configure / 
preconfigure fragments affected by the change (or say explicitly if such 
fragments are unchanged after regeneration).

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 21/21] benchtests: fix warn unused result
  2023-06-20 18:19 ` [PATCH 21/21] benchtests: fix " Frédéric Bérat
@ 2023-06-21 11:42   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-21 11:42 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:19, Frédéric Bérat wrote:
> Few tests needed to properly check for asprintf and system calls return
> values with _FORTIFY_SOURCE enabled.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

> ---
>   benchtests/bench-strcoll.c                            | 6 +++++-
>   sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c | 3 ++-
>   2 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/benchtests/bench-strcoll.c b/benchtests/bench-strcoll.c
> index b3cd5ce8a9..0bd9ada5f6 100644
> --- a/benchtests/bench-strcoll.c
> +++ b/benchtests/bench-strcoll.c
> @@ -254,7 +254,11 @@ main (void)
>   	}
>   
>         char *filename;
> -      asprintf (&filename, INPUT_PREFIX "%s", input_files[i]);
> +      if (asprintf (&filename, INPUT_PREFIX "%s", input_files[i]) < 0)
> +	{
> +	  printf ("asprintf failed, aborting!\n");
> +	  return ERROR_FILENAME;
> +	}
>         result = bench_file (json_ctx, input_files[i], filename, locale + 1);
>   
>         if (result != OK)
> diff --git a/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c b/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c
> index e5cdb2b2a1..4631ec9f0b 100644
> --- a/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c
> +++ b/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c
> @@ -24,6 +24,7 @@
>   #include <sys/types.h>
>   #include <sys/uio.h>
>   #include <elf.h>
> +#include <support/xstdlib.h>
>   #include <support/xunistd.h>
>   #include <support/check.h>
>   #include <string.h>
> @@ -44,7 +45,7 @@ tracee_func (int pid)
>     char str[80];
>     sprintf (str, "cat /proc/%d/maps", pid);
>     puts (str);
> -  system (str);
> +  xsystem (str);
>     fflush (stdout);
>   
>     TEST_VERIFY_EXIT (ptrace (PTRACE_TRACEME) == 0);

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 20/21] sysdeps/powerpc/fpu/tst-setcontext-fpscr.c: Fix warn unused result
  2023-06-20 18:19 ` [PATCH 20/21] sysdeps/powerpc/fpu/tst-setcontext-fpscr.c: " Frédéric Bérat
@ 2023-06-21 11:45   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-21 11:45 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:19, Frédéric Bérat wrote:
> The fread routine return value needs to be checked when fortification
> is enabled, hence use xfread helper.
> ---

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

>   sysdeps/powerpc/fpu/tst-setcontext-fpscr.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c b/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c
> index 2fd8838bbe..2eba5f2672 100644
> --- a/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c
> +++ b/sysdeps/powerpc/fpu/tst-setcontext-fpscr.c
> @@ -27,6 +27,8 @@
>   #include <sys/auxv.h>
>   #include <support/support.h>
>   
> +#include <support/xstdio.h>
> +
>   static ucontext_t ctx[3];
>   
>   
> @@ -61,7 +63,7 @@ ElfW(Addr) query_auxv(int type)
>   
>         do
>   	{
> -	  fread (&auxv_struct, sizeof (ElfW(auxv_t)), 1, auxv_f);
> +	  xfread (&auxv_struct, sizeof (ElfW(auxv_t)), 1, auxv_f);
>   	  auxv[i] = auxv_struct;
>   	  i++;
>   	} while(auxv_struct.a_type != AT_NULL);

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 19/21] sysdeps/ieee754/ldbl-128ibm-compat: Fix warn unused result
  2023-06-20 18:19 ` [PATCH 19/21] sysdeps/ieee754/ldbl-128ibm-compat: Fix warn unused result Frédéric Bérat
@ 2023-06-21 11:56   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-21 11:56 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:19, Frédéric Bérat wrote:
> Return value from *scanf and *asprintf routines are now properly checked
> in test-scanf-ldbl-compat-template.c and test-printf-ldbl-compat.c.
> ---
>   .../test-printf-ldbl-compat.c                 | 10 +++++----
>   .../test-scanf-ldbl-compat-template.c         | 21 ++++++++++---------
>   2 files changed, 17 insertions(+), 14 deletions(-)
> 
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c
> index 3c759e1427..95c1a28522 100644
> --- a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c
> @@ -30,12 +30,13 @@ do_test_call_varg (FILE *stream, const char *format, ...)
>     char *buffer = NULL;
>     char string[128];
>     va_list args;
> +  int ret;
>   
>     printf ("%15s", "vasprintf: ");
>     va_start (args, format);
> -  vasprintf (&buffer, format, args);
> +  ret = vasprintf (&buffer, format, args);
>     va_end (args);
> -  if (buffer == NULL)
> +  if (ret < 22 || buffer == NULL)

ret == -1 is a sufficient test here I think.

>       printf ("Error using vasprintf\n");
>     else
>       {
> @@ -82,10 +83,11 @@ do_test_call_rarg (FILE *stream, const char *format, long double ld, double d)
>   {
>     char *buffer = NULL;
>     char string[128];
> +  int ret;
>   
>     printf ("%15s", "asprintf: ");
> -  asprintf (&buffer, format, ld, d);
> -  if (buffer == NULL)
> +  ret = asprintf (&buffer, format, ld, d);
> +  if (ret < 22 || buffer == NULL)
>       printf ("Error using asprintf\n");
>     else
>       {
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c
> index e8da3a67f0..776c12dd16 100644
> --- a/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat-template.c
> @@ -37,10 +37,10 @@
>     ldptr = va_arg (args, long double *);					\
>     fptr = va_arg (args, float *);					\
>     va_end (args);							\
> -  if (*ldptr == -1 && *fptr == -2)					\
> +  if (*ldptr == -1 && *fptr == -2 && ret == 2)				\
>       printf ("OK");							\
>     else									\
> -    printf ("ERROR (%Lf %f)", *ldptr, *fptr);				\
> +    printf ("ERROR (%Lf %f %d)", *ldptr, *fptr, ret);			\
>     printf ("\n");
>   
>   #define CLEAR_VALUE							\
> @@ -48,10 +48,10 @@
>     f = 0;
>   
>   #define CHECK_VALUE							\
> -  if (ld == -1 && f == -2)						\
> +  if (ld == -1 && f == -2 && ret == 2)					\
>       printf ("OK");							\
>     else									\
> -    printf ("ERROR (%Lf %f)", ld, f);					\
> +    printf ("ERROR (%Lf %f %d)", ld, f, ret);				\
>     printf ("\n");
>   
>   static void
> @@ -62,40 +62,41 @@ do_test_call (FILE *stream, CHAR *string, const CHAR *format, ...)
>     float *fptr;
>     long double *ldptr;
>     va_list args;
> +  int ret;
>   
>     CLEAR_VALUE
>     printf ("fscanf: ");
> -  FSCANF (stream, format, &ld, &f);
> +  ret = FSCANF (stream, format, &ld, &f);
>     CHECK_VALUE
>   
>     CLEAR_VALUE
>     printf ("scanf: ");
> -  SCANF (format, &ld, &f);
> +  ret = SCANF (format, &ld, &f);
>     CHECK_VALUE
>   
>     CLEAR_VALUE
>     printf ("sscanf: ");
> -  SSCANF (string, format, &ld, &f);
> +  ret = SSCANF (string, format, &ld, &f);
>     CHECK_VALUE
>   
>     CLEAR_VARGS
>     printf ("vfscanf: ");
>     va_start (args, format);
> -  VFSCANF (stream, format, args);
> +  ret = VFSCANF (stream, format, args);
>     va_end (args);
>     CHECK_VARGS
>   
>     CLEAR_VARGS
>     printf ("vscanf: ");
>     va_start (args, format);
> -  VSCANF (format, args);
> +  ret = VSCANF (format, args);
>     va_end (args);
>     CHECK_VARGS
>   
>     CLEAR_VARGS
>     printf ("vsscanf: ");
>     va_start (args, format);
> -  VSSCANF (string, format, args);
> +  ret = VSSCANF (string, format, args);
>     va_end (args);
>     CHECK_VARGS
>   }

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 18/21] rt/tst-mqueue4.c: Fix wrong number of argument for mq_open
  2023-06-20 18:19 ` [PATCH 18/21] rt/tst-mqueue4.c: Fix wrong number of argument for mq_open Frédéric Bérat
@ 2023-06-21 12:26   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-21 12:26 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:19, Frédéric Bérat wrote:
> The mq_open routine should only get either 2 or 4 arguments, this test
> wrongly passed 3.
> ---

LGTM.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

>   rt/tst-mqueue4.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/rt/tst-mqueue4.c b/rt/tst-mqueue4.c
> index fe456287a3..9fcaef107b 100644
> --- a/rt/tst-mqueue4.c
> +++ b/rt/tst-mqueue4.c
> @@ -175,14 +175,14 @@ do_test (void)
>         result = 1;
>       }
>   
> -  q2 = mq_open (name, O_RDONLY, 0600);
> +  q2 = mq_open (name, O_RDONLY);
>     if (q2 == (mqd_t) -1)
>       {
>         printf ("mq_open without O_CREAT failed with %m\n");
>         result = 1;
>       }
>   
> -  mqd_t q3 = mq_open (name, O_RDONLY, 0600);
> +  mqd_t q3 = mq_open (name, O_RDONLY);
>     if (q3 == (mqd_t) -1)
>       {
>         printf ("mq_open without O_CREAT failed with %m\n");

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 04/21] sysdeps/{i386,x86_64}/mempcpy_chk.S: fix linknamespace for __mempcpy_chk
  2023-06-20 18:18 ` [PATCH 04/21] sysdeps/{i386,x86_64}/mempcpy_chk.S: fix linknamespace for __mempcpy_chk Frédéric Bérat
@ 2023-06-21 12:27   ` Siddhesh Poyarekar
  2023-06-21 17:26     ` Noah Goldstein
  0 siblings, 1 reply; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-21 12:27 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:18, Frédéric Bérat wrote:
> On i386 and x86_64, for libc.a specifically, __mempcpy_chk calls
> mempcpy which leads POSIX routines to call non-POSIX mempcpy indirectly.
> 
> This leads the linknamespace test to fail when glibc is built with
> __FORTIFY_SOURCE=3.
> 
> Since calling mempcpy doesn't bring any benefit for libc.a, directly
> call __mempcpy instead.
> ---

LGTM as an independent fix.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

>   sysdeps/i386/mempcpy_chk.S   | 2 +-
>   sysdeps/x86_64/mempcpy_chk.S | 2 +-
>   2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/sysdeps/i386/mempcpy_chk.S b/sysdeps/i386/mempcpy_chk.S
> index 8b785bd9a5..1e9bf71bfb 100644
> --- a/sysdeps/i386/mempcpy_chk.S
> +++ b/sysdeps/i386/mempcpy_chk.S
> @@ -28,6 +28,6 @@ ENTRY (__mempcpy_chk)
>   	movl	12(%esp), %eax
>   	cmpl	%eax, 16(%esp)
>   	jb	__chk_fail
> -	jmp	mempcpy
> +	jmp	__mempcpy
>   END (__mempcpy_chk)
>   #endif
> diff --git a/sysdeps/x86_64/mempcpy_chk.S b/sysdeps/x86_64/mempcpy_chk.S
> index b1ddb02f78..b60ee4ff08 100644
> --- a/sysdeps/x86_64/mempcpy_chk.S
> +++ b/sysdeps/x86_64/mempcpy_chk.S
> @@ -28,6 +28,6 @@
>   ENTRY (__mempcpy_chk)
>   	cmpq	%rdx, %rcx
>   	jb	__chk_fail
> -	jmp	mempcpy
> +	jmp	__mempcpy
>   END (__mempcpy_chk)
>   #endif

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 05/21] stdio-common: tests: Incorrect maxlen parameter for swprintf
  2023-06-20 18:18 ` [PATCH 05/21] stdio-common: tests: Incorrect maxlen parameter for swprintf Frédéric Bérat
@ 2023-06-21 12:29   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-21 12:29 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:18, Frédéric Bérat wrote:
> Few tests using swprintf are passing incorrect maxlen parameter.
> This triggers an abort when _FORTIFY_SOURCE is enabled.
> ---

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

>   stdio-common/tst-printf-bz25691.c    |  8 ++++----
>   stdio-common/tst-vfprintf-mbs-prec.c | 15 ++++++++-------
>   2 files changed, 12 insertions(+), 11 deletions(-)
> 
> diff --git a/stdio-common/tst-printf-bz25691.c b/stdio-common/tst-printf-bz25691.c
> index db81fdf590..44e9ea7d9d 100644
> --- a/stdio-common/tst-printf-bz25691.c
> +++ b/stdio-common/tst-printf-bz25691.c
> @@ -78,12 +78,12 @@ do_test (void)
>       wchar_t *result = xmalloc (resultsize);
>       int ret;
>   
> -    ret = swprintf (result, resultsize, L"%.65537s", mbs);
> +    ret = swprintf (result, mbssize, L"%.65537s", mbs);
>       TEST_COMPARE (ret, mbssize - 1);
>       TEST_COMPARE_BLOB (result, (ret + 1) * sizeof (wchar_t),
>   		       expected, expectedsize * sizeof (wchar_t));
>   
> -    ret = swprintf (result, resultsize, L"%1$.65537s", mbs);
> +    ret = swprintf (result, mbssize, L"%1$.65537s", mbs);
>       TEST_COMPARE (ret, mbssize - 1);
>       TEST_COMPARE_BLOB (result, (ret + 1) * sizeof (wchar_t),
>   		       expected, expectedsize * sizeof (wchar_t));
> @@ -91,10 +91,10 @@ do_test (void)
>       /* Same test, but with an invalid multibyte sequence.  */
>       mbs[mbssize - 2] = 0xff;
>   
> -    ret = swprintf (result, resultsize, L"%.65537s", mbs);
> +    ret = swprintf (result, mbssize, L"%.65537s", mbs);
>       TEST_COMPARE (ret, -1);
>   
> -    ret = swprintf (result, resultsize, L"%1$.65537s", mbs);
> +    ret = swprintf (result, mbssize, L"%1$.65537s", mbs);
>       TEST_COMPARE (ret, -1);
>   
>       free (mbs);
> diff --git a/stdio-common/tst-vfprintf-mbs-prec.c b/stdio-common/tst-vfprintf-mbs-prec.c
> index 38350ed60f..41c4139f21 100644
> --- a/stdio-common/tst-vfprintf-mbs-prec.c
> +++ b/stdio-common/tst-vfprintf-mbs-prec.c
> @@ -441,7 +441,8 @@ test_mbs_long (const char *mbs, const wchar_t *wide, const size_t *length)
>   static void
>   test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
>   {
> -  wchar_t buf[2000];
> +#define BUF_SIZE 2000
> +  wchar_t buf[BUF_SIZE];
>     _Static_assert (sizeof (buf) > sizeof (wchar_t) * WIDE_STRING_LENGTH,
>                     "buffer size consistent with string length");
>     const wchar_t *suffix = L"||TERM";
> @@ -450,13 +451,13 @@ test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
>   
>     /* Test formatting of the entire string.  */
>     {
> -    int ret = swprintf (buf, sizeof (buf), L"%s%ls", mbs, suffix);
> +    int ret = swprintf (buf, BUF_SIZE, L"%s%ls", mbs, suffix);
>       TEST_VERIFY (ret == WIDE_STRING_LENGTH + wcslen (suffix));
>       TEST_VERIFY (wmemcmp (buf, wide, WIDE_STRING_LENGTH) == 0);
>       TEST_VERIFY (wcscmp (buf + WIDE_STRING_LENGTH, suffix) == 0);
>   
>       /* Left-justified string, printed in full.  */
> -    ret = swprintf (buf, sizeof (buf), L"%-1500s%ls", mbs, suffix);
> +    ret = swprintf (buf, BUF_SIZE, L"%-1500s%ls", mbs, suffix);
>       TEST_VERIFY (ret == 1500 + wcslen (suffix));
>       TEST_VERIFY (wmemcmp (buf, wide, WIDE_STRING_LENGTH) == 0);
>       for (size_t i = WIDE_STRING_LENGTH; i < 1500; ++i)
> @@ -464,7 +465,7 @@ test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
>       TEST_VERIFY (wcscmp (buf + 1500, suffix) == 0);
>   
>       /* Right-justified string, printed in full.   */
> -    ret = swprintf (buf, sizeof (buf), L"%1500s%ls", mbs, suffix);
> +    ret = swprintf (buf, BUF_SIZE, L"%1500s%ls", mbs, suffix);
>       TEST_VERIFY (ret == 1500 + wcslen (suffix));
>       size_t padding = 1500 - WIDE_STRING_LENGTH;
>       for (size_t i = 0; i < padding; ++i)
> @@ -484,14 +485,14 @@ test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
>           printf ("info: %s: wide_len=%d actual_wide_len=%zu\n",
>                   __func__, wide_len, actual_wide_len);
>   
> -      int ret = swprintf (buf, sizeof (buf), L"%.*s%ls",
> +      int ret = swprintf (buf, BUF_SIZE, L"%.*s%ls",
>                             wide_len, mbs, suffix);
>         TEST_VERIFY (ret == actual_wide_len + wcslen (suffix));
>         TEST_VERIFY (wmemcmp (buf, wide, actual_wide_len) == 0);
>         TEST_VERIFY (wcscmp (buf + actual_wide_len, suffix) == 0);
>   
>         /* Left-justified string, printed in full.  */
> -      ret = swprintf (buf, sizeof (buf), L"%-1500.*s%ls",
> +      ret = swprintf (buf, BUF_SIZE, L"%-1500.*s%ls",
>                         wide_len, mbs, suffix);
>         TEST_VERIFY (ret == 1500 + wcslen (suffix));
>         TEST_VERIFY (wmemcmp (buf, wide, actual_wide_len) == 0);
> @@ -500,7 +501,7 @@ test_wide_long (const char *mbs, const wchar_t *wide, const size_t *length)
>         TEST_VERIFY (wcscmp (buf + 1500, suffix) == 0);
>   
>         /* Right-justified string, printed in full.   */
> -      ret = swprintf (buf, sizeof (buf), L"%1500.*s%ls",
> +      ret = swprintf (buf, BUF_SIZE, L"%1500.*s%ls",
>                         wide_len, mbs, suffix);
>         TEST_VERIFY (ret == 1500 + wcslen (suffix));
>         size_t padding = 1500 - actual_wide_len;

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-20 18:18 ` [PATCH 01/21] Add --enable-fortify-source option Frédéric Bérat
  2023-06-20 20:42   ` Joseph Myers
@ 2023-06-21 13:18   ` Frederic Berat
  2023-06-21 15:25     ` Siddhesh Poyarekar
  1 sibling, 1 reply; 50+ messages in thread
From: Frederic Berat @ 2023-06-21 13:18 UTC (permalink / raw)
  To: Maxim Kuvyrkov via Libc-alpha; +Cc: siddhesh

On Tue, Jun 20, 2023 at 8:19 PM Frédéric Bérat <fberat@redhat.com> wrote:
>
> It is now possible to enable fortification.
> The level may be given as parameter, if none is provided, the configure
> script will determine what is the highest level possible that can be set
> considering GCC built-ins availability and set it.
> If level is explicitly set to 3, configure checks if the compiler
> supports the built-in function necessary for it or raise an error if it
> isn't.
>
> The result of the configure checks is 2 variables, $fortify_source and
> $no_fortify_source that are used to appropriately populate CFLAGS.
>
> Since the feature needs some of the routines provided by Glibc, these
> are excluded from the fortification.
> ---
>  Makeconfig     | 33 ++++++++++++++++++++++++---
>  config.make.in |  3 ++-
>  configure.ac   | 60 +++++++++++++++++++++++++++++++++++---------------
>  elf/rtld-Rules |  2 +-
>  4 files changed, 75 insertions(+), 23 deletions(-)
>
> diff --git a/Makeconfig b/Makeconfig
> index 2514db35f6..59fbd9ebf9 100644
> --- a/Makeconfig
> +++ b/Makeconfig
> @@ -543,12 +543,13 @@ endif  # +link
>  # ARM, gcc always produces different debugging symbols when invoked with
>  # a -O greater than 0 than when invoked with -O0, regardless of anything else
>  # we're using to suppress optimizations.  Therefore, we need to explicitly pass
> -# -O0 to it through CFLAGS.
> +# -O0 to it through CFLAGS. By side effect, any fortification needs to be
> +# disabled as it needs -O greater than 0.
>  # Additionally, the build system will try to -include $(common-objpfx)/config.h
>  # when compiling the tests, which will throw an error if some special macros
>  # (such as __OPTIMIZE__ and IS_IN_build) aren't defined.  To avoid this, we
>  # tell gcc to define IS_IN_build.
> -CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build
> +CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build $(no-fortify-source)
>
>  ifeq (yes,$(build-shared))
>  # These indicate whether to link using the built ld.so or the installed one.
> @@ -901,6 +902,16 @@ define elide-stack-protector
>  $(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-stack-protector))
>  endef
>
> +# We might want to compile with fortify-source
> +ifneq ($(fortify-source),)
> ++fortify-source=$(fortify-source)
> +endif
> +
> +# Some routine can't be fortified like the ones used by fortify
> +define elide-fortify-source
> +$(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-fortify-source))
> +endef
> +
>  # The program that makes Emacs-style TAGS files.
>  ETAGS  := etags
>
> @@ -961,6 +972,16 @@ endif      # $(+cflags) == ""
>            $(+stack-protector) -fno-common
>  +gcc-nowarn := -w
>
> +# We must filter out elf because the early bootstrap of the dynamic loader
> +# cannot be fortified. Likewise we exclude dlfcn because it is entangled
> +# with the loader. We must filter out csu because early startup, like the
> +# loader, cannot be fortified. Lastly debug is the fortification routines
> +# themselves and they cannot be fortified.
> +do-fortify = $(filter-out elf dlfcn csu debug,$(subdir))
> +ifeq ($(do-fortify),$(subdir))
> ++cflags += $(+fortify-source)
> +endif

This needs to be adapted to deal with compilers that define
"_FORTIFY_SOURCE" by default (checked on ubuntu 22.04):

+do-fortify = $(filter-out elf dlfcn csu debug,$(subdir))
+ifeq ($(do-fortify),$(subdir))
++cflags += $(+fortify-source)
+else
++cflags += $(no-fortify-source)
+endif

That way, we ensure that even if _FORTIFY_SOURCE is enabled at system
level, we don't build these subdirectories with it.

> +
>  # Each sysdeps directory can contain header files that both will be
>  # used to compile and will be installed.  Each can also contain an
>  # include/ subdirectory, whose header files will be used to compile
> @@ -1010,7 +1031,7 @@ module-cppflags = $(if $(filter %.mk.i %.v.i,$(@F)),,$(module-cppflags-real))
>  # Note that we can't use -std=* in CPPFLAGS, because it overrides
>  # the implicit -lang-asm and breaks cpp behavior for .S files--notably
>  # it causes cpp to stop predefining __ASSEMBLER__.
> -CPPFLAGS = $(config-extra-cppflags) $(CPPUNDEFS) $(CPPFLAGS-config) \
> +CPPFLAGS = $(config-extra-cppflags) $(CPPFLAGS-config) \
>            $($(subdir)-CPPFLAGS) \
>            $(+includes) $(defines) $(module-cppflags) \
>            -include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
> @@ -1049,6 +1070,8 @@ object-suffixes :=
>  CPPFLAGS-.o = $(pic-default)
>  # libc.a must be compiled with -fPIE/-fpie for static PIE.
>  CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) $(pie-default)
> +CFLAGS-.o += $(call elide-fortify-source,.o,$(routines_no_fortify))
> +CFLAGS-.o += $(call elide-fortify-source,_chk.o,$(routines_no_fortify))
>  libtype.o := lib%.a
>  object-suffixes += .o
>  ifeq (yes,$(build-shared))
> @@ -1058,6 +1081,8 @@ object-suffixes += .os
>  pic-cppflags = -DPIC -DSHARED
>  CPPFLAGS-.os = $(pic-cppflags)
>  CFLAGS-.os = $(filter %frame-pointer,$(+cflags)) $(pic-ccflag)
> +CFLAGS-.os += $(call elide-fortify-source,.os,$(routines_no_fortify))
> +CFLAGS-.os += $(call elide-fortify-source,_chk.os,$(routines_no_fortify))
>  libtype.os := lib%_pic.a
>  # This can be changed by a sysdep makefile
>  pic-ccflag = -fPIC
> @@ -1077,6 +1102,8 @@ object-suffixes += .op
>  CPPFLAGS-.op = -DPROF $(pic-default)
>  # libc_p.a must be compiled with -fPIE/-fpie for static PIE.
>  CFLAGS-.op = -pg $(pie-default)
> +CFLAGS-.op += $(call elide-fortify-source,.op,$(routines_no_fortify))
> +CFLAGS-.op += $(call elide-fortify-source,_chk.op,$(routines_no_fortify))
>  libtype.op = lib%_p.a
>  endif
>
> diff --git a/config.make.in b/config.make.in
> index 4afd37feaf..d487a4f4e9 100644
> --- a/config.make.in
> +++ b/config.make.in
> @@ -64,6 +64,8 @@ have-fpie = @libc_cv_fpie@
>  have-ssp = @libc_cv_ssp@
>  stack-protector = @stack_protector@
>  no-stack-protector = @no_stack_protector@
> +fortify-source = @fortify_source@
> +no-fortify-source = @no_fortify_source@
>  have-selinux = @have_selinux@
>  have-libaudit = @have_libaudit@
>  have-libcap = @have_libcap@
> @@ -101,7 +103,6 @@ CXX = @CXX@
>  BUILD_CC = @BUILD_CC@
>  CFLAGS = @CFLAGS@
>  CPPFLAGS-config = @CPPFLAGS@
> -CPPUNDEFS = @CPPUNDEFS@
>  extra-nonshared-cflags = @extra_nonshared_cflags@
>  rtld-early-cflags = @rtld_early_cflags@
>  ASFLAGS-config = @ASFLAGS_config@
> diff --git a/configure.ac b/configure.ac
> index 21879c933c..ec4de6e551 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -466,6 +466,17 @@ AC_ARG_ENABLE([scv],
>
>  AS_IF([[test "$use_scv" != "no"]],[AC_DEFINE(USE_PPC_SCV)])
>
> +dnl Build glibc with _FORTIFY_SOURCE
> +AC_ARG_ENABLE(fortify-source,
> +              AS_HELP_STRING([--enable-fortify-source@<:@=1|2|3@:>@],
> +                             [Use -D_FORTIFY_SOURCE=[1|2|3] to control code hardening, defaults to highest possible value for your system]),
> +              [enable_fortify_source=$enableval],
> +              [enable_fortify_source=no])
> +case "$enable_fortify_source" in
> +1|2|3|no|yes) ;;
> +*) AC_MSG_ERROR([Not a valid argument for --enable-fortify-source: "$enable_fortify_source"]);;
> +esac
> +
>  # We keep the original values in `$config_*' and never modify them, so we
>  # can write them unchanged into config.make.  Everything else uses
>  # $machine, $vendor, and $os, and changes them whenever convenient.
> @@ -1559,24 +1570,37 @@ if test "x$have_selinux" = xyes; then
>  fi
>  AC_SUBST(have_selinux)
>
> -CPPUNDEFS=
> -dnl Check for silly hacked compilers predefining _FORTIFY_SOURCE.
> -dnl Since we are building the implementations of the fortified functions here,
> -dnl having the macro defined interacts very badly.
> -dnl _FORTIFY_SOURCE requires compiler optimization level 1 (gcc -O1)
> -dnl and above (see "man FEATURE_TEST_MACROS").
> -dnl So do NOT replace AC_COMPILE_IFELSE with AC_PREPROC_IFELSE.
> -AC_CACHE_CHECK([for _FORTIFY_SOURCE predefine], libc_cv_predef_fortify_source,
> -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
> -#ifdef _FORTIFY_SOURCE
> -# error bogon
> -#endif]])],
> -               [libc_cv_predef_fortify_source=no],
> -               [libc_cv_predef_fortify_source=yes])])
> -if test $libc_cv_predef_fortify_source = yes; then
> -  CPPUNDEFS="${CPPUNDEFS:+$CPPUNDEFS }-U_FORTIFY_SOURCE"
> -fi
> -AC_SUBST(CPPUNDEFS)
> +dnl Check if we support the requested _FORTIFY_SOURCE level
> +dnl If not, then don't use it.
> +dnl Note that _FORTIFY_SOURCE may have been set through FLAGS too.
> +dnl _FORTIFY_SOURCE value will be selectively disabled for function that can't
> +dnl support it
> +fortify_source=""
> +no_fortify_source="-Wp,-U_FORTIFY_SOURCE"
> +
> +AC_CACHE_CHECK([for __builtin_dynamic_object_size], [libc_cv___builtin_dynamic_object_size], [
> +    AC_LINK_IFELSE([AC_LANG_PROGRAM([], [__builtin_dynamic_object_size("", 0)])],
> +        [libc_cv___builtin_dynamic_object_size=yes
> +         AS_IF([test "$enable_fortify_source" = yes], [enable_fortify_source=3])],
> +        [libc_cv___builtin_dynamic_object_size=no
> +         AS_IF([test "$enable_fortify_source" = yes], [enable_fortify_source=2])])
> +])
> +
> +AS_CASE([$enable_fortify_source],
> +        [1|2], [libc_cv_fortify_source=yes],
> +        [3], [AS_IF([test "$libc_cv___builtin_dynamic_object_size" = yes],
> +                    [libc_cv_fortify_source=yes],
> +                    [AC_MSG_ERROR([Compiler doesn't provide necessary support for _FORTIFY_SOURCE=3])])],
> +        [libc_cv_fortify_source=no])
> +
> +AS_IF([test "$libc_cv_fortify_source" = yes],
> +      [fortify_source="${no_fortify_source},-D_FORTIFY_SOURCE=${enable_fortify_source}"]
> +      )
> +
> +AC_SUBST(enable_fortify_source)
> +AC_SUBST(libc_cv_fortify_source)
> +AC_SUBST(no_fortify_source)
> +AC_SUBST(fortify_source)
>
>  dnl Starting with binutils 2.35, GAS can attach multiple symbol versions
>  dnl to one symbol (PR 23840).
> diff --git a/elf/rtld-Rules b/elf/rtld-Rules
> index 56bc4543de..365a3408f3 100644
> --- a/elf/rtld-Rules
> +++ b/elf/rtld-Rules
> @@ -144,6 +144,6 @@ cpp-srcs-left := $(rtld-modules:%.os=%)
>  lib := rtld
>  include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left))
>
> -rtld-CFLAGS += $(no-stack-protector)
> +rtld-CFLAGS += $(no-stack-protector) $(no-fortify-source)
>
>  endif
> --
> 2.41.0
>


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-20 20:42   ` Joseph Myers
@ 2023-06-21 13:19     ` Frederic Berat
  0 siblings, 0 replies; 50+ messages in thread
From: Frederic Berat @ 2023-06-21 13:19 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha, siddhesh

On Tue, Jun 20, 2023 at 10:42 PM Joseph Myers <joseph@codesourcery.com> wrote:
>
> On Tue, 20 Jun 2023, Frédéric Bérat via Libc-alpha wrote:
>
> > It is now possible to enable fortification.
> > The level may be given as parameter, if none is provided, the configure
> > script will determine what is the highest level possible that can be set
> > considering GCC built-ins availability and set it.
> > If level is explicitly set to 3, configure checks if the compiler
> > supports the built-in function necessary for it or raise an error if it
> > isn't.
>
> A new configure option should be documented in manual/install.texi with
> INSTALL regenerated, and should be mentioned in NEWS as well.
>

I'll do it. I'll also squash the configure script refresh in there,
and refresh it with autoconf 2.69 as requested in the other patch.

> --
> Joseph S. Myers
> joseph@codesourcery.com


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-21 13:18   ` Frederic Berat
@ 2023-06-21 15:25     ` Siddhesh Poyarekar
  2023-06-22 11:48       ` Frederic Berat
  2023-06-23  5:46       ` Sam James
  0 siblings, 2 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-21 15:25 UTC (permalink / raw)
  To: Frederic Berat, Maxim Kuvyrkov via Libc-alpha
  Cc: Carlos O'Donell, Sam James

On 2023-06-21 09:18, Frederic Berat wrote:
> On Tue, Jun 20, 2023 at 8:19 PM Frédéric Bérat <fberat@redhat.com> wrote:
>>
>> It is now possible to enable fortification.
>> The level may be given as parameter, if none is provided, the configure
>> script will determine what is the highest level possible that can be set
>> considering GCC built-ins availability and set it.
>> If level is explicitly set to 3, configure checks if the compiler
>> supports the built-in function necessary for it or raise an error if it
>> isn't.
>>
>> The result of the configure checks is 2 variables, $fortify_source and
>> $no_fortify_source that are used to appropriately populate CFLAGS.
>>
>> Since the feature needs some of the routines provided by Glibc, these
>> are excluded from the fortification.
>> ---
>>   Makeconfig     | 33 ++++++++++++++++++++++++---
>>   config.make.in |  3 ++-
>>   configure.ac   | 60 +++++++++++++++++++++++++++++++++++---------------
>>   elf/rtld-Rules |  2 +-
>>   4 files changed, 75 insertions(+), 23 deletions(-)
>>
>> diff --git a/Makeconfig b/Makeconfig
>> index 2514db35f6..59fbd9ebf9 100644
>> --- a/Makeconfig
>> +++ b/Makeconfig
>> @@ -543,12 +543,13 @@ endif  # +link
>>   # ARM, gcc always produces different debugging symbols when invoked with
>>   # a -O greater than 0 than when invoked with -O0, regardless of anything else
>>   # we're using to suppress optimizations.  Therefore, we need to explicitly pass
>> -# -O0 to it through CFLAGS.
>> +# -O0 to it through CFLAGS. By side effect, any fortification needs to be
>> +# disabled as it needs -O greater than 0.
>>   # Additionally, the build system will try to -include $(common-objpfx)/config.h
>>   # when compiling the tests, which will throw an error if some special macros
>>   # (such as __OPTIMIZE__ and IS_IN_build) aren't defined.  To avoid this, we
>>   # tell gcc to define IS_IN_build.
>> -CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build
>> +CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build $(no-fortify-source)
>>
>>   ifeq (yes,$(build-shared))
>>   # These indicate whether to link using the built ld.so or the installed one.
>> @@ -901,6 +902,16 @@ define elide-stack-protector
>>   $(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-stack-protector))
>>   endef
>>
>> +# We might want to compile with fortify-source
>> +ifneq ($(fortify-source),)
>> ++fortify-source=$(fortify-source)
>> +endif
>> +
>> +# Some routine can't be fortified like the ones used by fortify
>> +define elide-fortify-source
>> +$(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-fortify-source))
>> +endef
>> +
>>   # The program that makes Emacs-style TAGS files.
>>   ETAGS  := etags
>>
>> @@ -961,6 +972,16 @@ endif      # $(+cflags) == ""
>>             $(+stack-protector) -fno-common
>>   +gcc-nowarn := -w
>>
>> +# We must filter out elf because the early bootstrap of the dynamic loader
>> +# cannot be fortified. Likewise we exclude dlfcn because it is entangled
>> +# with the loader. We must filter out csu because early startup, like the
>> +# loader, cannot be fortified. Lastly debug is the fortification routines
>> +# themselves and they cannot be fortified.
>> +do-fortify = $(filter-out elf dlfcn csu debug,$(subdir))
>> +ifeq ($(do-fortify),$(subdir))
>> ++cflags += $(+fortify-source)
>> +endif
> 
> This needs to be adapted to deal with compilers that define
> "_FORTIFY_SOURCE" by default (checked on ubuntu 22.04):
> 
> +do-fortify = $(filter-out elf dlfcn csu debug,$(subdir))
> +ifeq ($(do-fortify),$(subdir))
> ++cflags += $(+fortify-source)
> +else
> ++cflags += $(no-fortify-source)
> +endif
> 
> That way, we ensure that even if _FORTIFY_SOURCE is enabled at system
> level, we don't build these subdirectories with it.

That's likely true for Gentoo as well.  Additionally, those 
distributions will default to fortification being enabled by default, 
without --enable-fortify-source.  This is probably wrong in terms of 
compatibility and user expectations, i.e. without the configure flag, 
the code generated should be like in 2.37, i.e. glibc should strictly 
not be built with fortification enabled.

Sam, do you have an opinion on this?  Would it be too surprising for 
Gentoo packaging/users if glibc 2.38 built with fortification on by 
default?  FWIW, we'll likely flip to enabling fortification by default 
in 2.39 and make the flag --disable-fortify-source, but that's a 
different bridge to cross.

Thanks,
Sid

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 04/21] sysdeps/{i386,x86_64}/mempcpy_chk.S: fix linknamespace for __mempcpy_chk
  2023-06-21 12:27   ` Siddhesh Poyarekar
@ 2023-06-21 17:26     ` Noah Goldstein
  2023-06-22  4:02       ` Siddhesh Poyarekar
  0 siblings, 1 reply; 50+ messages in thread
From: Noah Goldstein @ 2023-06-21 17:26 UTC (permalink / raw)
  To: Siddhesh Poyarekar; +Cc: Frédéric Bérat, libc-alpha

On 6/21/23, Siddhesh Poyarekar <siddhesh@gotplt.org> wrote:
>
>
> On 2023-06-20 14:18, Frédéric Bérat wrote:
>> On i386 and x86_64, for libc.a specifically, __mempcpy_chk calls
>> mempcpy which leads POSIX routines to call non-POSIX mempcpy indirectly.
>>
>> This leads the linknamespace test to fail when glibc is built with
>> __FORTIFY_SOURCE=3.
>>
>> Since calling mempcpy doesn't bring any benefit for libc.a, directly
>> call __mempcpy instead.
>> ---
>
> LGTM as an independent fix.
>
> Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
>
>>   sysdeps/i386/mempcpy_chk.S   | 2 +-
>>   sysdeps/x86_64/mempcpy_chk.S | 2 +-
>>   2 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/sysdeps/i386/mempcpy_chk.S b/sysdeps/i386/mempcpy_chk.S
>> index 8b785bd9a5..1e9bf71bfb 100644
>> --- a/sysdeps/i386/mempcpy_chk.S
>> +++ b/sysdeps/i386/mempcpy_chk.S
>> @@ -28,6 +28,6 @@ ENTRY (__mempcpy_chk)
>>   	movl	12(%esp), %eax
>>   	cmpl	%eax, 16(%esp)
>>   	jb	__chk_fail
>> -	jmp	mempcpy
>> +	jmp	__mempcpy
>>   END (__mempcpy_chk)
>>   #endif
>> diff --git a/sysdeps/x86_64/mempcpy_chk.S b/sysdeps/x86_64/mempcpy_chk.S
>> index b1ddb02f78..b60ee4ff08 100644
>> --- a/sysdeps/x86_64/mempcpy_chk.S
>> +++ b/sysdeps/x86_64/mempcpy_chk.S
>> @@ -28,6 +28,6 @@
>>   ENTRY (__mempcpy_chk)
>>   	cmpq	%rdx, %rcx
>>   	jb	__chk_fail
>> -	jmp	mempcpy
>> +	jmp	__mempcpy

Does this get the right ifunc (or isa version isa version of built
with cpu-specific flags)?
>>   END (__mempcpy_chk)
>>   #endif
>

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 04/21] sysdeps/{i386,x86_64}/mempcpy_chk.S: fix linknamespace for __mempcpy_chk
  2023-06-21 17:26     ` Noah Goldstein
@ 2023-06-22  4:02       ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-22  4:02 UTC (permalink / raw)
  To: Noah Goldstein; +Cc: Frédéric Bérat, libc-alpha

On 2023-06-21 13:26, Noah Goldstein wrote:
>>> diff --git a/sysdeps/x86_64/mempcpy_chk.S b/sysdeps/x86_64/mempcpy_chk.S
>>> index b1ddb02f78..b60ee4ff08 100644
>>> --- a/sysdeps/x86_64/mempcpy_chk.S
>>> +++ b/sysdeps/x86_64/mempcpy_chk.S
>>> @@ -28,6 +28,6 @@
>>>    ENTRY (__mempcpy_chk)
>>>    	cmpq	%rdx, %rcx
>>>    	jb	__chk_fail
>>> -	jmp	mempcpy
>>> +	jmp	__mempcpy
> 
> Does this get the right ifunc (or isa version isa version of built
> with cpu-specific flags)?

It should; __mempcpy is basically an internal alias for mempcpy, which 
is an ifunc:

$ nm /lib64/libc.a | grep "i .*mempcpy"
0000000000000000 i __mempcpy
0000000000000000 i mempcpy

Sid

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 15/21] debug/readlink{,at}_chk.c: Harmonize declaration and definition
  2023-06-20 18:19 ` [PATCH 15/21] debug/readlink{,at}_chk.c: Harmonize declaration and definition Frédéric Bérat
@ 2023-06-22  4:11   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-22  4:11 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:19, Frédéric Bérat wrote:
> The declaration and definition of these routines aren't consistent.
> 
> Make the definition of __readlink_chk and __readlinkat_chk match the
> declaration of the routines they fortify.  While there are no problems
> today this avoids any future potential problems related to the mismatch.
> ---

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

>   debug/readlink_chk.c   | 3 ++-
>   debug/readlinkat_chk.c | 3 ++-
>   2 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/debug/readlink_chk.c b/debug/readlink_chk.c
> index c491db2225..99dea40c7b 100644
> --- a/debug/readlink_chk.c
> +++ b/debug/readlink_chk.c
> @@ -24,7 +24,8 @@
>   
>   
>   ssize_t
> -__readlink_chk (const char *path, void *buf, size_t len, size_t buflen)
> +__readlink_chk (const char *__restrict path, char *__restrict buf, size_t len,
> +		size_t buflen)
>   {
>     if (len > buflen)
>       __chk_fail ();
> diff --git a/debug/readlinkat_chk.c b/debug/readlinkat_chk.c
> index 03feac92ec..163dec8b80 100644
> --- a/debug/readlinkat_chk.c
> +++ b/debug/readlinkat_chk.c
> @@ -20,7 +20,8 @@
>   
>   
>   ssize_t
> -__readlinkat_chk (int fd, const char *path, void *buf, size_t len,
> +__readlinkat_chk (int fd, const char *__restrict path,
> +		  char *__restrict buf, size_t len,
>   		  size_t buflen)
>   {
>     if (len > buflen)

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 16/21] misc/bits/select2.h: Clearly separate declaration from definitions
  2023-06-20 18:19 ` [PATCH 16/21] misc/bits/select2.h: Clearly separate declaration from definitions Frédéric Bérat
@ 2023-06-22  4:16   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-22  4:16 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha

On 2023-06-20 14:19, Frédéric Bérat wrote:
> The __fdelt_chk declaration needs to be available so that
> libc_hidden_builtin_proto can be used while not redefining __FD_ELT.
> Thus, misc/bits/select-decl.h is created to hold the corresponding
> prototypes.
> ---
>   debug/fdelt_chk.c          |  2 ++
>   include/bits/select-decl.h |  1 +
>   include/sys/select.h       |  4 ++++
>   misc/Makefile              |  1 +
>   misc/bits/select-decl.h    | 31 +++++++++++++++++++++++++++++++
>   misc/bits/select2.h        |  6 ++----
>   6 files changed, 41 insertions(+), 4 deletions(-)
>   create mode 100644 include/bits/select-decl.h
>   create mode 100644 misc/bits/select-decl.h
> 
> diff --git a/debug/fdelt_chk.c b/debug/fdelt_chk.c
> index d1d3a19460..841337a55d 100644
> --- a/debug/fdelt_chk.c
> +++ b/debug/fdelt_chk.c
> @@ -28,3 +28,5 @@ __fdelt_chk (long int d)
>     return d / __NFDBITS;
>   }
>   strong_alias (__fdelt_chk, __fdelt_warn)
> +
> +libc_hidden_builtin_def (__fdelt_chk)
> diff --git a/include/bits/select-decl.h b/include/bits/select-decl.h
> new file mode 100644
> index 0000000000..3526ea2a9d
> --- /dev/null
> +++ b/include/bits/select-decl.h
> @@ -0,0 +1 @@
> +#include "../../misc/bits/select-decl.h"

Use <misc/bits/select-decl.h> instead.

> diff --git a/include/sys/select.h b/include/sys/select.h
> index a8961afbed..e87806c249 100644
> --- a/include/sys/select.h
> +++ b/include/sys/select.h
> @@ -3,6 +3,10 @@
>   
>   #ifndef _ISOMAC
>   /* Now define the internal interfaces.  */
> +
> +#include <bits/select-decl.h>
> +libc_hidden_builtin_proto (__fdelt_chk)
> +
>   # if __TIMESIZE == 64
>   #  define __pselect64 __pselect
>   #  define __select64  __select
> diff --git a/misc/Makefile b/misc/Makefile
> index 36ba7a0bad..3497d30f3b 100644
> --- a/misc/Makefile
> +++ b/misc/Makefile
> @@ -68,6 +68,7 @@ headers	:= \
>     bits/syslog-ldbl.h \
>     bits/syslog-path.h \
>     bits/error.h \
> +  bits/select-decl.h \
>     bits/select2.h \
>     bits/hwcap.h \
>     sys/auxv.h \
> diff --git a/misc/bits/select-decl.h b/misc/bits/select-decl.h
> new file mode 100644
> index 0000000000..927ac4549b
> --- /dev/null
> +++ b/misc/bits/select-decl.h
> @@ -0,0 +1,31 @@
> +/* Checking routines for select functions. Declaration only.
> +   Copyright (C) 2023 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/>.  */
> +
> +#ifndef _BITS_SELECT_DECL_H
> +#define _BITS_SELECT_DECL_H 1
> +
> +#ifndef _SYS_SELECT_H
> +# error "Never include <bits/select2.h> directly; use <sys/select.h> instead."

Never include select-decl.h...

> +#endif
> +
> +/* Helper functions to issue warnings and errors when needed.  */
> +extern long int __fdelt_chk (long int __d);
> +extern long int __fdelt_warn (long int __d)
> +  __warnattr ("bit outside of fd_set selected");
> +
> +#endif
> diff --git a/misc/bits/select2.h b/misc/bits/select2.h
> index abd84a19d5..91e85c87d1 100644
> --- a/misc/bits/select2.h
> +++ b/misc/bits/select2.h
> @@ -20,10 +20,8 @@
>   # error "Never include <bits/select2.h> directly; use <sys/select.h> instead."
>   #endif
>   
> -/* Helper functions to issue warnings and errors when needed.  */
> -extern long int __fdelt_chk (long int __d);
> -extern long int __fdelt_warn (long int __d)
> -  __warnattr ("bit outside of fd_set selected");
> +#include <bits/select-decl.h>
> +
>   #undef __FD_ELT
>   #define	__FD_ELT(d) \
>     __extension__								    \

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 13/21] posix/bits/unistd.h: Clearly separate declaration from definitions
  2023-06-20 18:19 ` [PATCH 13/21] posix/bits/unistd.h: Clearly separate declaration from definitions Frédéric Bérat
@ 2023-06-22  4:17   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-22  4:17 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:19, Frédéric Bérat wrote:
> This change is similar to what was done for bits/wchar2.h.
> Routines declaration are moved into a dedicated bits/unistd-decl.h file
> which is then included into the bits/unistd.h file.
> 
> This will allow to adapt the files so that PLT entries are not created when
> _FORTIFY_SOURCE is enabled.
> ---
>   include/bits/unistd-decl.h |   1 +
>   include/unistd.h           |   1 +
>   posix/Makefile             |   1 +
>   posix/bits/unistd-decl.h   | 198 +++++++++++++++++++++++++++++++++++++
>   posix/bits/unistd.h        | 154 +----------------------------
>   5 files changed, 202 insertions(+), 153 deletions(-)
>   create mode 100644 include/bits/unistd-decl.h
>   create mode 100644 posix/bits/unistd-decl.h
> 
> diff --git a/include/bits/unistd-decl.h b/include/bits/unistd-decl.h
> new file mode 100644
> index 0000000000..7fcbd272ac
> --- /dev/null
> +++ b/include/bits/unistd-decl.h
> @@ -0,0 +1 @@
> +#include <posix/bits/unistd-decl.h>
> diff --git a/include/unistd.h b/include/unistd.h
> index 4345d08d60..b042a485f9 100644
> --- a/include/unistd.h
> +++ b/include/unistd.h
> @@ -5,6 +5,7 @@
>   
>   #  include <stdbool.h>
>   #  include <kernel-features.h>
> +#  include <bits/unistd-decl.h>
>   
>   libc_hidden_proto (_exit, __noreturn__)
>   #  ifndef NO_RTLD_HIDDEN
> diff --git a/posix/Makefile b/posix/Makefile
> index 5113ee3b74..3d368b91f6 100644
> --- a/posix/Makefile
> +++ b/posix/Makefile
> @@ -42,6 +42,7 @@ headers := \
>     bits/types/idtype_t.h \
>     bits/types/struct_sched_param.h \
>     bits/typesizes.h \
> +  bits/unistd-decl.h \
>     bits/unistd.h \
>     bits/unistd_ext.h \
>     bits/utsname.h \
> diff --git a/posix/bits/unistd-decl.h b/posix/bits/unistd-decl.h
> new file mode 100644
> index 0000000000..440911b20a
> --- /dev/null
> +++ b/posix/bits/unistd-decl.h
> @@ -0,0 +1,198 @@
> +/* Checking routines for unistd functions. Declaration only.
> +   Copyright (C) 2023 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/>.  */
> +
> +#ifndef _BITS_UNISTD_DECL_H
> +#define _BITS_UNISTD_DECL_H 1
> +
> +#ifndef _UNISTD_H
> +# error "Never include <bits/unistd.h> directly; use <unistd.h> instead."

Never use unistd-decl.h...

> +#endif
> +
> +extern ssize_t __read_chk (int __fd, void *__buf, size_t __nbytes,
> +			   size_t __buflen)
> +     __wur __attr_access ((__write_only__, 2, 3));
> +extern ssize_t __REDIRECT (__read_alias, (int __fd, void *__buf,
> +						  size_t __nbytes), read)
> +     __wur __attr_access ((__write_only__, 2, 3));
> +extern ssize_t __REDIRECT (__read_chk_warn,
> +			   (int __fd, void *__buf, size_t __nbytes,
> +			    size_t __buflen), __read_chk)
> +     __wur __warnattr ("read called with bigger length than size of "
> +		       "the destination buffer");
> +
> +#if defined __USE_UNIX98 || defined __USE_XOPEN2K8
> +extern ssize_t __pread_chk (int __fd, void *__buf, size_t __nbytes,
> +			    __off_t __offset, size_t __bufsize)
> +     __wur __attr_access ((__write_only__, 2, 3));
> +extern ssize_t __pread64_chk (int __fd, void *__buf, size_t __nbytes,
> +			      __off64_t __offset, size_t __bufsize)
> +     __wur __attr_access ((__write_only__, 2, 3));
> +extern ssize_t __REDIRECT (__pread_alias,
> +			   (int __fd, void *__buf, size_t __nbytes,
> +			    __off_t __offset), pread)
> +     __wur __attr_access ((__write_only__, 2, 3));
> +extern ssize_t __REDIRECT (__pread64_alias,
> +			   (int __fd, void *__buf, size_t __nbytes,
> +			    __off64_t __offset), pread64)
> +     __wur __attr_access ((__write_only__, 2, 3));
> +extern ssize_t __REDIRECT (__pread_chk_warn,
> +			   (int __fd, void *__buf, size_t __nbytes,
> +			    __off_t __offset, size_t __bufsize), __pread_chk)
> +     __wur __warnattr ("pread called with bigger length than size of "
> +		       "the destination buffer");
> +extern ssize_t __REDIRECT (__pread64_chk_warn,
> +			   (int __fd, void *__buf, size_t __nbytes,
> +			    __off64_t __offset, size_t __bufsize),
> +			    __pread64_chk)
> +     __wur __warnattr ("pread64 called with bigger length than size of "
> +		       "the destination buffer");
> +#endif
> +
> +#if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K
> +extern ssize_t __readlink_chk (const char *__restrict __path,
> +			       char *__restrict __buf, size_t __len,
> +			       size_t __buflen)
> +     __THROW __nonnull ((1, 2)) __wur __attr_access ((__write_only__, 2, 3));
> +extern ssize_t __REDIRECT_NTH (__readlink_alias,
> +			       (const char *__restrict __path,
> +				char *__restrict __buf, size_t __len), readlink)
> +     __nonnull ((1, 2)) __wur __attr_access ((__write_only__, 2, 3));
> +extern ssize_t __REDIRECT_NTH (__readlink_chk_warn,
> +			       (const char *__restrict __path,
> +				char *__restrict __buf, size_t __len,
> +				size_t __buflen), __readlink_chk)
> +     __nonnull ((1, 2)) __wur __warnattr ("readlink called with bigger length "
> +					  "than size of destination buffer");
> +#endif
> +
> +#ifdef __USE_ATFILE
> +extern ssize_t __readlinkat_chk (int __fd, const char *__restrict __path,
> +				 char *__restrict __buf, size_t __len,
> +				 size_t __buflen)
> +     __THROW __nonnull ((2, 3)) __wur __attr_access ((__write_only__, 3, 4));
> +extern ssize_t __REDIRECT_NTH (__readlinkat_alias,
> +			       (int __fd, const char *__restrict __path,
> +				char *__restrict __buf, size_t __len),
> +			       readlinkat)
> +     __nonnull ((2, 3)) __wur __attr_access ((__write_only__, 3, 4));
> +extern ssize_t __REDIRECT_NTH (__readlinkat_chk_warn,
> +			       (int __fd, const char *__restrict __path,
> +				char *__restrict __buf, size_t __len,
> +				size_t __buflen), __readlinkat_chk)
> +     __nonnull ((2, 3)) __wur __warnattr ("readlinkat called with bigger "
> +					  "length than size of destination "
> +					  "buffer");
> +#endif
> +
> +extern char *__getcwd_chk (char *__buf, size_t __size, size_t __buflen)
> +     __THROW __wur;
> +extern char *__REDIRECT_NTH (__getcwd_alias,
> +			     (char *__buf, size_t __size), getcwd) __wur;
> +extern char *__REDIRECT_NTH (__getcwd_chk_warn,
> +			     (char *__buf, size_t __size, size_t __buflen),
> +			     __getcwd_chk)
> +     __wur __warnattr ("getcwd caller with bigger length than size of "
> +		       "destination buffer");
> +
> +#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
> +extern char *__getwd_chk (char *__buf, size_t buflen)
> +     __THROW __nonnull ((1)) __wur __attr_access ((__write_only__, 1, 2));
> +extern char *__REDIRECT_NTH (__getwd_warn, (char *__buf), getwd)
> +     __nonnull ((1)) __wur __warnattr ("please use getcwd instead, as getwd "
> +				       "doesn't specify buffer size");
> +#endif
> +
> +extern size_t __confstr_chk (int __name, char *__buf, size_t __len,
> +			     size_t __buflen) __THROW
> +     __attr_access ((__write_only__, 2, 3));
> +extern size_t __REDIRECT_NTH (__confstr_alias, (int __name, char *__buf,
> +						size_t __len), confstr)
> +     __attr_access ((__write_only__, 2, 3));
> +extern size_t __REDIRECT_NTH (__confstr_chk_warn,
> +			      (int __name, char *__buf, size_t __len,
> +			       size_t __buflen), __confstr_chk)
> +     __warnattr ("confstr called with bigger length than size of destination "
> +		 "buffer");
> +
> +
> +extern int __getgroups_chk (int __size, __gid_t __list[], size_t __listlen)
> +     __THROW __wur __attr_access ((__write_only__, 2, 1));
> +extern int __REDIRECT_NTH (__getgroups_alias, (int __size, __gid_t __list[]),
> +			   getgroups) __wur __attr_access ((__write_only__, 2, 1));
> +extern int __REDIRECT_NTH (__getgroups_chk_warn,
> +			   (int __size, __gid_t __list[], size_t __listlen),
> +			   __getgroups_chk)
> +     __wur __warnattr ("getgroups called with bigger group count than what "
> +		       "can fit into destination buffer");
> +
> +
> +extern int __ttyname_r_chk (int __fd, char *__buf, size_t __buflen,
> +			    size_t __nreal) __THROW __nonnull ((2))
> +     __attr_access ((__write_only__, 2, 3));
> +extern int __REDIRECT_NTH (__ttyname_r_alias, (int __fd, char *__buf,
> +					       size_t __buflen), ttyname_r)
> +     __nonnull ((2));
> +extern int __REDIRECT_NTH (__ttyname_r_chk_warn,
> +			   (int __fd, char *__buf, size_t __buflen,
> +			    size_t __nreal), __ttyname_r_chk)
> +     __nonnull ((2)) __warnattr ("ttyname_r called with bigger buflen than "
> +				 "size of destination buffer");
> +
> +
> +#ifdef __USE_POSIX199506
> +extern int __getlogin_r_chk (char *__buf, size_t __buflen, size_t __nreal)
> +     __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
> +extern int __REDIRECT (__getlogin_r_alias, (char *__buf, size_t __buflen),
> +		       getlogin_r) __nonnull ((1));
> +extern int __REDIRECT (__getlogin_r_chk_warn,
> +		       (char *__buf, size_t __buflen, size_t __nreal),
> +		       __getlogin_r_chk)
> +     __nonnull ((1)) __warnattr ("getlogin_r called with bigger buflen than "
> +				 "size of destination buffer");
> +#endif
> +
> +
> +#if defined __USE_MISC || defined __USE_UNIX98
> +extern int __gethostname_chk (char *__buf, size_t __buflen, size_t __nreal)
> +     __THROW __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
> +extern int __REDIRECT_NTH (__gethostname_alias, (char *__buf, size_t __buflen),
> +			   gethostname)
> +     __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
> +extern int __REDIRECT_NTH (__gethostname_chk_warn,
> +			   (char *__buf, size_t __buflen, size_t __nreal),
> +			   __gethostname_chk)
> +     __nonnull ((1)) __warnattr ("gethostname called with bigger buflen than "
> +				 "size of destination buffer");
> +#endif
> +
> +
> +#if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_UNIX98)
> +extern int __getdomainname_chk (char *__buf, size_t __buflen, size_t __nreal)
> +     __THROW __nonnull ((1)) __wur __attr_access ((__write_only__, 1, 2));
> +extern int __REDIRECT_NTH (__getdomainname_alias, (char *__buf,
> +						   size_t __buflen),
> +			   getdomainname) __nonnull ((1))
> +     __wur __attr_access ((__write_only__, 1, 2));
> +extern int __REDIRECT_NTH (__getdomainname_chk_warn,
> +			   (char *__buf, size_t __buflen, size_t __nreal),
> +			   __getdomainname_chk)
> +     __nonnull ((1)) __wur __warnattr ("getdomainname called with bigger "
> +				       "buflen than size of destination "
> +				       "buffer");
> +#endif
> +#endif /* bits/unistd-decl.h.  */
> diff --git a/posix/bits/unistd.h b/posix/bits/unistd.h
> index 2a0782e6c8..6a381116a9 100644
> --- a/posix/bits/unistd.h
> +++ b/posix/bits/unistd.h
> @@ -20,17 +20,7 @@
>   # error "Never include <bits/unistd.h> directly; use <unistd.h> instead."
>   #endif
>   
> -extern ssize_t __read_chk (int __fd, void *__buf, size_t __nbytes,
> -			   size_t __buflen)
> -  __wur __attr_access ((__write_only__, 2, 3));
> -extern ssize_t __REDIRECT (__read_alias, (int __fd, void *__buf,
> -					  size_t __nbytes), read)
> -  __wur __attr_access ((__write_only__, 2, 3));
> -extern ssize_t __REDIRECT (__read_chk_warn,
> -			   (int __fd, void *__buf, size_t __nbytes,
> -			    size_t __buflen), __read_chk)
> -     __wur __warnattr ("read called with bigger length than size of "
> -		       "the destination buffer");
> +# include <bits/unistd-decl.h>
>   
>   __fortify_function __wur ssize_t
>   read (int __fd, void *__buf, size_t __nbytes)
> @@ -41,32 +31,6 @@ read (int __fd, void *__buf, size_t __nbytes)
>   }
>   
>   #if defined __USE_UNIX98 || defined __USE_XOPEN2K8
> -extern ssize_t __pread_chk (int __fd, void *__buf, size_t __nbytes,
> -			    __off_t __offset, size_t __bufsize)
> -  __wur __attr_access ((__write_only__, 2, 3));
> -extern ssize_t __pread64_chk (int __fd, void *__buf, size_t __nbytes,
> -			      __off64_t __offset, size_t __bufsize)
> -  __wur __attr_access ((__write_only__, 2, 3));
> -extern ssize_t __REDIRECT (__pread_alias,
> -			   (int __fd, void *__buf, size_t __nbytes,
> -			    __off_t __offset), pread)
> -  __wur __attr_access ((__write_only__, 2, 3));
> -extern ssize_t __REDIRECT (__pread64_alias,
> -			   (int __fd, void *__buf, size_t __nbytes,
> -			    __off64_t __offset), pread64)
> -  __wur __attr_access ((__write_only__, 2, 3));
> -extern ssize_t __REDIRECT (__pread_chk_warn,
> -			   (int __fd, void *__buf, size_t __nbytes,
> -			    __off_t __offset, size_t __bufsize), __pread_chk)
> -     __wur __warnattr ("pread called with bigger length than size of "
> -		       "the destination buffer");
> -extern ssize_t __REDIRECT (__pread64_chk_warn,
> -			   (int __fd, void *__buf, size_t __nbytes,
> -			    __off64_t __offset, size_t __bufsize),
> -			    __pread64_chk)
> -     __wur __warnattr ("pread64 called with bigger length than size of "
> -		       "the destination buffer");
> -
>   # ifndef __USE_FILE_OFFSET64
>   __fortify_function __wur ssize_t
>   pread (int __fd, void *__buf, size_t __nbytes, __off_t __offset)
> @@ -97,21 +61,6 @@ pread64 (int __fd, void *__buf, size_t __nbytes, __off64_t __offset)
>   #endif
>   
>   #if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K
> -extern ssize_t __readlink_chk (const char *__restrict __path,
> -			       char *__restrict __buf, size_t __len,
> -			       size_t __buflen)
> -     __THROW __nonnull ((1, 2)) __wur __attr_access ((__write_only__, 2, 3));
> -extern ssize_t __REDIRECT_NTH (__readlink_alias,
> -			       (const char *__restrict __path,
> -				char *__restrict __buf, size_t __len), readlink)
> -     __nonnull ((1, 2)) __wur __attr_access ((__write_only__, 2, 3));
> -extern ssize_t __REDIRECT_NTH (__readlink_chk_warn,
> -			       (const char *__restrict __path,
> -				char *__restrict __buf, size_t __len,
> -				size_t __buflen), __readlink_chk)
> -     __nonnull ((1, 2)) __wur __warnattr ("readlink called with bigger length "
> -					  "than size of destination buffer");
> -
>   __fortify_function __nonnull ((1, 2)) __wur ssize_t
>   __NTH (readlink (const char *__restrict __path, char *__restrict __buf,
>   		 size_t __len))
> @@ -123,23 +72,6 @@ __NTH (readlink (const char *__restrict __path, char *__restrict __buf,
>   #endif
>   
>   #ifdef __USE_ATFILE
> -extern ssize_t __readlinkat_chk (int __fd, const char *__restrict __path,
> -				 char *__restrict __buf, size_t __len,
> -				 size_t __buflen)
> -     __THROW __nonnull ((2, 3)) __wur __attr_access ((__write_only__, 3, 4));
> -extern ssize_t __REDIRECT_NTH (__readlinkat_alias,
> -			       (int __fd, const char *__restrict __path,
> -				char *__restrict __buf, size_t __len),
> -			       readlinkat)
> -     __nonnull ((2, 3)) __wur __attr_access ((__write_only__, 3, 4));
> -extern ssize_t __REDIRECT_NTH (__readlinkat_chk_warn,
> -			       (int __fd, const char *__restrict __path,
> -				char *__restrict __buf, size_t __len,
> -				size_t __buflen), __readlinkat_chk)
> -     __nonnull ((2, 3)) __wur __warnattr ("readlinkat called with bigger "
> -					  "length than size of destination "
> -					  "buffer");
> -
>   __fortify_function __nonnull ((2, 3)) __wur ssize_t
>   __NTH (readlinkat (int __fd, const char *__restrict __path,
>   		   char *__restrict __buf, size_t __len))
> @@ -150,16 +82,6 @@ __NTH (readlinkat (int __fd, const char *__restrict __path,
>   }
>   #endif
>   
> -extern char *__getcwd_chk (char *__buf, size_t __size, size_t __buflen)
> -     __THROW __wur;
> -extern char *__REDIRECT_NTH (__getcwd_alias,
> -			     (char *__buf, size_t __size), getcwd) __wur;
> -extern char *__REDIRECT_NTH (__getcwd_chk_warn,
> -			     (char *__buf, size_t __size, size_t __buflen),
> -			     __getcwd_chk)
> -     __wur __warnattr ("getcwd caller with bigger length than size of "
> -		       "destination buffer");
> -
>   __fortify_function __wur char *
>   __NTH (getcwd (char *__buf, size_t __size))
>   {
> @@ -169,12 +91,6 @@ __NTH (getcwd (char *__buf, size_t __size))
>   }
>   
>   #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
> -extern char *__getwd_chk (char *__buf, size_t buflen)
> -     __THROW __nonnull ((1)) __wur __attr_access ((__write_only__, 1, 2));
> -extern char *__REDIRECT_NTH (__getwd_warn, (char *__buf), getwd)
> -     __nonnull ((1)) __wur __warnattr ("please use getcwd instead, as getwd "
> -				       "doesn't specify buffer size");
> -
>   __fortify_function __nonnull ((1)) __attribute_deprecated__ __wur char *
>   __NTH (getwd (char *__buf))
>   {
> @@ -184,18 +100,6 @@ __NTH (getwd (char *__buf))
>   }
>   #endif
>   
> -extern size_t __confstr_chk (int __name, char *__buf, size_t __len,
> -			     size_t __buflen) __THROW
> -  __attr_access ((__write_only__, 2, 3));
> -extern size_t __REDIRECT_NTH (__confstr_alias, (int __name, char *__buf,
> -						size_t __len), confstr)
> -   __attr_access ((__write_only__, 2, 3));
> -extern size_t __REDIRECT_NTH (__confstr_chk_warn,
> -			      (int __name, char *__buf, size_t __len,
> -			       size_t __buflen), __confstr_chk)
> -     __warnattr ("confstr called with bigger length than size of destination "
> -		 "buffer");
> -
>   __fortify_function size_t
>   __NTH (confstr (int __name, char *__buf, size_t __len))
>   {
> @@ -205,16 +109,6 @@ __NTH (confstr (int __name, char *__buf, size_t __len))
>   }
>   
>   
> -extern int __getgroups_chk (int __size, __gid_t __list[], size_t __listlen)
> -  __THROW __wur __attr_access ((__write_only__, 2, 1));
> -extern int __REDIRECT_NTH (__getgroups_alias, (int __size, __gid_t __list[]),
> -			   getgroups) __wur __attr_access ((__write_only__, 2, 1));
> -extern int __REDIRECT_NTH (__getgroups_chk_warn,
> -			   (int __size, __gid_t __list[], size_t __listlen),
> -			   __getgroups_chk)
> -     __wur __warnattr ("getgroups called with bigger group count than what "
> -		       "can fit into destination buffer");
> -
>   __fortify_function int
>   __NTH (getgroups (int __size, __gid_t __list[]))
>   {
> @@ -224,18 +118,6 @@ __NTH (getgroups (int __size, __gid_t __list[]))
>   }
>   
>   
> -extern int __ttyname_r_chk (int __fd, char *__buf, size_t __buflen,
> -			    size_t __nreal) __THROW __nonnull ((2))
> -   __attr_access ((__write_only__, 2, 3));
> -extern int __REDIRECT_NTH (__ttyname_r_alias, (int __fd, char *__buf,
> -					       size_t __buflen), ttyname_r)
> -     __nonnull ((2));
> -extern int __REDIRECT_NTH (__ttyname_r_chk_warn,
> -			   (int __fd, char *__buf, size_t __buflen,
> -			    size_t __nreal), __ttyname_r_chk)
> -     __nonnull ((2)) __warnattr ("ttyname_r called with bigger buflen than "
> -				 "size of destination buffer");
> -
>   __fortify_function int
>   __NTH (ttyname_r (int __fd, char *__buf, size_t __buflen))
>   {
> @@ -246,16 +128,6 @@ __NTH (ttyname_r (int __fd, char *__buf, size_t __buflen))
>   
>   
>   #ifdef __USE_POSIX199506
> -extern int __getlogin_r_chk (char *__buf, size_t __buflen, size_t __nreal)
> -     __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
> -extern int __REDIRECT (__getlogin_r_alias, (char *__buf, size_t __buflen),
> -		       getlogin_r) __nonnull ((1));
> -extern int __REDIRECT (__getlogin_r_chk_warn,
> -		       (char *__buf, size_t __buflen, size_t __nreal),
> -		       __getlogin_r_chk)
> -     __nonnull ((1)) __warnattr ("getlogin_r called with bigger buflen than "
> -				 "size of destination buffer");
> -
>   __fortify_function int
>   getlogin_r (char *__buf, size_t __buflen)
>   {
> @@ -267,17 +139,6 @@ getlogin_r (char *__buf, size_t __buflen)
>   
>   
>   #if defined __USE_MISC || defined __USE_UNIX98
> -extern int __gethostname_chk (char *__buf, size_t __buflen, size_t __nreal)
> -     __THROW __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
> -extern int __REDIRECT_NTH (__gethostname_alias, (char *__buf, size_t __buflen),
> -			   gethostname)
> -  __nonnull ((1)) __attr_access ((__write_only__, 1, 2));
> -extern int __REDIRECT_NTH (__gethostname_chk_warn,
> -			   (char *__buf, size_t __buflen, size_t __nreal),
> -			   __gethostname_chk)
> -     __nonnull ((1)) __warnattr ("gethostname called with bigger buflen than "
> -				 "size of destination buffer");
> -
>   __fortify_function int
>   __NTH (gethostname (char *__buf, size_t __buflen))
>   {
> @@ -289,19 +150,6 @@ __NTH (gethostname (char *__buf, size_t __buflen))
>   
>   
>   #if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_UNIX98)
> -extern int __getdomainname_chk (char *__buf, size_t __buflen, size_t __nreal)
> -     __THROW __nonnull ((1)) __wur __attr_access ((__write_only__, 1, 2));
> -extern int __REDIRECT_NTH (__getdomainname_alias, (char *__buf,
> -						   size_t __buflen),
> -			   getdomainname) __nonnull ((1))
> -  __wur __attr_access ((__write_only__, 1, 2));
> -extern int __REDIRECT_NTH (__getdomainname_chk_warn,
> -			   (char *__buf, size_t __buflen, size_t __nreal),
> -			   __getdomainname_chk)
> -     __nonnull ((1)) __wur __warnattr ("getdomainname called with bigger "
> -				       "buflen than size of destination "
> -				       "buffer");
> -
>   __fortify_function int
>   __NTH (getdomainname (char *__buf, size_t __buflen))
>   {

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 11/21] wcsmbs/bits/wchar2{,-decl}.h: Clearly separate declaration from definitions
  2023-06-20 18:18 ` [PATCH 11/21] wcsmbs/bits/wchar2{,-decl}.h: Clearly separate declaration from definitions Frédéric Bérat
@ 2023-06-22  4:19   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-22  4:19 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:18, Frédéric Bérat wrote:
> This will enable __REDIRECT_FORTIFY* macros to be used when _FORTIFY_SOURCE
> is set.
> 
> Routine declarations that were in bits/wchar2.h are moved into the
> bits/wchar2-decl.h file.
> The file is now included into include/wchar.h irrespectively from
> fortification.
> ---

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

>   include/wchar.h           |   1 +
>   wcsmbs/bits/wchar2-decl.h | 172 ++++++++++++++++++++++++++++++++++
>   wcsmbs/bits/wchar2.h      | 192 --------------------------------------
>   3 files changed, 173 insertions(+), 192 deletions(-)
> 
> diff --git a/include/wchar.h b/include/wchar.h
> index ff4ae52045..7b763bc24f 100644
> --- a/include/wchar.h
> +++ b/include/wchar.h
> @@ -12,6 +12,7 @@
>   # ifndef _ISOMAC
>   
>   #include <bits/floatn.h>
> +#include <bits/wchar2-decl.h>
>   #include <stdbool.h>
>   
>   extern __typeof (wcscasecmp_l) __wcscasecmp_l;
> diff --git a/wcsmbs/bits/wchar2-decl.h b/wcsmbs/bits/wchar2-decl.h
> index 3a23069d3e..f3a2fd3c99 100644
> --- a/wcsmbs/bits/wchar2-decl.h
> +++ b/wcsmbs/bits/wchar2-decl.h
> @@ -27,8 +27,27 @@
>   extern wchar_t *__wmemcpy_chk (wchar_t *__restrict __s1,
>   			       const wchar_t *__restrict __s2, size_t __n,
>   			       size_t __ns1) __THROW;
> +extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias,
> +				(wchar_t *__restrict __s1,
> +				 const wchar_t *__restrict __s2, size_t __n),
> +				wmemcpy);
> +extern wchar_t *__REDIRECT_NTH (__wmemcpy_chk_warn,
> +				(wchar_t *__restrict __s1,
> +				 const wchar_t *__restrict __s2, size_t __n,
> +				 size_t __ns1), __wmemcpy_chk)
> +     __warnattr ("wmemcpy called with length bigger than size of destination "
> +		 "buffer");
> +
>   extern wchar_t *__wmemmove_chk (wchar_t *__s1, const wchar_t *__s2,
>   				size_t __n, size_t __ns1) __THROW;
> +extern wchar_t *__REDIRECT_NTH (__wmemmove_alias, (wchar_t *__s1,
> +						   const wchar_t *__s2,
> +						   size_t __n), wmemmove);
> +extern wchar_t *__REDIRECT_NTH (__wmemmove_chk_warn,
> +				(wchar_t *__s1, const wchar_t *__s2,
> +				 size_t __n, size_t __ns1), __wmemmove_chk)
> +     __warnattr ("wmemmove called with length bigger than size of destination "
> +		 "buffer");
>   
>   
>   #ifdef __USE_GNU
> @@ -36,39 +55,107 @@ extern wchar_t *__wmemmove_chk (wchar_t *__s1, const wchar_t *__s2,
>   extern wchar_t *__wmempcpy_chk (wchar_t *__restrict __s1,
>   				const wchar_t *__restrict __s2, size_t __n,
>   				size_t __ns1) __THROW;
> +extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias,
> +				(wchar_t *__restrict __s1,
> +				 const wchar_t *__restrict __s2,
> +				 size_t __n), wmempcpy);
> +extern wchar_t *__REDIRECT_NTH (__wmempcpy_chk_warn,
> +				(wchar_t *__restrict __s1,
> +				 const wchar_t *__restrict __s2, size_t __n,
> +				 size_t __ns1), __wmempcpy_chk)
> +     __warnattr ("wmempcpy called with length bigger than size of destination "
> +		 "buffer");
>   
>   #endif
>   
>   
>   extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
>   			       size_t __ns) __THROW;
> +extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
> +							  size_t __n), wmemset);
> +extern wchar_t *__REDIRECT_NTH (__wmemset_chk_warn,
> +				(wchar_t *__s, wchar_t __c, size_t __n,
> +				 size_t __ns), __wmemset_chk)
> +     __warnattr ("wmemset called with length bigger than size of destination "
> +		 "buffer");
> +
>   extern wchar_t *__wcscpy_chk (wchar_t *__restrict __dest,
>   			      const wchar_t *__restrict __src,
>   			      size_t __n) __THROW;
> +extern wchar_t *__REDIRECT_NTH (__wcscpy_alias,
> +				(wchar_t *__restrict __dest,
> +				 const wchar_t *__restrict __src), wcscpy);
> +
>   extern wchar_t *__wcpcpy_chk (wchar_t *__restrict __dest,
>   			      const wchar_t *__restrict __src,
>   			      size_t __destlen) __THROW;
> +extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias,
> +				(wchar_t *__restrict __dest,
> +				 const wchar_t *__restrict __src), wcpcpy);
> +
>   extern wchar_t *__wcsncpy_chk (wchar_t *__restrict __dest,
>   			       const wchar_t *__restrict __src, size_t __n,
>   			       size_t __destlen) __THROW;
> +extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias,
> +				(wchar_t *__restrict __dest,
> +				 const wchar_t *__restrict __src,
> +				 size_t __n), wcsncpy);
> +extern wchar_t *__REDIRECT_NTH (__wcsncpy_chk_warn,
> +				(wchar_t *__restrict __dest,
> +				 const wchar_t *__restrict __src,
> +				 size_t __n, size_t __destlen), __wcsncpy_chk)
> +     __warnattr ("wcsncpy called with length bigger than size of destination "
> +		 "buffer");
> +
>   extern wchar_t *__wcpncpy_chk (wchar_t *__restrict __dest,
>   			       const wchar_t *__restrict __src, size_t __n,
>   			       size_t __destlen) __THROW;
> +
> +extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias,
> +				(wchar_t *__restrict __dest,
> +				 const wchar_t *__restrict __src,
> +				 size_t __n), wcpncpy);
> +extern wchar_t *__REDIRECT_NTH (__wcpncpy_chk_warn,
> +				(wchar_t *__restrict __dest,
> +				 const wchar_t *__restrict __src,
> +				 size_t __n, size_t __destlen), __wcpncpy_chk)
> +     __warnattr ("wcpncpy called with length bigger than size of destination "
> +		 "buffer");
> +
>   extern wchar_t *__wcscat_chk (wchar_t *__restrict __dest,
>   			      const wchar_t *__restrict __src,
>   			      size_t __destlen) __THROW;
> +extern wchar_t *__REDIRECT_NTH (__wcscat_alias,
> +				(wchar_t *__restrict __dest,
> +				 const wchar_t *__restrict __src), wcscat);
> +
>   extern wchar_t *__wcsncat_chk (wchar_t *__restrict __dest,
>   			       const wchar_t *__restrict __src,
>   			       size_t __n, size_t __destlen) __THROW;
> +extern wchar_t *__REDIRECT_NTH (__wcsncat_alias,
> +				(wchar_t *__restrict __dest,
> +				 const wchar_t *__restrict __src,
> +				 size_t __n), wcsncat);
> +
>   extern int __swprintf_chk (wchar_t *__restrict __s, size_t __n,
>   			   int __flag, size_t __s_len,
>   			   const wchar_t *__restrict __format, ...)
>        __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */;
> +extern int __REDIRECT_NTH_LDBL (__swprintf_alias,
> +				(wchar_t *__restrict __s, size_t __n,
> +				 const wchar_t *__restrict __fmt, ...),
> +				swprintf);
> +
>   extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
>   			    int __flag, size_t __s_len,
>   			    const wchar_t *__restrict __format,
>   			    __gnuc_va_list __arg)
>        __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
> +extern int __REDIRECT_NTH_LDBL (__vswprintf_alias,
> +				(wchar_t *__restrict __s, size_t __n,
> +				 const wchar_t *__restrict __fmt,
> +				 __gnuc_va_list __ap), vswprintf);
> +
>   
>   #if __USE_FORTIFY_LEVEL > 1
>   
> @@ -86,26 +173,72 @@ extern int __vwprintf_chk (int __flag, const wchar_t *__restrict __format,
>   
>   extern wchar_t *__fgetws_chk (wchar_t *__restrict __s, size_t __size, int __n,
>   			      __FILE *__restrict __stream) __wur;
> +extern wchar_t *__REDIRECT (__fgetws_alias,
> +			    (wchar_t *__restrict __s, int __n,
> +			     __FILE *__restrict __stream), fgetws) __wur;
> +extern wchar_t *__REDIRECT (__fgetws_chk_warn,
> +			    (wchar_t *__restrict __s, size_t __size, int __n,
> +			     __FILE *__restrict __stream), __fgetws_chk)
> +     __wur __warnattr ("fgetws called with bigger size than length "
> +		       "of destination buffer");
>   
>   #ifdef __USE_GNU
>   
>   extern wchar_t *__fgetws_unlocked_chk (wchar_t *__restrict __s, size_t __size,
>   				       int __n, __FILE *__restrict __stream)
>          __wur;
> +extern wchar_t *__REDIRECT (__fgetws_unlocked_alias,
> +			    (wchar_t *__restrict __s, int __n,
> +			     __FILE *__restrict __stream), fgetws_unlocked)
> +  __wur;
> +extern wchar_t *__REDIRECT (__fgetws_unlocked_chk_warn,
> +			    (wchar_t *__restrict __s, size_t __size, int __n,
> +			     __FILE *__restrict __stream),
> +			    __fgetws_unlocked_chk)
> +     __wur __warnattr ("fgetws_unlocked called with bigger size than length "
> +		       "of destination buffer");
>   
>   #endif
>   
>   extern size_t __wcrtomb_chk (char *__restrict __s, wchar_t __wchar,
>   			     mbstate_t *__restrict __p,
>   			     size_t __buflen) __THROW __wur;
> +extern size_t __REDIRECT_NTH (__wcrtomb_alias,
> +				      (char *__restrict __s, wchar_t __wchar,
> +				      mbstate_t *__restrict __ps), wcrtomb) __wur;
> +
>   extern size_t __mbsrtowcs_chk (wchar_t *__restrict __dst,
>   			       const char **__restrict __src,
>   			       size_t __len, mbstate_t *__restrict __ps,
>   			       size_t __dstlen) __THROW;
> +extern size_t __REDIRECT_NTH (__mbsrtowcs_alias,
> +			      (wchar_t *__restrict __dst,
> +			       const char **__restrict __src,
> +			       size_t __len, mbstate_t *__restrict __ps),
> +			      mbsrtowcs);
> +extern size_t __REDIRECT_NTH (__mbsrtowcs_chk_warn,
> +			      (wchar_t *__restrict __dst,
> +			       const char **__restrict __src,
> +			       size_t __len, mbstate_t *__restrict __ps,
> +			       size_t __dstlen), __mbsrtowcs_chk)
> +     __warnattr ("mbsrtowcs called with dst buffer smaller than len "
> +		 "* sizeof (wchar_t)");
> +
>   extern size_t __wcsrtombs_chk (char *__restrict __dst,
>   			       const wchar_t **__restrict __src,
>   			       size_t __len, mbstate_t *__restrict __ps,
>   			       size_t __dstlen) __THROW;
> +extern size_t __REDIRECT_NTH (__wcsrtombs_alias,
> +			      (char *__restrict __dst,
> +			       const wchar_t **__restrict __src,
> +			       size_t __len, mbstate_t *__restrict __ps),
> +			      wcsrtombs);
> +extern size_t __REDIRECT_NTH (__wcsrtombs_chk_warn,
> +			      (char *__restrict __dst,
> +			       const wchar_t **__restrict __src,
> +			       size_t __len, mbstate_t *__restrict __ps,
> +			       size_t __dstlen), __wcsrtombs_chk)
> +    __warnattr ("wcsrtombs called with dst buffer smaller than len");
>   
>   #ifdef	__USE_XOPEN2K8
>   
> @@ -113,12 +246,51 @@ extern size_t __mbsnrtowcs_chk (wchar_t *__restrict __dst,
>   				const char **__restrict __src, size_t __nmc,
>   				size_t __len, mbstate_t *__restrict __ps,
>   				size_t __dstlen) __THROW;
> +extern size_t __REDIRECT_NTH (__mbsnrtowcs_alias,
> +			      (wchar_t *__restrict __dst,
> +			       const char **__restrict __src, size_t __nmc,
> +			       size_t __len, mbstate_t *__restrict __ps),
> +			      mbsnrtowcs);
> +extern size_t __REDIRECT_NTH (__mbsnrtowcs_chk_warn,
> +			      (wchar_t *__restrict __dst,
> +			       const char **__restrict __src, size_t __nmc,
> +			       size_t __len, mbstate_t *__restrict __ps,
> +			       size_t __dstlen), __mbsnrtowcs_chk)
> +     __warnattr ("mbsnrtowcs called with dst buffer smaller than len "
> +		 "* sizeof (wchar_t)");
> +
>   extern size_t __wcsnrtombs_chk (char *__restrict __dst,
>   				const wchar_t **__restrict __src,
>   				size_t __nwc, size_t __len,
>   				mbstate_t *__restrict __ps, size_t __dstlen)
>          __THROW;
> +extern size_t __REDIRECT_NTH (__wcsnrtombs_alias,
> +			      (char *__restrict __dst,
> +			       const wchar_t **__restrict __src,
> +			       size_t __nwc, size_t __len,
> +			       mbstate_t *__restrict __ps), wcsnrtombs);
> +extern size_t __REDIRECT_NTH (__wcsnrtombs_chk_warn,
> +			      (char *__restrict __dst,
> +			       const wchar_t **__restrict __src,
> +			       size_t __nwc, size_t __len,
> +			       mbstate_t *__restrict __ps,
> +			       size_t __dstlen), __wcsnrtombs_chk)
> +     __warnattr ("wcsnrtombs called with dst buffer smaller than len");
>   
>   #endif
>   
> +#ifdef __USE_MISC
> +extern size_t __wcslcpy_chk (wchar_t *__dest, const wchar_t *__src, size_t __n,
> +			     size_t __destlen) __THROW;
> +extern size_t __REDIRECT_NTH (__wcslcpy_alias,
> +			      (wchar_t *__dest, const wchar_t *__src,
> +			       size_t __n), wcslcpy);
> +
> +extern size_t __wcslcat_chk (wchar_t *__dest, const wchar_t *__src, size_t __n,
> +			     size_t __destlen) __THROW;
> +extern size_t __REDIRECT_NTH (__wcslcat_alias,
> +			      (wchar_t *__dest, const wchar_t *__src,
> +			       size_t __n), wcslcat);
> +#endif /* __USE_MISC */
> +
>   #endif /* bits/wchar2-decl.h.  */
> diff --git a/wcsmbs/bits/wchar2.h b/wcsmbs/bits/wchar2.h
> index 9def8e9852..6e6234d606 100644
> --- a/wcsmbs/bits/wchar2.h
> +++ b/wcsmbs/bits/wchar2.h
> @@ -20,18 +20,6 @@
>   # error "Never include <bits/wchar2.h> directly; use <wchar.h> instead."
>   #endif
>   
> -
> -extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias,
> -				(wchar_t *__restrict __s1,
> -				 const wchar_t *__restrict __s2, size_t __n),
> -				wmemcpy);
> -extern wchar_t *__REDIRECT_NTH (__wmemcpy_chk_warn,
> -				(wchar_t *__restrict __s1,
> -				 const wchar_t *__restrict __s2, size_t __n,
> -				 size_t __ns1), __wmemcpy_chk)
> -     __warnattr ("wmemcpy called with length bigger than size of destination "
> -		 "buffer");
> -
>   __fortify_function wchar_t *
>   __NTH (wmemcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
>   		size_t __n))
> @@ -41,16 +29,6 @@ __NTH (wmemcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
>   			    __s1, __s2, __n);
>   }
>   
> -
> -extern wchar_t *__REDIRECT_NTH (__wmemmove_alias, (wchar_t *__s1,
> -						   const wchar_t *__s2,
> -						   size_t __n), wmemmove);
> -extern wchar_t *__REDIRECT_NTH (__wmemmove_chk_warn,
> -				(wchar_t *__s1, const wchar_t *__s2,
> -				 size_t __n, size_t __ns1), __wmemmove_chk)
> -     __warnattr ("wmemmove called with length bigger than size of destination "
> -		 "buffer");
> -
>   __fortify_function wchar_t *
>   __NTH (wmemmove (wchar_t *__s1, const wchar_t *__s2, size_t __n))
>   {
> @@ -59,19 +37,7 @@ __NTH (wmemmove (wchar_t *__s1, const wchar_t *__s2, size_t __n))
>   			    __s1, __s2, __n);
>   }
>   
> -
>   #ifdef __USE_GNU
> -extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias,
> -				(wchar_t *__restrict __s1,
> -				 const wchar_t *__restrict __s2,
> -				 size_t __n), wmempcpy);
> -extern wchar_t *__REDIRECT_NTH (__wmempcpy_chk_warn,
> -				(wchar_t *__restrict __s1,
> -				 const wchar_t *__restrict __s2, size_t __n,
> -				 size_t __ns1), __wmempcpy_chk)
> -     __warnattr ("wmempcpy called with length bigger than size of destination "
> -		 "buffer");
> -
>   __fortify_function wchar_t *
>   __NTH (wmempcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
>   		 size_t __n))
> @@ -82,15 +48,6 @@ __NTH (wmempcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
>   }
>   #endif
>   
> -
> -extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
> -						  size_t __n), wmemset);
> -extern wchar_t *__REDIRECT_NTH (__wmemset_chk_warn,
> -				(wchar_t *__s, wchar_t __c, size_t __n,
> -				 size_t __ns), __wmemset_chk)
> -     __warnattr ("wmemset called with length bigger than size of destination "
> -		 "buffer");
> -
>   __fortify_function wchar_t *
>   __NTH (wmemset (wchar_t *__s, wchar_t __c, size_t __n))
>   {
> @@ -99,11 +56,6 @@ __NTH (wmemset (wchar_t *__s, wchar_t __c, size_t __n))
>   			    __s, __c, __n);
>   }
>   
> -
> -extern wchar_t *__REDIRECT_NTH (__wcscpy_alias,
> -				(wchar_t *__restrict __dest,
> -				 const wchar_t *__restrict __src), wcscpy);
> -
>   __fortify_function wchar_t *
>   __NTH (wcscpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
>   {
> @@ -113,11 +65,6 @@ __NTH (wcscpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
>     return __wcscpy_alias (__dest, __src);
>   }
>   
> -
> -extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias,
> -				(wchar_t *__restrict __dest,
> -				 const wchar_t *__restrict __src), wcpcpy);
> -
>   __fortify_function wchar_t *
>   __NTH (wcpcpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
>   {
> @@ -127,18 +74,6 @@ __NTH (wcpcpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
>     return __wcpcpy_alias (__dest, __src);
>   }
>   
> -
> -extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias,
> -				(wchar_t *__restrict __dest,
> -				 const wchar_t *__restrict __src,
> -				 size_t __n), wcsncpy);
> -extern wchar_t *__REDIRECT_NTH (__wcsncpy_chk_warn,
> -				(wchar_t *__restrict __dest,
> -				 const wchar_t *__restrict __src,
> -				 size_t __n, size_t __destlen), __wcsncpy_chk)
> -     __warnattr ("wcsncpy called with length bigger than size of destination "
> -		 "buffer");
> -
>   __fortify_function wchar_t *
>   __NTH (wcsncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>   		size_t __n))
> @@ -148,18 +83,6 @@ __NTH (wcsncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>   			    __dest, __src, __n);
>   }
>   
> -
> -extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias,
> -				(wchar_t *__restrict __dest,
> -				 const wchar_t *__restrict __src,
> -				 size_t __n), wcpncpy);
> -extern wchar_t *__REDIRECT_NTH (__wcpncpy_chk_warn,
> -				(wchar_t *__restrict __dest,
> -				 const wchar_t *__restrict __src,
> -				 size_t __n, size_t __destlen), __wcpncpy_chk)
> -     __warnattr ("wcpncpy called with length bigger than size of destination "
> -		 "buffer");
> -
>   __fortify_function wchar_t *
>   __NTH (wcpncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>   		size_t __n))
> @@ -169,11 +92,6 @@ __NTH (wcpncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>   			    __dest, __src, __n);
>   }
>   
> -
> -extern wchar_t *__REDIRECT_NTH (__wcscat_alias,
> -				(wchar_t *__restrict __dest,
> -				 const wchar_t *__restrict __src), wcscat);
> -
>   __fortify_function wchar_t *
>   __NTH (wcscat (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
>   {
> @@ -183,12 +101,6 @@ __NTH (wcscat (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
>     return __wcscat_alias (__dest, __src);
>   }
>   
> -
> -extern wchar_t *__REDIRECT_NTH (__wcsncat_alias,
> -				(wchar_t *__restrict __dest,
> -				 const wchar_t *__restrict __src,
> -				 size_t __n), wcsncat);
> -
>   __fortify_function wchar_t *
>   __NTH (wcsncat (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>   		size_t __n))
> @@ -200,12 +112,6 @@ __NTH (wcsncat (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>   }
>   
>   #ifdef __USE_MISC
> -extern size_t __wcslcpy_chk (wchar_t *__dest, const wchar_t *__src, size_t __n,
> -			     size_t __destlen) __THROW;
> -extern size_t __REDIRECT_NTH (__wcslcpy_alias,
> -			      (wchar_t *__dest, const wchar_t *__src,
> -			       size_t __n), wcslcpy);
> -
>   __fortify_function size_t
>   __NTH (wcslcpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>   		size_t __n))
> @@ -219,12 +125,6 @@ __NTH (wcslcpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>     return __wcslcpy_alias (__dest, __src, __n);
>   }
>   
> -extern size_t __wcslcat_chk (wchar_t *__dest, const wchar_t *__src, size_t __n,
> -			     size_t __destlen) __THROW;
> -extern size_t __REDIRECT_NTH (__wcslcat_alias,
> -			      (wchar_t *__dest, const wchar_t *__src,
> -			       size_t __n), wcslcat);
> -
>   __fortify_function size_t
>   __NTH (wcslcat (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>   		size_t __n))
> @@ -239,12 +139,6 @@ __NTH (wcslcat (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
>   }
>   #endif /* __USE_MISC */
>   
> -
> -extern int __REDIRECT_NTH_LDBL (__swprintf_alias,
> -				(wchar_t *__restrict __s, size_t __n,
> -				 const wchar_t *__restrict __fmt, ...),
> -				swprintf);
> -
>   #ifdef __va_arg_pack
>   __fortify_function int
>   __NTH (swprintf (wchar_t *__restrict __s, size_t __n,
> @@ -265,12 +159,6 @@ __NTH (swprintf (wchar_t *__restrict __s, size_t __n,
>      : swprintf (s, n, __VA_ARGS__))
>   #endif
>   
> -
> -extern int __REDIRECT_NTH_LDBL (__vswprintf_alias,
> -				(wchar_t *__restrict __s, size_t __n,
> -				 const wchar_t *__restrict __fmt,
> -				 __gnuc_va_list __ap), vswprintf);
> -
>   __fortify_function int
>   __NTH (vswprintf (wchar_t *__restrict __s, size_t __n,
>   		  const wchar_t *__restrict __fmt, __gnuc_va_list __ap))
> @@ -319,16 +207,6 @@ vfwprintf (__FILE *__restrict __stream,
>   }
>   
>   #endif
> -
> -extern wchar_t *__REDIRECT (__fgetws_alias,
> -			    (wchar_t *__restrict __s, int __n,
> -			     __FILE *__restrict __stream), fgetws) __wur;
> -extern wchar_t *__REDIRECT (__fgetws_chk_warn,
> -			    (wchar_t *__restrict __s, size_t __size, int __n,
> -			     __FILE *__restrict __stream), __fgetws_chk)
> -     __wur __warnattr ("fgetws called with bigger size than length "
> -		       "of destination buffer");
> -
>   __fortify_function __wur wchar_t *
>   fgetws (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
>   {
> @@ -341,17 +219,6 @@ fgetws (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
>   }
>   
>   #ifdef __USE_GNU
> -extern wchar_t *__REDIRECT (__fgetws_unlocked_alias,
> -			    (wchar_t *__restrict __s, int __n,
> -			     __FILE *__restrict __stream), fgetws_unlocked)
> -  __wur;
> -extern wchar_t *__REDIRECT (__fgetws_unlocked_chk_warn,
> -			    (wchar_t *__restrict __s, size_t __size, int __n,
> -			     __FILE *__restrict __stream),
> -			    __fgetws_unlocked_chk)
> -     __wur __warnattr ("fgetws_unlocked called with bigger size than length "
> -		       "of destination buffer");
> -
>   __fortify_function __wur wchar_t *
>   fgetws_unlocked (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
>   {
> @@ -365,11 +232,6 @@ fgetws_unlocked (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
>   }
>   #endif
>   
> -
> -extern size_t __REDIRECT_NTH (__wcrtomb_alias,
> -			      (char *__restrict __s, wchar_t __wchar,
> -			       mbstate_t *__restrict __ps), wcrtomb) __wur;
> -
>   __fortify_function __wur size_t
>   __NTH (wcrtomb (char *__restrict __s, wchar_t __wchar,
>   		mbstate_t *__restrict __ps))
> @@ -387,20 +249,6 @@ __NTH (wcrtomb (char *__restrict __s, wchar_t __wchar,
>     return __wcrtomb_alias (__s, __wchar, __ps);
>   }
>   
> -
> -extern size_t __REDIRECT_NTH (__mbsrtowcs_alias,
> -			      (wchar_t *__restrict __dst,
> -			       const char **__restrict __src,
> -			       size_t __len, mbstate_t *__restrict __ps),
> -			      mbsrtowcs);
> -extern size_t __REDIRECT_NTH (__mbsrtowcs_chk_warn,
> -			      (wchar_t *__restrict __dst,
> -			       const char **__restrict __src,
> -			       size_t __len, mbstate_t *__restrict __ps,
> -			       size_t __dstlen), __mbsrtowcs_chk)
> -     __warnattr ("mbsrtowcs called with dst buffer smaller than len "
> -		 "* sizeof (wchar_t)");
> -
>   __fortify_function size_t
>   __NTH (mbsrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
>   		  size_t __len, mbstate_t *__restrict __ps))
> @@ -410,19 +258,6 @@ __NTH (mbsrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
>   			    __dst, __src, __len, __ps);
>   }
>   
> -
> -extern size_t __REDIRECT_NTH (__wcsrtombs_alias,
> -			      (char *__restrict __dst,
> -			       const wchar_t **__restrict __src,
> -			       size_t __len, mbstate_t *__restrict __ps),
> -			      wcsrtombs);
> -extern size_t __REDIRECT_NTH (__wcsrtombs_chk_warn,
> -			      (char *__restrict __dst,
> -			       const wchar_t **__restrict __src,
> -			       size_t __len, mbstate_t *__restrict __ps,
> -			       size_t __dstlen), __wcsrtombs_chk)
> -    __warnattr ("wcsrtombs called with dst buffer smaller than len");
> -
>   __fortify_function size_t
>   __NTH (wcsrtombs (char *__restrict __dst, const wchar_t **__restrict __src,
>   		  size_t __len, mbstate_t *__restrict __ps))
> @@ -434,19 +269,6 @@ __NTH (wcsrtombs (char *__restrict __dst, const wchar_t **__restrict __src,
>   
>   
>   #ifdef	__USE_XOPEN2K8
> -extern size_t __REDIRECT_NTH (__mbsnrtowcs_alias,
> -			      (wchar_t *__restrict __dst,
> -			       const char **__restrict __src, size_t __nmc,
> -			       size_t __len, mbstate_t *__restrict __ps),
> -			      mbsnrtowcs);
> -extern size_t __REDIRECT_NTH (__mbsnrtowcs_chk_warn,
> -			      (wchar_t *__restrict __dst,
> -			       const char **__restrict __src, size_t __nmc,
> -			       size_t __len, mbstate_t *__restrict __ps,
> -			       size_t __dstlen), __mbsnrtowcs_chk)
> -     __warnattr ("mbsnrtowcs called with dst buffer smaller than len "
> -		 "* sizeof (wchar_t)");
> -
>   __fortify_function size_t
>   __NTH (mbsnrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
>   		   size_t __nmc, size_t __len, mbstate_t *__restrict __ps))
> @@ -456,20 +278,6 @@ __NTH (mbsnrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
>   			    __dst, __src, __nmc, __len, __ps);
>   }
>   
> -
> -extern size_t __REDIRECT_NTH (__wcsnrtombs_alias,
> -			      (char *__restrict __dst,
> -			       const wchar_t **__restrict __src,
> -			       size_t __nwc, size_t __len,
> -			       mbstate_t *__restrict __ps), wcsnrtombs);
> -extern size_t __REDIRECT_NTH (__wcsnrtombs_chk_warn,
> -			      (char *__restrict __dst,
> -			       const wchar_t **__restrict __src,
> -			       size_t __nwc, size_t __len,
> -			       mbstate_t *__restrict __ps,
> -			       size_t __dstlen), __wcsnrtombs_chk)
> -     __warnattr ("wcsnrtombs called with dst buffer smaller than len");
> -
>   __fortify_function size_t
>   __NTH (wcsnrtombs (char *__restrict __dst, const wchar_t **__restrict __src,
>   		   size_t __nwc, size_t __len, mbstate_t *__restrict __ps))

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 17/21] misc/bits/syslog.h: Clearly separate declaration from definition
  2023-06-20 18:19 ` [PATCH 17/21] misc/bits/syslog.h: Clearly separate declaration from definition Frédéric Bérat
@ 2023-06-22  4:24   ` Siddhesh Poyarekar
  0 siblings, 0 replies; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-22  4:24 UTC (permalink / raw)
  To: Frédéric Bérat, libc-alpha



On 2023-06-20 14:19, Frédéric Bérat wrote:
> This allows to include bits/syslog-decl.h in include/sys/syslog.h and
> therefore be able to create the libc_hidden_builtin_proto (__syslog_chk)
> prototype.
> ---
>   include/bits/syslog-decl.h                    |  1 +
>   include/sys/syslog.h                          |  4 +++
>   misc/Makefile                                 |  1 +
>   misc/bits/syslog-decl.h                       | 35 +++++++++++++++++++
>   misc/bits/syslog.h                            | 10 +-----
>   misc/syslog.c                                 |  4 ++-
>   .../ldbl-128ibm-compat/ieee128-syslog.c       |  1 +
>   7 files changed, 46 insertions(+), 10 deletions(-)
>   create mode 100644 include/bits/syslog-decl.h
>   create mode 100644 misc/bits/syslog-decl.h
> 
> diff --git a/include/bits/syslog-decl.h b/include/bits/syslog-decl.h
> new file mode 100644
> index 0000000000..491a263777
> --- /dev/null
> +++ b/include/bits/syslog-decl.h
> @@ -0,0 +1 @@
> +#include <misc/bits/syslog-decl.h>
> diff --git a/include/sys/syslog.h b/include/sys/syslog.h
> index 44422eab13..1566228860 100644
> --- a/include/sys/syslog.h
> +++ b/include/sys/syslog.h
> @@ -3,6 +3,8 @@
>   #include <misc/sys/syslog.h>
>   #ifndef _ISOMAC
>   
> +#include <bits/syslog-decl.h>
> +
>   libc_hidden_ldbl_proto (syslog)
>   
>   /* __vsyslog_internal uses the same mode_flags bits as
> @@ -12,5 +14,7 @@ extern void __vsyslog_internal (int pri, const char *fmt, __gnuc_va_list ap,
>        attribute_hidden
>        __attribute__ ((__format__ (__printf__, 2, 0)));
>   
> +libc_hidden_ldbl_proto (__syslog_chk)
> +
>   #endif /* _ISOMAC */
>   #endif /* syslog.h */
> diff --git a/misc/Makefile b/misc/Makefile
> index 3497d30f3b..fe0d49c1de 100644
> --- a/misc/Makefile
> +++ b/misc/Makefile
> @@ -64,6 +64,7 @@ headers	:= \
>     sys/xattr.h \
>     syslog.h \
>     sys/syslog.h \
> +  bits/syslog-decl.h \
>     bits/syslog.h \
>     bits/syslog-ldbl.h \
>     bits/syslog-path.h \
> diff --git a/misc/bits/syslog-decl.h b/misc/bits/syslog-decl.h
> new file mode 100644
> index 0000000000..6d60cd4e31
> --- /dev/null
> +++ b/misc/bits/syslog-decl.h
> @@ -0,0 +1,35 @@
> +/* Checking routines for syslog functions. Declaration only.
> +   Copyright (C) 2023 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/>.  */
> +
> +#ifndef _BITS_SYSLOG_DECL_H
> +#define _BITS_SYSLOG_DECL_H 1
> +
> +#ifndef _SYS_SYSLOG_H
> +# error "Never include <bits/syslog.h> directly; use <sys/syslog.h> instead."

Never include syslog-decl.h...

> +#endif
> +
> +extern void __syslog_chk (int __pri, int __flag, const char *__fmt, ...)
> +     __attribute__ ((__format__ (__printf__, 3, 4)));
> +
> +#ifdef __USE_MISC
> +extern void __vsyslog_chk (int __pri, int __flag, const char *__fmt,
> +			   __gnuc_va_list __ap)
> +     __attribute__ ((__format__ (__printf__, 3, 0)));
> +#endif
> +
> +#endif
> diff --git a/misc/bits/syslog.h b/misc/bits/syslog.h
> index 305cac4ba0..d7de90ed14 100644
> --- a/misc/bits/syslog.h
> +++ b/misc/bits/syslog.h
> @@ -20,15 +20,7 @@
>   # error "Never include <bits/syslog.h> directly; use <sys/syslog.h> instead."
>   #endif
>   
> -
> -extern void __syslog_chk (int __pri, int __flag, const char *__fmt, ...)
> -     __attribute__ ((__format__ (__printf__, 3, 4)));
> -
> -#ifdef __USE_MISC
> -extern void __vsyslog_chk (int __pri, int __flag, const char *__fmt,
> -			   __gnuc_va_list __ap)
> -     __attribute__ ((__format__ (__printf__, 3, 0)));
> -#endif
> +#include <bits/syslog-decl.h>
>   
>   #include <bits/floatn.h>
>   #if defined __LDBL_COMPAT || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
> diff --git a/misc/syslog.c b/misc/syslog.c
> index f67d4b58a4..1b8cb722c5 100644
> --- a/misc/syslog.c
> +++ b/misc/syslog.c
> @@ -101,7 +101,7 @@ __vsyslog (int pri, const char *fmt, va_list ap)
>   ldbl_weak_alias (__vsyslog, vsyslog)
>   
>   void
> -__syslog_chk (int pri, int flag, const char *fmt, ...)
> +___syslog_chk (int pri, int flag, const char *fmt, ...)
>   {
>     va_list ap;
>   
> @@ -109,6 +109,8 @@ __syslog_chk (int pri, int flag, const char *fmt, ...)
>     __vsyslog_internal (pri, fmt, ap, (flag > 0) ? PRINTF_FORTIFY : 0);
>     va_end (ap);
>   }
> +ldbl_hidden_def (___syslog_chk, __syslog_chk)
> +ldbl_strong_alias (___syslog_chk, __syslog_chk)
>   
>   void
>   __vsyslog_chk (int pri, int flag, const char *fmt, va_list ap)
> diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
> index 18aa7f707f..97810a7bbd 100644
> --- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
> +++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
> @@ -52,6 +52,7 @@ ___ieee128___syslog_chk (int pri, int flag, const char *fmt, ...)
>     __vsyslog_internal (pri, fmt, ap, mode);
>     va_end (ap);
>   }
> +hidden_def (___ieee128___syslog_chk)
>   strong_alias (___ieee128___syslog_chk, __syslog_chkieee128)
>   
>   void

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-21 15:25     ` Siddhesh Poyarekar
@ 2023-06-22 11:48       ` Frederic Berat
  2023-06-22 11:54         ` Siddhesh Poyarekar
  2023-06-23  5:46       ` Sam James
  1 sibling, 1 reply; 50+ messages in thread
From: Frederic Berat @ 2023-06-22 11:48 UTC (permalink / raw)
  To: Siddhesh Poyarekar
  Cc: Maxim Kuvyrkov via Libc-alpha, Carlos O'Donell, Sam James

On Wed, Jun 21, 2023 at 5:26 PM Siddhesh Poyarekar <siddhesh@gotplt.org> wrote:
>
> On 2023-06-21 09:18, Frederic Berat wrote:
> > On Tue, Jun 20, 2023 at 8:19 PM Frédéric Bérat <fberat@redhat.com> wrote:
> >>
> >> It is now possible to enable fortification.
> >> The level may be given as parameter, if none is provided, the configure
> >> script will determine what is the highest level possible that can be set
> >> considering GCC built-ins availability and set it.
> >> If level is explicitly set to 3, configure checks if the compiler
> >> supports the built-in function necessary for it or raise an error if it
> >> isn't.
> >>
> >> The result of the configure checks is 2 variables, $fortify_source and
> >> $no_fortify_source that are used to appropriately populate CFLAGS.
> >>
> >> Since the feature needs some of the routines provided by Glibc, these
> >> are excluded from the fortification.
> >> ---
> >>   Makeconfig     | 33 ++++++++++++++++++++++++---
> >>   config.make.in |  3 ++-
> >>   configure.ac   | 60 +++++++++++++++++++++++++++++++++++---------------
> >>   elf/rtld-Rules |  2 +-
> >>   4 files changed, 75 insertions(+), 23 deletions(-)
> >>
> >> diff --git a/Makeconfig b/Makeconfig
> >> index 2514db35f6..59fbd9ebf9 100644
> >> --- a/Makeconfig
> >> +++ b/Makeconfig
> >> @@ -543,12 +543,13 @@ endif  # +link
> >>   # ARM, gcc always produces different debugging symbols when invoked with
> >>   # a -O greater than 0 than when invoked with -O0, regardless of anything else
> >>   # we're using to suppress optimizations.  Therefore, we need to explicitly pass
> >> -# -O0 to it through CFLAGS.
> >> +# -O0 to it through CFLAGS. By side effect, any fortification needs to be
> >> +# disabled as it needs -O greater than 0.
> >>   # Additionally, the build system will try to -include $(common-objpfx)/config.h
> >>   # when compiling the tests, which will throw an error if some special macros
> >>   # (such as __OPTIMIZE__ and IS_IN_build) aren't defined.  To avoid this, we
> >>   # tell gcc to define IS_IN_build.
> >> -CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build
> >> +CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build $(no-fortify-source)
> >>
> >>   ifeq (yes,$(build-shared))
> >>   # These indicate whether to link using the built ld.so or the installed one.
> >> @@ -901,6 +902,16 @@ define elide-stack-protector
> >>   $(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-stack-protector))
> >>   endef
> >>
> >> +# We might want to compile with fortify-source
> >> +ifneq ($(fortify-source),)
> >> ++fortify-source=$(fortify-source)
> >> +endif
> >> +
> >> +# Some routine can't be fortified like the ones used by fortify
> >> +define elide-fortify-source
> >> +$(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-fortify-source))
> >> +endef
> >> +
> >>   # The program that makes Emacs-style TAGS files.
> >>   ETAGS  := etags
> >>
> >> @@ -961,6 +972,16 @@ endif      # $(+cflags) == ""
> >>             $(+stack-protector) -fno-common
> >>   +gcc-nowarn := -w
> >>
> >> +# We must filter out elf because the early bootstrap of the dynamic loader
> >> +# cannot be fortified. Likewise we exclude dlfcn because it is entangled
> >> +# with the loader. We must filter out csu because early startup, like the
> >> +# loader, cannot be fortified. Lastly debug is the fortification routines
> >> +# themselves and they cannot be fortified.
> >> +do-fortify = $(filter-out elf dlfcn csu debug,$(subdir))
> >> +ifeq ($(do-fortify),$(subdir))
> >> ++cflags += $(+fortify-source)
> >> +endif
> >
> > This needs to be adapted to deal with compilers that define
> > "_FORTIFY_SOURCE" by default (checked on ubuntu 22.04):
> >
> > +do-fortify = $(filter-out elf dlfcn csu debug,$(subdir))
> > +ifeq ($(do-fortify),$(subdir))
> > ++cflags += $(+fortify-source)
> > +else
> > ++cflags += $(no-fortify-source)
> > +endif
> >
> > That way, we ensure that even if _FORTIFY_SOURCE is enabled at system
> > level, we don't build these subdirectories with it.
>
> That's likely true for Gentoo as well.  Additionally, those
> distributions will default to fortification being enabled by default,
> without --enable-fortify-source.  This is probably wrong in terms of
> compatibility and user expectations, i.e. without the configure flag,
> the code generated should be like in 2.37, i.e. glibc should strictly
> not be built with fortification enabled.
>
> Sam, do you have an opinion on this?  Would it be too surprising for
> Gentoo packaging/users if glibc 2.38 built with fortification on by
> default?  FWIW, we'll likely flip to enabling fortification by default
> in 2.39 and make the flag --disable-fortify-source, but that's a
> different bridge to cross.
>

Since I'd like to get some more feedback, I'll keep the behavior as-is
in v2, i.e.:

- If no option is passed to configure, the build environment decides
if _FORTIFY_SOURCE should be set (through exported CFLAGS or
compiler). In other words the "disable" is not enforced with this
patch.
- If "--enable-fortify-source" is set, it overrides any system preset.

I'd be happy to get more feedback on whether I should enforce
disablement or not, especially from people who deal with distribution
that set it by default.

> Thanks,
> Sid
>


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-22 11:48       ` Frederic Berat
@ 2023-06-22 11:54         ` Siddhesh Poyarekar
  2023-06-22 12:29           ` Adhemerval Zanella Netto
  0 siblings, 1 reply; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-22 11:54 UTC (permalink / raw)
  To: Frederic Berat
  Cc: Maxim Kuvyrkov via Libc-alpha, Carlos O'Donell, Sam James

On 2023-06-22 07:48, Frederic Berat wrote:
>> That's likely true for Gentoo as well.  Additionally, those
>> distributions will default to fortification being enabled by default,
>> without --enable-fortify-source.  This is probably wrong in terms of
>> compatibility and user expectations, i.e. without the configure flag,
>> the code generated should be like in 2.37, i.e. glibc should strictly
>> not be built with fortification enabled.
>>
>> Sam, do you have an opinion on this?  Would it be too surprising for
>> Gentoo packaging/users if glibc 2.38 built with fortification on by
>> default?  FWIW, we'll likely flip to enabling fortification by default
>> in 2.39 and make the flag --disable-fortify-source, but that's a
>> different bridge to cross.
>>
> 
> Since I'd like to get some more feedback, I'll keep the behavior as-is
> in v2, i.e.:
> 
> - If no option is passed to configure, the build environment decides
> if _FORTIFY_SOURCE should be set (through exported CFLAGS or
> compiler). In other words the "disable" is not enforced with this
> patch.
> - If "--enable-fortify-source" is set, it overrides any system preset.
> 
> I'd be happy to get more feedback on whether I should enforce
> disablement or not, especially from people who deal with distribution
> that set it by default.

My worry is that with this on Ubuntu/Gentoo, there's no way through 
configure to disable fortification, which, importantly, is current 
behaviour.  The only way to do it would then be to pass CFLAGS to 
override the toolchain.  It's not the worst problem to have TBH, but I'd 
like Ubuntu or Gentoo maintainers to explicitly opt into it instead of 
us forcing it on them.

Thanks,
Sid

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-22 11:54         ` Siddhesh Poyarekar
@ 2023-06-22 12:29           ` Adhemerval Zanella Netto
  2023-06-22 12:50             ` Siddhesh Poyarekar
  0 siblings, 1 reply; 50+ messages in thread
From: Adhemerval Zanella Netto @ 2023-06-22 12:29 UTC (permalink / raw)
  To: Siddhesh Poyarekar, Frederic Berat
  Cc: Maxim Kuvyrkov via Libc-alpha, Carlos O'Donell, Sam James



On 22/06/23 08:54, Siddhesh Poyarekar wrote:
> On 2023-06-22 07:48, Frederic Berat wrote:
>>> That's likely true for Gentoo as well.  Additionally, those
>>> distributions will default to fortification being enabled by default,
>>> without --enable-fortify-source.  This is probably wrong in terms of
>>> compatibility and user expectations, i.e. without the configure flag,
>>> the code generated should be like in 2.37, i.e. glibc should strictly
>>> not be built with fortification enabled.
>>>
>>> Sam, do you have an opinion on this?  Would it be too surprising for
>>> Gentoo packaging/users if glibc 2.38 built with fortification on by
>>> default?  FWIW, we'll likely flip to enabling fortification by default
>>> in 2.39 and make the flag --disable-fortify-source, but that's a
>>> different bridge to cross.
>>>
>>
>> Since I'd like to get some more feedback, I'll keep the behavior as-is
>> in v2, i.e.:
>>
>> - If no option is passed to configure, the build environment decides
>> if _FORTIFY_SOURCE should be set (through exported CFLAGS or
>> compiler). In other words the "disable" is not enforced with this
>> patch.
>> - If "--enable-fortify-source" is set, it overrides any system preset.
>>
>> I'd be happy to get more feedback on whether I should enforce
>> disablement or not, especially from people who deal with distribution
>> that set it by default.
> 
> My worry is that with this on Ubuntu/Gentoo, there's no way through configure to disable fortification, which, importantly, is current behaviour.  The only way to do it would then be to pass CFLAGS to override the toolchain.  It's not the worst problem to have TBH, but I'd like Ubuntu or Gentoo maintainers to explicitly opt into it instead of us forcing it on them.

Do we really need another configure option? Any extra option requires extra
maintainability effort to avoid it to bit-rotten (like --disable-shared [1]),
this option would most likely to be always used (specially because distros
are enabling fortify as default), and the fortify coverage are a superset 
of the default prototypes (meaning that programs that built and run with 
fortify enable should also run without it).

Also, this seems to better handled as either through the toolchain default
configuration or by CC/CFLAGS.

[1] https://sourceware.org/bugzilla/show_bug.cgi?id=20845


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-22 12:29           ` Adhemerval Zanella Netto
@ 2023-06-22 12:50             ` Siddhesh Poyarekar
  2023-06-22 19:39               ` Adhemerval Zanella Netto
  0 siblings, 1 reply; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-22 12:50 UTC (permalink / raw)
  To: Adhemerval Zanella Netto, Frederic Berat
  Cc: Maxim Kuvyrkov via Libc-alpha, Carlos O'Donell, Sam James

On 2023-06-22 08:29, Adhemerval Zanella Netto wrote:
>>> I'd be happy to get more feedback on whether I should enforce
>>> disablement or not, especially from people who deal with distribution
>>> that set it by default.
>>
>> My worry is that with this on Ubuntu/Gentoo, there's no way through configure to disable fortification, which, importantly, is current behaviour.  The only way to do it would then be to pass CFLAGS to override the toolchain.  It's not the worst problem to have TBH, but I'd like Ubuntu or Gentoo maintainers to explicitly opt into it instead of us forcing it on them.
> 
> Do we really need another configure option? Any extra option requires extra
> maintainability effort to avoid it to bit-rotten (like --disable-shared [1]),
> this option would most likely to be always used (specially because distros
> are enabling fortify as default), and the fortify coverage are a superset
> of the default prototypes (meaning that programs that built and run with
> fortify enable should also run without it).

The option is needed for the small device users, where they often don't 
want to build with stack protector, fortification, or really anything 
that would accidentally make their devices more secure (sorry ;)).

The broader plan we had in mind was to disable by default in glibc-2.38 
and then enable by default in glibc-2.39.  That would also mean adding a 
b-m-g target with --disable-fortify to ensure that it doesn't bitrot.

Alternatively if we're feeling adventurous, we could just enable by 
default in 2.38 and be done with it.  Like you said, most distributions 
will enable it at first opportunity anyway and doing it by default is 
easier than modifying the build config to add a flag.  Let them add a 
flag if it's actually breaking things.  What do you think?

Thanks,
Sid

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 02/21] Configure: regenerate for autoconf 2.71
  2023-06-20 18:18 ` [PATCH 02/21] Configure: regenerate for autoconf 2.71 Frédéric Bérat
  2023-06-20 20:47   ` Joseph Myers
@ 2023-06-22 19:07   ` Florian Weimer
  2023-06-23 11:28     ` Carlos O'Donell
  1 sibling, 1 reply; 50+ messages in thread
From: Florian Weimer @ 2023-06-22 19:07 UTC (permalink / raw)
  To: Frédéric Bérat via Libc-alpha
  Cc: Frédéric Bérat, siddhesh

* Frédéric Bérat via Libc-alpha:

> Update configure.ac to enable support for autoconf 2.71, and autoreconf
> to integrate new enable-fortify-source option.

You can use Jonathan's COPR repository for a glibc-compatible autoconf
2.69 version:

  <https://copr.fedorainfracloud.org/coprs/jwakely/autotools-gcc/>

No need to update autoconf.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-22 12:50             ` Siddhesh Poyarekar
@ 2023-06-22 19:39               ` Adhemerval Zanella Netto
  2023-06-22 21:26                 ` Siddhesh Poyarekar
  0 siblings, 1 reply; 50+ messages in thread
From: Adhemerval Zanella Netto @ 2023-06-22 19:39 UTC (permalink / raw)
  To: Siddhesh Poyarekar, Frederic Berat
  Cc: Maxim Kuvyrkov via Libc-alpha, Carlos O'Donell, Sam James



On 22/06/23 09:50, Siddhesh Poyarekar wrote:
> On 2023-06-22 08:29, Adhemerval Zanella Netto wrote:
>>>> I'd be happy to get more feedback on whether I should enforce
>>>> disablement or not, especially from people who deal with distribution
>>>> that set it by default.
>>>
>>> My worry is that with this on Ubuntu/Gentoo, there's no way through configure to disable fortification, which, importantly, is current behaviour.  The only way to do it would then be to pass CFLAGS to override the toolchain.  It's not the worst problem to have TBH, but I'd like Ubuntu or Gentoo maintainers to explicitly opt into it instead of us forcing it on them.
>>
>> Do we really need another configure option? Any extra option requires extra
>> maintainability effort to avoid it to bit-rotten (like --disable-shared [1]),
>> this option would most likely to be always used (specially because distros
>> are enabling fortify as default), and the fortify coverage are a superset
>> of the default prototypes (meaning that programs that built and run with
>> fortify enable should also run without it).
> 
> The option is needed for the small device users, where they often don't want to build with stack protector, fortification, or really anything that would accidentally make their devices more secure (sorry ;)).

But which is the size and performance implication for glibc itself by
enabling fortify as default?

> 
> The broader plan we had in mind was to disable by default in glibc-2.38 and then enable by default in glibc-2.39.  That would also mean adding a b-m-g target with --disable-fortify to ensure that it doesn't bitrot.

This has the drawback to require even more computer power to check all
possible variants. We already have --disable-default-pie, 3 modes
for --enable-stack-protector; and now for fortify it means another
option.  Each configuration flag adds quadratic more requirement to
check if all permutation does not break, which is far from ideal.

> 
> Alternatively if we're feeling adventurous, we could just enable by default in 2.38 and be done with it.  Like you said, most distributions will enable it at first opportunity anyway and doing it by default is easier than modifying the build config to add a flag.  Let them add a flag if it's actually breaking things.  What do you think?
> 

My take is do not add any more configuration flag and if user want to enable
fortify the best option would be through CC/CFLAGS. We already have specific
Makefile rules to disable where it is not applicable (similar to stack
protector), so I think we should follow the same pattern and assume it might
be enabled, disable where it is not applicable, and fix the potential issues
(as the rest of this patch).

In fact, I think we should do something similar to PIE and stack protector.

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-22 19:39               ` Adhemerval Zanella Netto
@ 2023-06-22 21:26                 ` Siddhesh Poyarekar
  2023-06-23  7:29                   ` Frederic Berat
  0 siblings, 1 reply; 50+ messages in thread
From: Siddhesh Poyarekar @ 2023-06-22 21:26 UTC (permalink / raw)
  To: Adhemerval Zanella Netto, Frederic Berat
  Cc: Maxim Kuvyrkov via Libc-alpha, Carlos O'Donell, Sam James

On 2023-06-22 15:39, Adhemerval Zanella Netto wrote:
>> The option is needed for the small device users, where they often don't want to build with stack protector, fortification, or really anything that would accidentally make their devices more secure (sorry ;)).
> 
> But which is the size and performance implication for glibc itself by
> enabling fortify as default?

IMO it's negligible, but I don't have a stake in that use case.  Those 
who do, tend to worry about a few bytes here and there.

>>
>> The broader plan we had in mind was to disable by default in glibc-2.38 and then enable by default in glibc-2.39.  That would also mean adding a b-m-g target with --disable-fortify to ensure that it doesn't bitrot.
> 
> This has the drawback to require even more computer power to check all
> possible variants. We already have --disable-default-pie, 3 modes
> for --enable-stack-protector; and now for fortify it means another
> option.  Each configuration flag adds quadratic more requirement to
> check if all permutation does not break, which is far from ideal.

... and on the topic of stack-protector, I wonder if we should make 
stack-protector=strong the default.

> My take is do not add any more configuration flag and if user want to enable
> fortify the best option would be through CC/CFLAGS. We already have specific
> Makefile rules to disable where it is not applicable (similar to stack
> protector), so I think we should follow the same pattern and assume it might
> be enabled, disable where it is not applicable, and fix the potential issues
> (as the rest of this patch).

But isn't that like sweeping the problem under the rug?  We'd still have 
to test the different configurations (or let them rot), just that we'd 
be testing different CFLAGS instead of configure flags.

Sid

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-21 15:25     ` Siddhesh Poyarekar
  2023-06-22 11:48       ` Frederic Berat
@ 2023-06-23  5:46       ` Sam James
  1 sibling, 0 replies; 50+ messages in thread
From: Sam James @ 2023-06-23  5:46 UTC (permalink / raw)
  To: Siddhesh Poyarekar
  Cc: Frederic Berat, Maxim Kuvyrkov via Libc-alpha, Carlos O'Donell

[-- Attachment #1: Type: text/plain, Size: 5013 bytes --]


Siddhesh Poyarekar <siddhesh@gotplt.org> writes:

> On 2023-06-21 09:18, Frederic Berat wrote:
>> On Tue, Jun 20, 2023 at 8:19 PM Frédéric Bérat <fberat@redhat.com> wrote:
>>>
>>> It is now possible to enable fortification.
>>> The level may be given as parameter, if none is provided, the configure
>>> script will determine what is the highest level possible that can be set
>>> considering GCC built-ins availability and set it.
>>> If level is explicitly set to 3, configure checks if the compiler
>>> supports the built-in function necessary for it or raise an error if it
>>> isn't.
>>>
>>> The result of the configure checks is 2 variables, $fortify_source and
>>> $no_fortify_source that are used to appropriately populate CFLAGS.
>>>
>>> Since the feature needs some of the routines provided by Glibc, these
>>> are excluded from the fortification.
>>> ---
>>>   Makeconfig     | 33 ++++++++++++++++++++++++---
>>>   config.make.in |  3 ++-
>>>   configure.ac   | 60 +++++++++++++++++++++++++++++++++++---------------
>>>   elf/rtld-Rules |  2 +-
>>>   4 files changed, 75 insertions(+), 23 deletions(-)
>>>
>>> diff --git a/Makeconfig b/Makeconfig
>>> index 2514db35f6..59fbd9ebf9 100644
>>> --- a/Makeconfig
>>> +++ b/Makeconfig
>>> @@ -543,12 +543,13 @@ endif  # +link
>>>   # ARM, gcc always produces different debugging symbols when invoked with
>>>   # a -O greater than 0 than when invoked with -O0, regardless of anything else
>>>   # we're using to suppress optimizations.  Therefore, we need to explicitly pass
>>> -# -O0 to it through CFLAGS.
>>> +# -O0 to it through CFLAGS. By side effect, any fortification needs to be
>>> +# disabled as it needs -O greater than 0.
>>>   # Additionally, the build system will try to -include $(common-objpfx)/config.h
>>>   # when compiling the tests, which will throw an error if some special macros
>>>   # (such as __OPTIMIZE__ and IS_IN_build) aren't defined.  To avoid this, we
>>>   # tell gcc to define IS_IN_build.
>>> -CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build
>>> +CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build $(no-fortify-source)
>>>
>>>   ifeq (yes,$(build-shared))
>>>   # These indicate whether to link using the built ld.so or the installed one.
>>> @@ -901,6 +902,16 @@ define elide-stack-protector
>>>   $(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-stack-protector))
>>>   endef
>>>
>>> +# We might want to compile with fortify-source
>>> +ifneq ($(fortify-source),)
>>> ++fortify-source=$(fortify-source)
>>> +endif
>>> +
>>> +# Some routine can't be fortified like the ones used by fortify
>>> +define elide-fortify-source
>>> +$(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-fortify-source))
>>> +endef
>>> +
>>>   # The program that makes Emacs-style TAGS files.
>>>   ETAGS  := etags
>>>
>>> @@ -961,6 +972,16 @@ endif      # $(+cflags) == ""
>>>             $(+stack-protector) -fno-common
>>>   +gcc-nowarn := -w
>>>
>>> +# We must filter out elf because the early bootstrap of the dynamic loader
>>> +# cannot be fortified. Likewise we exclude dlfcn because it is entangled
>>> +# with the loader. We must filter out csu because early startup, like the
>>> +# loader, cannot be fortified. Lastly debug is the fortification routines
>>> +# themselves and they cannot be fortified.
>>> +do-fortify = $(filter-out elf dlfcn csu debug,$(subdir))
>>> +ifeq ($(do-fortify),$(subdir))
>>> ++cflags += $(+fortify-source)
>>> +endif
>> This needs to be adapted to deal with compilers that define
>> "_FORTIFY_SOURCE" by default (checked on ubuntu 22.04):
>> +do-fortify = $(filter-out elf dlfcn csu debug,$(subdir))
>> +ifeq ($(do-fortify),$(subdir))
>> ++cflags += $(+fortify-source)
>> +else
>> ++cflags += $(no-fortify-source)
>> +endif
>> That way, we ensure that even if _FORTIFY_SOURCE is enabled at
>> system
>> level, we don't build these subdirectories with it.
>
> That's likely true for Gentoo as well.  Additionally, those
> distributions will default to fortification being enabled by default,
> without --enable-fortify-source.  This is probably wrong in terms of
> compatibility and user expectations, i.e. without the configure flag,
> the code generated should be like in 2.37, i.e. glibc should strictly
> not be built with fortification enabled.
>
> Sam, do you have an opinion on this?  Would it be too surprising for
> Gentoo packaging/users if glibc 2.38 built with fortification on by
> default?  FWIW, we'll likely flip to enabling fortification by default
> in 2.39 and make the flag --disable-fortify-source, but that's a
> different bridge to cross.

(Sorry for the delay - this got buried. I know it's been merged since.)

Thanks for asking!

I don't see a problem with this, as we build with F_S=2 even for vanilla
users, although I'll have to think about whether or not to keep it at
2 or roll with the glibc default of F_S=3 if the toolchain supports it?

best,
sam


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 377 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/21] Add --enable-fortify-source option
  2023-06-22 21:26                 ` Siddhesh Poyarekar
@ 2023-06-23  7:29                   ` Frederic Berat
  0 siblings, 0 replies; 50+ messages in thread
From: Frederic Berat @ 2023-06-23  7:29 UTC (permalink / raw)
  To: Siddhesh Poyarekar
  Cc: Adhemerval Zanella Netto, Maxim Kuvyrkov via Libc-alpha,
	Carlos O'Donell, Sam James

On Thu, Jun 22, 2023 at 11:26 PM Siddhesh Poyarekar <siddhesh@gotplt.org> wrote:
>
> On 2023-06-22 15:39, Adhemerval Zanella Netto wrote:
> >> The option is needed for the small device users, where they often don't want to build with stack protector, fortification, or really anything that would accidentally make their devices more secure (sorry ;)).
> >
> > But which is the size and performance implication for glibc itself by
> > enabling fortify as default?
>
> IMO it's negligible, but I don't have a stake in that use case.  Those
> who do, tend to worry about a few bytes here and there.
>
> >>
> >> The broader plan we had in mind was to disable by default in glibc-2.38 and then enable by default in glibc-2.39.  That would also mean adding a b-m-g target with --disable-fortify to ensure that it doesn't bitrot.
> >
> > This has the drawback to require even more computer power to check all
> > possible variants. We already have --disable-default-pie, 3 modes
> > for --enable-stack-protector; and now for fortify it means another
> > option.  Each configuration flag adds quadratic more requirement to
> > check if all permutation does not break, which is far from ideal.
>
> ... and on the topic of stack-protector, I wonder if we should make
> stack-protector=strong the default.
>
> > My take is do not add any more configuration flag and if user want to enable
> > fortify the best option would be through CC/CFLAGS. We already have specific
> > Makefile rules to disable where it is not applicable (similar to stack
> > protector), so I think we should follow the same pattern and assume it might
> > be enabled, disable where it is not applicable, and fix the potential issues
> > (as the rest of this patch).
>
> But isn't that like sweeping the problem under the rug?  We'd still have
> to test the different configurations (or let them rot), just that we'd
> be testing different CFLAGS instead of configure flags.
>

Considering the direction of the discussion, I'll split the configure
changes into 2 patches. One that allows glibc with _FORTIFY_SOURCE
through whatever means, and a second one that introduces the new
configure option.

> Sid
>


^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 02/21] Configure: regenerate for autoconf 2.71
  2023-06-22 19:07   ` Florian Weimer
@ 2023-06-23 11:28     ` Carlos O'Donell
  0 siblings, 0 replies; 50+ messages in thread
From: Carlos O'Donell @ 2023-06-23 11:28 UTC (permalink / raw)
  To: Florian Weimer, Frédéric Bérat via Libc-alpha
  Cc: Frédéric Bérat, siddhesh

On 6/22/23 15:07, Florian Weimer via Libc-alpha wrote:
> * Frédéric Bérat via Libc-alpha:
> 
>> Update configure.ac to enable support for autoconf 2.71, and autoreconf
>> to integrate new enable-fortify-source option.
> 
> You can use Jonathan's COPR repository for a glibc-compatible autoconf
> 2.69 version:
> 
>   <https://copr.fedorainfracloud.org/coprs/jwakely/autotools-gcc/>
> 
> No need to update autoconf.

While there is no need, I would really like to see the GNU Toolchain as a whole start
moving forward to autoconf 2.71. Like Joseph I encourage this to be sent as a distinct
patch for review.

-- 
Cheers,
Carlos.


^ permalink raw reply	[flat|nested] 50+ messages in thread

end of thread, other threads:[~2023-07-14  6:33 UTC | newest]

Thread overview: 50+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-20 18:18 [PATCH 00/21] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
2023-06-20 18:18 ` [PATCH 01/21] Add --enable-fortify-source option Frédéric Bérat
2023-06-20 20:42   ` Joseph Myers
2023-06-21 13:19     ` Frederic Berat
2023-06-21 13:18   ` Frederic Berat
2023-06-21 15:25     ` Siddhesh Poyarekar
2023-06-22 11:48       ` Frederic Berat
2023-06-22 11:54         ` Siddhesh Poyarekar
2023-06-22 12:29           ` Adhemerval Zanella Netto
2023-06-22 12:50             ` Siddhesh Poyarekar
2023-06-22 19:39               ` Adhemerval Zanella Netto
2023-06-22 21:26                 ` Siddhesh Poyarekar
2023-06-23  7:29                   ` Frederic Berat
2023-06-23  5:46       ` Sam James
2023-06-20 18:18 ` [PATCH 02/21] Configure: regenerate for autoconf 2.71 Frédéric Bérat
2023-06-20 20:47   ` Joseph Myers
2023-06-22 19:07   ` Florian Weimer
2023-06-23 11:28     ` Carlos O'Donell
2023-06-20 18:18 ` [PATCH 03/21] Exclude routines from fortification Frédéric Bérat
2023-06-20 18:18 ` [PATCH 04/21] sysdeps/{i386,x86_64}/mempcpy_chk.S: fix linknamespace for __mempcpy_chk Frédéric Bérat
2023-06-21 12:27   ` Siddhesh Poyarekar
2023-06-21 17:26     ` Noah Goldstein
2023-06-22  4:02       ` Siddhesh Poyarekar
2023-06-20 18:18 ` [PATCH 05/21] stdio-common: tests: Incorrect maxlen parameter for swprintf Frédéric Bérat
2023-06-21 12:29   ` Siddhesh Poyarekar
2023-06-20 18:18 ` [PATCH 06/21] sysdeps: Ensure ieee128*_chk routines to be properly named Frédéric Bérat
2023-06-20 18:18 ` [PATCH 07/21] string: Ensure *_chk routines have their hidden builtin definition available Frédéric Bérat
2023-06-20 18:18 ` [PATCH 08/21] stdio: " Frédéric Bérat
2023-06-20 18:18 ` [PATCH 09/21] asprintf_chk: Ensure compatibility for both s390x and ppc64le Frédéric Bérat
2023-06-20 18:18 ` [PATCH 10/21] misc/sys/cdefs.h: Create FORTIFY redirects for internal calls Frédéric Bérat
2023-06-20 18:18 ` [PATCH 11/21] wcsmbs/bits/wchar2{,-decl}.h: Clearly separate declaration from definitions Frédéric Bérat
2023-06-22  4:19   ` Siddhesh Poyarekar
2023-06-20 18:19 ` [PATCH 12/21] wcsmbs/bits/wchar2{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE Frédéric Bérat
2023-06-20 18:19 ` [PATCH 13/21] posix/bits/unistd.h: Clearly separate declaration from definitions Frédéric Bérat
2023-06-22  4:17   ` Siddhesh Poyarekar
2023-06-20 18:19 ` [PATCH 14/21] posix/bits/unistd{,-decl}.h: Avoid PLT entries with _FORTIFY_SOURCE Frédéric Bérat
2023-06-20 18:19 ` [PATCH 15/21] debug/readlink{,at}_chk.c: Harmonize declaration and definition Frédéric Bérat
2023-06-22  4:11   ` Siddhesh Poyarekar
2023-06-20 18:19 ` [PATCH 16/21] misc/bits/select2.h: Clearly separate declaration from definitions Frédéric Bérat
2023-06-22  4:16   ` Siddhesh Poyarekar
2023-06-20 18:19 ` [PATCH 17/21] misc/bits/syslog.h: Clearly separate declaration from definition Frédéric Bérat
2023-06-22  4:24   ` Siddhesh Poyarekar
2023-06-20 18:19 ` [PATCH 18/21] rt/tst-mqueue4.c: Fix wrong number of argument for mq_open Frédéric Bérat
2023-06-21 12:26   ` Siddhesh Poyarekar
2023-06-20 18:19 ` [PATCH 19/21] sysdeps/ieee754/ldbl-128ibm-compat: Fix warn unused result Frédéric Bérat
2023-06-21 11:56   ` Siddhesh Poyarekar
2023-06-20 18:19 ` [PATCH 20/21] sysdeps/powerpc/fpu/tst-setcontext-fpscr.c: " Frédéric Bérat
2023-06-21 11:45   ` Siddhesh Poyarekar
2023-06-20 18:19 ` [PATCH 21/21] benchtests: fix " Frédéric Bérat
2023-06-21 11:42   ` Siddhesh Poyarekar

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).