CRUX-ARM : Home

Home :: Documentation :: Download :: Development :: Community :: Ports :: Packages :: Bugs :: Links :: About :: Donors
glibc: updated to 2.32
authorVictor Martinez <pitillo@ono.com>
Wed, 6 Jan 2021 18:45:53 +0000 (19:45 +0100)
committerVictor Martinez <pitillo@ono.com>
Wed, 6 Jan 2021 18:45:53 +0000 (19:45 +0100)
glibc/.footprint
glibc/.signature
glibc/Pkgfile
glibc/glibc-2.28-1.patch [deleted file]
glibc/glibc-2.32-2.patch [new file with mode: 0755]

index 570264a18bc4a7a21d89427533129e227853a572..61a8cfba0fd688034d96e37ff1451fd62455554c 100644 (file)
@@ -10,49 +10,45 @@ lrwxrwxrwx  root/root       etc/localtime -> ../usr/share/zoneinfo/UTC
 -rw-r--r--     root/root       etc/resolv.conf
 -rw-r--r--     root/root       etc/rpc
 drwxr-xr-x     root/root       lib/
--rwxr-xr-x     root/root       lib/ld-2.28.so
-lrwxrwxrwx     root/root       lib/ld-linux-armhf.so.3 -> ld-2.28.so
--rwxr-xr-x     root/root       lib/libBrokenLocale-2.28.so
-lrwxrwxrwx     root/root       lib/libBrokenLocale.so.1 -> libBrokenLocale-2.28.so
+-rwxr-xr-x     root/root       lib/ld-2.32.so
+lrwxrwxrwx     root/root       lib/ld-linux-armhf.so.3 -> ld-2.32.so
+-rwxr-xr-x     root/root       lib/libBrokenLocale-2.32.so
+lrwxrwxrwx     root/root       lib/libBrokenLocale.so.1 -> libBrokenLocale-2.32.so
 -rwxr-xr-x     root/root       lib/libSegFault.so
--rwxr-xr-x     root/root       lib/libanl-2.28.so
-lrwxrwxrwx     root/root       lib/libanl.so.1 -> libanl-2.28.so
--rwxr-xr-x     root/root       lib/libc-2.28.so
-lrwxrwxrwx     root/root       lib/libc.so.6 -> libc-2.28.so
--rwxr-xr-x     root/root       lib/libcrypt-2.28.so
-lrwxrwxrwx     root/root       lib/libcrypt.so.1 -> libcrypt-2.28.so
--rwxr-xr-x     root/root       lib/libdl-2.28.so
-lrwxrwxrwx     root/root       lib/libdl.so.2 -> libdl-2.28.so
--rwxr-xr-x     root/root       lib/libm-2.28.so
-lrwxrwxrwx     root/root       lib/libm.so.6 -> libm-2.28.so
+-rwxr-xr-x     root/root       lib/libanl-2.32.so
+lrwxrwxrwx     root/root       lib/libanl.so.1 -> libanl-2.32.so
+-rwxr-xr-x     root/root       lib/libc-2.32.so
+lrwxrwxrwx     root/root       lib/libc.so.6 -> libc-2.32.so
+-rwxr-xr-x     root/root       lib/libcrypt-2.32.so
+lrwxrwxrwx     root/root       lib/libcrypt.so.1 -> libcrypt-2.32.so
+-rwxr-xr-x     root/root       lib/libdl-2.32.so
+lrwxrwxrwx     root/root       lib/libdl.so.2 -> libdl-2.32.so
+-rwxr-xr-x     root/root       lib/libm-2.32.so
+lrwxrwxrwx     root/root       lib/libm.so.6 -> libm-2.32.so
 -rwxr-xr-x     root/root       lib/libmemusage.so
--rwxr-xr-x     root/root       lib/libnsl-2.28.so
-lrwxrwxrwx     root/root       lib/libnsl.so.1 -> libnsl-2.28.so
--rwxr-xr-x     root/root       lib/libnss_compat-2.28.so
-lrwxrwxrwx     root/root       lib/libnss_compat.so.2 -> libnss_compat-2.28.so
--rwxr-xr-x     root/root       lib/libnss_db-2.28.so
-lrwxrwxrwx     root/root       lib/libnss_db.so.2 -> libnss_db-2.28.so
--rwxr-xr-x     root/root       lib/libnss_dns-2.28.so
-lrwxrwxrwx     root/root       lib/libnss_dns.so.2 -> libnss_dns-2.28.so
--rwxr-xr-x     root/root       lib/libnss_files-2.28.so
-lrwxrwxrwx     root/root       lib/libnss_files.so.2 -> libnss_files-2.28.so
--rwxr-xr-x     root/root       lib/libnss_hesiod-2.28.so
-lrwxrwxrwx     root/root       lib/libnss_hesiod.so.2 -> libnss_hesiod-2.28.so
--rwxr-xr-x     root/root       lib/libnss_nis-2.28.so
-lrwxrwxrwx     root/root       lib/libnss_nis.so.2 -> libnss_nis-2.28.so
--rwxr-xr-x     root/root       lib/libnss_nisplus-2.28.so
-lrwxrwxrwx     root/root       lib/libnss_nisplus.so.2 -> libnss_nisplus-2.28.so
+-rwxr-xr-x     root/root       lib/libnsl-2.32.so
+lrwxrwxrwx     root/root       lib/libnsl.so.1 -> libnsl-2.32.so
+-rwxr-xr-x     root/root       lib/libnss_compat-2.32.so
+lrwxrwxrwx     root/root       lib/libnss_compat.so.2 -> libnss_compat-2.32.so
+-rwxr-xr-x     root/root       lib/libnss_db-2.32.so
+lrwxrwxrwx     root/root       lib/libnss_db.so.2 -> libnss_db-2.32.so
+-rwxr-xr-x     root/root       lib/libnss_dns-2.32.so
+lrwxrwxrwx     root/root       lib/libnss_dns.so.2 -> libnss_dns-2.32.so
+-rwxr-xr-x     root/root       lib/libnss_files-2.32.so
+lrwxrwxrwx     root/root       lib/libnss_files.so.2 -> libnss_files-2.32.so
+-rwxr-xr-x     root/root       lib/libnss_hesiod-2.32.so
+lrwxrwxrwx     root/root       lib/libnss_hesiod.so.2 -> libnss_hesiod-2.32.so
 -rwxr-xr-x     root/root       lib/libpcprofile.so
--rwxr-xr-x     root/root       lib/libpthread-2.28.so
-lrwxrwxrwx     root/root       lib/libpthread.so.0 -> libpthread-2.28.so
--rwxr-xr-x     root/root       lib/libresolv-2.28.so
-lrwxrwxrwx     root/root       lib/libresolv.so.2 -> libresolv-2.28.so
--rwxr-xr-x     root/root       lib/librt-2.28.so
-lrwxrwxrwx     root/root       lib/librt.so.1 -> librt-2.28.so
+-rwxr-xr-x     root/root       lib/libpthread-2.32.so
+lrwxrwxrwx     root/root       lib/libpthread.so.0 -> libpthread-2.32.so
+-rwxr-xr-x     root/root       lib/libresolv-2.32.so
+lrwxrwxrwx     root/root       lib/libresolv.so.2 -> libresolv-2.32.so
+-rwxr-xr-x     root/root       lib/librt-2.32.so
+lrwxrwxrwx     root/root       lib/librt.so.1 -> librt-2.32.so
 -rwxr-xr-x     root/root       lib/libthread_db-1.0.so
 lrwxrwxrwx     root/root       lib/libthread_db.so.1 -> libthread_db-1.0.so
--rwxr-xr-x     root/root       lib/libutil-2.28.so
-lrwxrwxrwx     root/root       lib/libutil.so.1 -> libutil-2.28.so
+-rwxr-xr-x     root/root       lib/libutil-2.32.so
+lrwxrwxrwx     root/root       lib/libutil.so.1 -> libutil-2.32.so
 drwxr-xr-x     root/root       sbin/
 -rwxr-xr-x     root/root       sbin/ldconfig
 -rwxr-xr-x     root/root       sbin/sln
@@ -70,7 +66,6 @@ drwxr-xr-x    root/root       usr/bin/
 -rwxr-xr-x     root/root       usr/bin/mtrace
 -rwxr-xr-x     root/root       usr/bin/pcprofiledump
 -rwxr-xr-x     root/root       usr/bin/pldd
--rwxr-xr-x     root/root       usr/bin/rpcgen
 -rwxr-xr-x     root/root       usr/bin/sotruss
 -rwxr-xr-x     root/root       usr/bin/sprof
 -rwxr-xr-x     root/root       usr/bin/xtrace
@@ -169,24 +164,28 @@ drwxr-xr-x        root/root       usr/include/asm/
 -rw-r--r--     root/root       usr/include/assert.h
 drwxr-xr-x     root/root       usr/include/bits/
 -rw-r--r--     root/root       usr/include/bits/a.out.h
+-rw-r--r--     root/root       usr/include/bits/argp-ldbl.h
 -rw-r--r--     root/root       usr/include/bits/byteswap.h
 -rw-r--r--     root/root       usr/include/bits/cmathcalls.h
 -rw-r--r--     root/root       usr/include/bits/confname.h
 -rw-r--r--     root/root       usr/include/bits/cpu-set.h
 -rw-r--r--     root/root       usr/include/bits/dirent.h
+-rw-r--r--     root/root       usr/include/bits/dirent_ext.h
 -rw-r--r--     root/root       usr/include/bits/dlfcn.h
 -rw-r--r--     root/root       usr/include/bits/elfclass.h
 -rw-r--r--     root/root       usr/include/bits/endian.h
+-rw-r--r--     root/root       usr/include/bits/endianness.h
 -rw-r--r--     root/root       usr/include/bits/environments.h
 -rw-r--r--     root/root       usr/include/bits/epoll.h
+-rw-r--r--     root/root       usr/include/bits/err-ldbl.h
 -rw-r--r--     root/root       usr/include/bits/errno.h
+-rw-r--r--     root/root       usr/include/bits/error-ldbl.h
 -rw-r--r--     root/root       usr/include/bits/error.h
 -rw-r--r--     root/root       usr/include/bits/eventfd.h
 -rw-r--r--     root/root       usr/include/bits/fcntl-linux.h
 -rw-r--r--     root/root       usr/include/bits/fcntl.h
 -rw-r--r--     root/root       usr/include/bits/fcntl2.h
 -rw-r--r--     root/root       usr/include/bits/fenv.h
--rw-r--r--     root/root       usr/include/bits/fenvinline.h
 -rw-r--r--     root/root       usr/include/bits/floatn-common.h
 -rw-r--r--     root/root       usr/include/bits/floatn.h
 -rw-r--r--     root/root       usr/include/bits/flt-eval-method.h
@@ -202,6 +201,7 @@ drwxr-xr-x  root/root       usr/include/bits/
 -rw-r--r--     root/root       usr/include/bits/inotify.h
 -rw-r--r--     root/root       usr/include/bits/ioctl-types.h
 -rw-r--r--     root/root       usr/include/bits/ioctls.h
+-rw-r--r--     root/root       usr/include/bits/ipc-perm.h
 -rw-r--r--     root/root       usr/include/bits/ipc.h
 -rw-r--r--     root/root       usr/include/bits/ipctypes.h
 -rw-r--r--     root/root       usr/include/bits/iscanonical.h
@@ -211,14 +211,13 @@ drwxr-xr-x        root/root       usr/include/bits/
 -rw-r--r--     root/root       usr/include/bits/local_lim.h
 -rw-r--r--     root/root       usr/include/bits/locale.h
 -rw-r--r--     root/root       usr/include/bits/long-double.h
--rw-r--r--     root/root       usr/include/bits/math-finite.h
 -rw-r--r--     root/root       usr/include/bits/math-vector.h
 -rw-r--r--     root/root       usr/include/bits/mathcalls-helper-functions.h
 -rw-r--r--     root/root       usr/include/bits/mathcalls-narrow.h
 -rw-r--r--     root/root       usr/include/bits/mathcalls.h
 -rw-r--r--     root/root       usr/include/bits/mathdef.h
--rw-r--r--     root/root       usr/include/bits/mathinline.h
 -rw-r--r--     root/root       usr/include/bits/mman-linux.h
+-rw-r--r--     root/root       usr/include/bits/mman-map-flags-generic.h
 -rw-r--r--     root/root       usr/include/bits/mman-shared.h
 -rw-r--r--     root/root       usr/include/bits/mman.h
 -rw-r--r--     root/root       usr/include/bits/monetary-ldbl.h
@@ -233,6 +232,10 @@ drwxr-xr-x root/root       usr/include/bits/
 -rw-r--r--     root/root       usr/include/bits/posix2_lim.h
 -rw-r--r--     root/root       usr/include/bits/posix_opt.h
 -rw-r--r--     root/root       usr/include/bits/printf-ldbl.h
+-rw-r--r--     root/root       usr/include/bits/procfs-extra.h
+-rw-r--r--     root/root       usr/include/bits/procfs-id.h
+-rw-r--r--     root/root       usr/include/bits/procfs-prregset.h
+-rw-r--r--     root/root       usr/include/bits/procfs.h
 -rw-r--r--     root/root       usr/include/bits/pthreadtypes-arch.h
 -rw-r--r--     root/root       usr/include/bits/pthreadtypes.h
 -rw-r--r--     root/root       usr/include/bits/ptrace-shared.h
@@ -245,18 +248,21 @@ drwxr-xr-x        root/root       usr/include/bits/
 -rw-r--r--     root/root       usr/include/bits/setjmp.h
 -rw-r--r--     root/root       usr/include/bits/setjmp2.h
 -rw-r--r--     root/root       usr/include/bits/shm.h
+-rw-r--r--     root/root       usr/include/bits/shmlba.h
 -rw-r--r--     root/root       usr/include/bits/sigaction.h
 -rw-r--r--     root/root       usr/include/bits/sigcontext.h
 -rw-r--r--     root/root       usr/include/bits/sigevent-consts.h
 -rw-r--r--     root/root       usr/include/bits/siginfo-arch.h
 -rw-r--r--     root/root       usr/include/bits/siginfo-consts-arch.h
 -rw-r--r--     root/root       usr/include/bits/siginfo-consts.h
+-rw-r--r--     root/root       usr/include/bits/signal_ext.h
 -rw-r--r--     root/root       usr/include/bits/signalfd.h
+-rw-r--r--     root/root       usr/include/bits/signum-arch.h
 -rw-r--r--     root/root       usr/include/bits/signum-generic.h
--rw-r--r--     root/root       usr/include/bits/signum.h
 -rw-r--r--     root/root       usr/include/bits/sigstack.h
 -rw-r--r--     root/root       usr/include/bits/sigthread.h
 -rw-r--r--     root/root       usr/include/bits/sockaddr.h
+-rw-r--r--     root/root       usr/include/bits/socket-constants.h
 -rw-r--r--     root/root       usr/include/bits/socket.h
 -rw-r--r--     root/root       usr/include/bits/socket2.h
 -rw-r--r--     root/root       usr/include/bits/socket_type.h
@@ -265,6 +271,7 @@ drwxr-xr-x  root/root       usr/include/bits/
 -rw-r--r--     root/root       usr/include/bits/stat.h
 -rw-r--r--     root/root       usr/include/bits/statfs.h
 -rw-r--r--     root/root       usr/include/bits/statvfs.h
+-rw-r--r--     root/root       usr/include/bits/statx-generic.h
 -rw-r--r--     root/root       usr/include/bits/statx.h
 -rw-r--r--     root/root       usr/include/bits/stdint-intn.h
 -rw-r--r--     root/root       usr/include/bits/stdint-uintn.h
@@ -278,18 +285,28 @@ drwxr-xr-x        root/root       usr/include/bits/
 -rw-r--r--     root/root       usr/include/bits/stdlib.h
 -rw-r--r--     root/root       usr/include/bits/string_fortified.h
 -rw-r--r--     root/root       usr/include/bits/strings_fortified.h
--rw-r--r--     root/root       usr/include/bits/stropts.h
--rw-r--r--     root/root       usr/include/bits/sys_errlist.h
+-rw-r--r--     root/root       usr/include/bits/struct_mutex.h
+-rw-r--r--     root/root       usr/include/bits/struct_rwlock.h
 -rw-r--r--     root/root       usr/include/bits/syscall.h
--rw-r--r--     root/root       usr/include/bits/sysctl.h
 -rw-r--r--     root/root       usr/include/bits/syslog-ldbl.h
 -rw-r--r--     root/root       usr/include/bits/syslog-path.h
 -rw-r--r--     root/root       usr/include/bits/syslog.h
 -rw-r--r--     root/root       usr/include/bits/sysmacros.h
+-rw-r--r--     root/root       usr/include/bits/termios-baud.h
+-rw-r--r--     root/root       usr/include/bits/termios-c_cc.h
+-rw-r--r--     root/root       usr/include/bits/termios-c_cflag.h
+-rw-r--r--     root/root       usr/include/bits/termios-c_iflag.h
+-rw-r--r--     root/root       usr/include/bits/termios-c_lflag.h
+-rw-r--r--     root/root       usr/include/bits/termios-c_oflag.h
+-rw-r--r--     root/root       usr/include/bits/termios-misc.h
+-rw-r--r--     root/root       usr/include/bits/termios-struct.h
+-rw-r--r--     root/root       usr/include/bits/termios-tcflow.h
 -rw-r--r--     root/root       usr/include/bits/termios.h
 -rw-r--r--     root/root       usr/include/bits/thread-shared-types.h
 -rw-r--r--     root/root       usr/include/bits/time.h
+-rw-r--r--     root/root       usr/include/bits/time64.h
 -rw-r--r--     root/root       usr/include/bits/timerfd.h
+-rw-r--r--     root/root       usr/include/bits/timesize.h
 -rw-r--r--     root/root       usr/include/bits/timex.h
 -rw-r--r--     root/root       usr/include/bits/types.h
 drwxr-xr-x     root/root       usr/include/bits/types/
@@ -317,10 +334,15 @@ drwxr-xr-x        root/root       usr/include/bits/types/
 -rw-r--r--     root/root       usr/include/bits/types/struct_FILE.h
 -rw-r--r--     root/root       usr/include/bits/types/struct_iovec.h
 -rw-r--r--     root/root       usr/include/bits/types/struct_itimerspec.h
+-rw-r--r--     root/root       usr/include/bits/types/struct_msqid_ds.h
 -rw-r--r--     root/root       usr/include/bits/types/struct_osockaddr.h
 -rw-r--r--     root/root       usr/include/bits/types/struct_rusage.h
 -rw-r--r--     root/root       usr/include/bits/types/struct_sched_param.h
+-rw-r--r--     root/root       usr/include/bits/types/struct_semid_ds.h
+-rw-r--r--     root/root       usr/include/bits/types/struct_shmid_ds.h
 -rw-r--r--     root/root       usr/include/bits/types/struct_sigstack.h
+-rw-r--r--     root/root       usr/include/bits/types/struct_statx.h
+-rw-r--r--     root/root       usr/include/bits/types/struct_statx_timestamp.h
 -rw-r--r--     root/root       usr/include/bits/types/struct_timespec.h
 -rw-r--r--     root/root       usr/include/bits/types/struct_timeval.h
 -rw-r--r--     root/root       usr/include/bits/types/struct_tm.h
@@ -332,6 +354,7 @@ drwxr-xr-x  root/root       usr/include/bits/types/
 -rw-r--r--     root/root       usr/include/bits/uio-ext.h
 -rw-r--r--     root/root       usr/include/bits/uio_lim.h
 -rw-r--r--     root/root       usr/include/bits/unistd.h
+-rw-r--r--     root/root       usr/include/bits/unistd_ext.h
 -rw-r--r--     root/root       usr/include/bits/utmp.h
 -rw-r--r--     root/root       usr/include/bits/utmpx.h
 -rw-r--r--     root/root       usr/include/bits/utsname.h
@@ -343,7 +366,6 @@ drwxr-xr-x  root/root       usr/include/bits/types/
 -rw-r--r--     root/root       usr/include/bits/wctype-wchar.h
 -rw-r--r--     root/root       usr/include/bits/wordsize.h
 -rw-r--r--     root/root       usr/include/bits/xopen_lim.h
--rw-r--r--     root/root       usr/include/bits/xtitypes.h
 -rw-r--r--     root/root       usr/include/byteswap.h
 -rw-r--r--     root/root       usr/include/complex.h
 -rw-r--r--     root/root       usr/include/cpio.h
@@ -388,6 +410,8 @@ drwxr-xr-x  root/root       usr/include/drm/
 -rw-r--r--     root/root       usr/include/fcntl.h
 -rw-r--r--     root/root       usr/include/features.h
 -rw-r--r--     root/root       usr/include/fenv.h
+drwxr-xr-x     root/root       usr/include/finclude/
+-rw-r--r--     root/root       usr/include/finclude/math-vector-fortran.h
 -rw-r--r--     root/root       usr/include/fmtmsg.h
 -rw-r--r--     root/root       usr/include/fnmatch.h
 -rw-r--r--     root/root       usr/include/fpu_control.h
@@ -1260,61 +1284,7 @@ drwxr-xr-x       root/root       usr/include/rdma/hfi/
 -rw-r--r--     root/root       usr/include/regexp.h
 -rw-r--r--     root/root       usr/include/resolv.h
 drwxr-xr-x     root/root       usr/include/rpc/
--rw-r--r--     root/root       usr/include/rpc/auth.h
--rw-r--r--     root/root       usr/include/rpc/auth_des.h
--rw-r--r--     root/root       usr/include/rpc/auth_unix.h
--rw-r--r--     root/root       usr/include/rpc/clnt.h
--rw-r--r--     root/root       usr/include/rpc/key_prot.h
 -rw-r--r--     root/root       usr/include/rpc/netdb.h
--rw-r--r--     root/root       usr/include/rpc/pmap_clnt.h
--rw-r--r--     root/root       usr/include/rpc/pmap_prot.h
--rw-r--r--     root/root       usr/include/rpc/pmap_rmt.h
--rw-r--r--     root/root       usr/include/rpc/rpc.h
--rw-r--r--     root/root       usr/include/rpc/rpc_msg.h
--rw-r--r--     root/root       usr/include/rpc/svc.h
--rw-r--r--     root/root       usr/include/rpc/svc_auth.h
--rw-r--r--     root/root       usr/include/rpc/types.h
--rw-r--r--     root/root       usr/include/rpc/xdr.h
-drwxr-xr-x     root/root       usr/include/rpcsvc/
--rw-r--r--     root/root       usr/include/rpcsvc/bootparam.h
--rw-r--r--     root/root       usr/include/rpcsvc/bootparam_prot.h
--rw-r--r--     root/root       usr/include/rpcsvc/bootparam_prot.x
--rw-r--r--     root/root       usr/include/rpcsvc/key_prot.h
--rw-r--r--     root/root       usr/include/rpcsvc/key_prot.x
--rw-r--r--     root/root       usr/include/rpcsvc/klm_prot.h
--rw-r--r--     root/root       usr/include/rpcsvc/klm_prot.x
--rw-r--r--     root/root       usr/include/rpcsvc/mount.h
--rw-r--r--     root/root       usr/include/rpcsvc/mount.x
--rw-r--r--     root/root       usr/include/rpcsvc/nfs_prot.h
--rw-r--r--     root/root       usr/include/rpcsvc/nfs_prot.x
--rw-r--r--     root/root       usr/include/rpcsvc/nis.h
--rw-r--r--     root/root       usr/include/rpcsvc/nis.x
--rw-r--r--     root/root       usr/include/rpcsvc/nis_callback.h
--rw-r--r--     root/root       usr/include/rpcsvc/nis_callback.x
--rw-r--r--     root/root       usr/include/rpcsvc/nis_object.x
--rw-r--r--     root/root       usr/include/rpcsvc/nis_tags.h
--rw-r--r--     root/root       usr/include/rpcsvc/nislib.h
--rw-r--r--     root/root       usr/include/rpcsvc/nlm_prot.h
--rw-r--r--     root/root       usr/include/rpcsvc/nlm_prot.x
--rw-r--r--     root/root       usr/include/rpcsvc/rex.h
--rw-r--r--     root/root       usr/include/rpcsvc/rex.x
--rw-r--r--     root/root       usr/include/rpcsvc/rquota.h
--rw-r--r--     root/root       usr/include/rpcsvc/rquota.x
--rw-r--r--     root/root       usr/include/rpcsvc/rstat.h
--rw-r--r--     root/root       usr/include/rpcsvc/rstat.x
--rw-r--r--     root/root       usr/include/rpcsvc/rusers.h
--rw-r--r--     root/root       usr/include/rpcsvc/rusers.x
--rw-r--r--     root/root       usr/include/rpcsvc/sm_inter.h
--rw-r--r--     root/root       usr/include/rpcsvc/sm_inter.x
--rw-r--r--     root/root       usr/include/rpcsvc/spray.h
--rw-r--r--     root/root       usr/include/rpcsvc/spray.x
--rw-r--r--     root/root       usr/include/rpcsvc/yp.h
--rw-r--r--     root/root       usr/include/rpcsvc/yp.x
--rw-r--r--     root/root       usr/include/rpcsvc/yp_prot.h
--rw-r--r--     root/root       usr/include/rpcsvc/ypclnt.h
--rw-r--r--     root/root       usr/include/rpcsvc/yppasswd.h
--rw-r--r--     root/root       usr/include/rpcsvc/yppasswd.x
--rw-r--r--     root/root       usr/include/rpcsvc/ypupd.h
 -rw-r--r--     root/root       usr/include/sched.h
 drwxr-xr-x     root/root       usr/include/scsi/
 -rw-r--r--     root/root       usr/include/scsi/cxlflash_ioctl.h
@@ -1361,7 +1331,6 @@ drwxr-xr-x        root/root       usr/include/sound/
 -rw-r--r--     root/root       usr/include/stdlib.h
 -rw-r--r--     root/root       usr/include/string.h
 -rw-r--r--     root/root       usr/include/strings.h
--rw-r--r--     root/root       usr/include/stropts.h
 drwxr-xr-x     root/root       usr/include/sys/
 -rw-r--r--     root/root       usr/include/sys/acct.h
 -rw-r--r--     root/root       usr/include/sys/auxv.h
@@ -1379,7 +1348,6 @@ drwxr-xr-x        root/root       usr/include/sys/
 -rw-r--r--     root/root       usr/include/sys/gmon.h
 -rw-r--r--     root/root       usr/include/sys/gmon_out.h
 -rw-r--r--     root/root       usr/include/sys/inotify.h
--rw-r--r--     root/root       usr/include/sys/io.h
 -rw-r--r--     root/root       usr/include/sys/ioctl.h
 -rw-r--r--     root/root       usr/include/sys/ipc.h
 -rw-r--r--     root/root       usr/include/sys/kd.h
@@ -1408,16 +1376,15 @@ drwxr-xr-x      root/root       usr/include/sys/
 -rw-r--r--     root/root       usr/include/sys/shm.h
 -rw-r--r--     root/root       usr/include/sys/signal.h
 -rw-r--r--     root/root       usr/include/sys/signalfd.h
+-rw-r--r--     root/root       usr/include/sys/single_threaded.h
 -rw-r--r--     root/root       usr/include/sys/socket.h
 -rw-r--r--     root/root       usr/include/sys/socketvar.h
 -rw-r--r--     root/root       usr/include/sys/soundcard.h
 -rw-r--r--     root/root       usr/include/sys/stat.h
 -rw-r--r--     root/root       usr/include/sys/statfs.h
 -rw-r--r--     root/root       usr/include/sys/statvfs.h
--rw-r--r--     root/root       usr/include/sys/stropts.h
 -rw-r--r--     root/root       usr/include/sys/swap.h
 -rw-r--r--     root/root       usr/include/sys/syscall.h
--rw-r--r--     root/root       usr/include/sys/sysctl.h
 -rw-r--r--     root/root       usr/include/sys/sysinfo.h
 -rw-r--r--     root/root       usr/include/sys/syslog.h
 -rw-r--r--     root/root       usr/include/sys/sysmacros.h
@@ -1760,20 +1727,15 @@ lrwxrwxrwx      root/root       usr/lib/libdl.so -> ../../lib/libdl.so.2
 -rw-r--r--     root/root       usr/lib/libm.a
 lrwxrwxrwx     root/root       usr/lib/libm.so -> ../../lib/libm.so.6
 -rw-r--r--     root/root       usr/lib/libmcheck.a
--rw-r--r--     root/root       usr/lib/libnsl.a
-lrwxrwxrwx     root/root       usr/lib/libnsl.so -> ../../lib/libnsl.so.1
 lrwxrwxrwx     root/root       usr/lib/libnss_compat.so -> ../../lib/libnss_compat.so.2
 lrwxrwxrwx     root/root       usr/lib/libnss_db.so -> ../../lib/libnss_db.so.2
 lrwxrwxrwx     root/root       usr/lib/libnss_dns.so -> ../../lib/libnss_dns.so.2
 lrwxrwxrwx     root/root       usr/lib/libnss_files.so -> ../../lib/libnss_files.so.2
 lrwxrwxrwx     root/root       usr/lib/libnss_hesiod.so -> ../../lib/libnss_hesiod.so.2
-lrwxrwxrwx     root/root       usr/lib/libnss_nis.so -> ../../lib/libnss_nis.so.2
-lrwxrwxrwx     root/root       usr/lib/libnss_nisplus.so -> ../../lib/libnss_nisplus.so.2
 -rw-r--r--     root/root       usr/lib/libpthread.a
 lrwxrwxrwx     root/root       usr/lib/libpthread.so -> ../../lib/libpthread.so.0
 -rw-r--r--     root/root       usr/lib/libresolv.a
 lrwxrwxrwx     root/root       usr/lib/libresolv.so -> ../../lib/libresolv.so.2
--rw-r--r--     root/root       usr/lib/librpcsvc.a
 -rw-r--r--     root/root       usr/lib/librt.a
 lrwxrwxrwx     root/root       usr/lib/librt.so -> ../../lib/librt.so.1
 lrwxrwxrwx     root/root       usr/lib/libthread_db.so -> ../../lib/libthread_db.so.1
@@ -2082,6 +2044,7 @@ drwxr-xr-x        root/root       usr/share/i18n/locales/
 -rw-r--r--     root/root       usr/share/i18n/locales/ca_IT
 -rw-r--r--     root/root       usr/share/i18n/locales/ce_RU
 -rw-r--r--     root/root       usr/share/i18n/locales/chr_US
+-rw-r--r--     root/root       usr/share/i18n/locales/ckb_IQ
 -rw-r--r--     root/root       usr/share/i18n/locales/cmn_TW
 -rw-r--r--     root/root       usr/share/i18n/locales/cns11643_stroke
 -rw-r--r--     root/root       usr/share/i18n/locales/crh_UA
@@ -2244,6 +2207,7 @@ drwxr-xr-x        root/root       usr/share/i18n/locales/
 -rw-r--r--     root/root       usr/share/i18n/locales/ml_IN
 -rw-r--r--     root/root       usr/share/i18n/locales/mn_MN
 -rw-r--r--     root/root       usr/share/i18n/locales/mni_IN
+-rw-r--r--     root/root       usr/share/i18n/locales/mnw_MM
 -rw-r--r--     root/root       usr/share/i18n/locales/mr_IN
 -rw-r--r--     root/root       usr/share/i18n/locales/ms_MY
 -rw-r--r--     root/root       usr/share/i18n/locales/mt_MT
index a338028884c42271bfa2d34f1611c0532b12f155..9e08e0d5c86013f512fe646ec8678d03b2696993 100644 (file)
@@ -1,10 +1,10 @@
 untrusted comment: verify with /etc/ports/core-arm.pub
-RWTMGLGEHsm4decXIVo89LasHZiHw/yL9lE6CQrxx3EK5mtKxOCJFhhWgsku+4YnIS278aBgzBkFiESGUxg1mCZH1Ikvrb0VIAI=
-SHA256 (Pkgfile) = a7baaf2f7e4c9e7d79593ed728307041b4be20c4ec0cb8009fa5642c7ff50949
-SHA256 (.footprint) = 116810f28d935a528486f851c9de8df42c35e975e60bdcbaa581d6dd49bb2774
-SHA256 (glibc-2.28.tar.xz) = b1900051afad76f7a4f73e71413df4826dce085ef8ddb785a945b66d7d513082
+RWTMGLGEHsm4dQ1sQvzNQVbSAcFtuPgqVyfRrqmq7NTLtpYwuz7bjuRjFFuaiCULQ4WCPD+p+Tv48fKVCFqFbDaAvmXMKUaNZQ8=
+SHA256 (Pkgfile) = bc1e8a061e82732c2b74d15b66f60c0f96d14b8ee9e3f4e3d0063611d7c3c9f8
+SHA256 (.footprint) = e584ed06376090a7808a76598eaf8fa8a6491a721d31e6800e9506c81d1307b6
+SHA256 (glibc-2.32.tar.xz) = 1627ea54f5a1a8467032563393e0901077626dc66f37f10ee6363bb722222836
 SHA256 (linux-4.19.24.tar.xz) = 3bb1885fabd874b469a8ea19571c5a4ad5b6faa3cca1662137c57b40fcbf8e04
-SHA256 (glibc-2.28-1.patch) = 41330a0a3b419087be7574a2da4b6c8d0921fd256eeb0d3f572a2b539d6c80ad
+SHA256 (glibc-2.32-2.patch) = 7d0263f8683481df2af5e759f99e285a0bfeea330d4e613198c4580384fc44b0
 SHA256 (hosts) = 5c02b256c105f1d4a12fb738d71c1bab9eb126533074d7a0c8a14b92670c9431
 SHA256 (resolv.conf) = 72ccb58768a72a771ec37142bc361a18478a07ec9de6e925a20760794389bf51
 SHA256 (nsswitch.conf) = 859b8984e5e90aff3cce8f9779996ae4033b280d2122840e9411e2f44a1c2e61
index 5d825cfe65c756e2442f2b2c2a978d2db527b59b..be01fa8bdbf35a02227e9a66f70095e0f1b2a22f 100644 (file)
@@ -5,11 +5,11 @@
 # Depends on:
 
 name=glibc
-version=2.28
+version=2.32
 release=2
 source=(http://ftp.gnu.org/gnu/glibc/glibc-$version.tar.xz \
         http://www.kernel.org/pub/linux/kernel/v4.x/linux-4.19.24.tar.xz \
-        $name-$version-1.patch \
+        $name-$version-2.patch \
         hosts resolv.conf nsswitch.conf host.conf ld.so.conf)
 
 build() {
@@ -20,7 +20,7 @@ build() {
   make ARCH=arm INSTALL_HDR_PATH=$PKG/usr headers_install
   chown root:root $PKG/usr
 
-  patch -p1 -d $SRC/$name-${version:0:4} -i $SRC/$name-$version-1.patch
+  patch -p1 -d $SRC/$name-${version:0:4} -i $SRC/$name-$version-2.patch
 
   mkdir $SRC/build
   cd $SRC/build
@@ -32,8 +32,6 @@ build() {
                               --enable-add-ons \
                               --enable-static-nss \
                               --enable-stack-protector=strong \
-                              --enable-obsolete-rpc \
-                              --enable-obsolete-nsl \
                               --disable-profile \
                               --disable-werror \
                               --without-gd \
@@ -48,10 +46,6 @@ build() {
 
   install -m 0644 $SRC/{hosts,resolv.conf,nsswitch.conf,host.conf,ld.so.conf} $PKG/etc
 
-  # install needed headers
-  install -d $PKG/usr/include/rpcsvc
-  install -m 0644 $SRC/$name-${version:0:4}/nis/rpcsvc/yp* $PKG/usr/include/rpcsvc
-
   ln -sf ../usr/share/zoneinfo/UTC $PKG/etc/localtime
   ln -s stubs-hard.h $PKG/usr/include/gnu/stubs-soft.h
   install -d $PKG/etc/ld.so.conf.d $PKG/usr/lib/locale
diff --git a/glibc/glibc-2.28-1.patch b/glibc/glibc-2.28-1.patch
deleted file mode 100644 (file)
index 8de1ec7..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-diff --git a/sysdeps/unix/sysv/linux/aarch64/configure b/sysdeps/unix/sysv/linux/aarch64/configure
-index 27d50e1d3c..290670a67a 100644
---- a/sysdeps/unix/sysv/linux/aarch64/configure
-+++ b/sysdeps/unix/sysv/linux/aarch64/configure
-@@ -6,10 +6,10 @@ arch_minimum_kernel=3.7.0
- test -n "$libc_cv_slibdir" ||
- case "$prefix" in
- /usr | /usr/)
--  libc_cv_slibdir='/lib64'
-+  libc_cv_slibdir='/lib'
-   libc_cv_rtlddir='/lib'
-   if test "$libdir" = '${exec_prefix}/lib'; then
--    libdir='${exec_prefix}/lib64';
-+    libdir='${exec_prefix}/lib';
-     # Locale data can be shared between 32-bit and 64-bit libraries.
-     libc_cv_complocaledir='${exec_prefix}/lib/locale'
-   fi
-diff --git a/sysdeps/unix/sysv/linux/x86_64/64/configure b/sysdeps/unix/sysv/linux/x86_64/64/configure
-index 9d298faba7..cef1ec842c 100644
---- a/sysdeps/unix/sysv/linux/x86_64/64/configure
-+++ b/sysdeps/unix/sysv/linux/x86_64/64/configure
-@@ -4,10 +4,10 @@
- test -n "$libc_cv_slibdir" ||
- case "$prefix" in
- /usr | /usr/)
--  libc_cv_slibdir='/lib64'
--  libc_cv_rtlddir='/lib64'
-+  libc_cv_slibdir='/lib'
-+  libc_cv_rtlddir='/lib'
-   if test "$libdir" = '${exec_prefix}/lib'; then
--    libdir='${exec_prefix}/lib64';
-+    libdir='${exec_prefix}/lib';
-     # Locale data can be shared between 32-bit and 64-bit libraries.
-     libc_cv_complocaledir='${exec_prefix}/lib/locale'
-   fi
-diff --git a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
-index c7e9ad674d..cd47995d4a 100644
---- a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
-+++ b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
-@@ -18,9 +18,9 @@
- #include <sysdeps/generic/ldconfig.h>
- #define SYSDEP_KNOWN_INTERPRETER_NAMES \
--  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 }, \
-+  { "/lib32/ld-linux.so.2", FLAG_ELF_LIBC6 }, \
-   { "/libx32/ld-linux-x32.so.2", FLAG_ELF_LIBC6 }, \
--  { "/lib64/ld-linux-x86-64.so.2", FLAG_ELF_LIBC6 },
-+  { "/lib/ld-linux-x86-64.so.2", FLAG_ELF_LIBC6 },
- #define SYSDEP_KNOWN_LIBRARY_NAMES \
-   { "libc.so.6", FLAG_ELF_LIBC6 },    \
-   { "libm.so.6", FLAG_ELF_LIBC6 },
-diff --git a/sysdeps/unix/sysv/linux/x86_64/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/x86_64/ldd-rewrite.sed
-index 44d76e8aa1..7d6cb1e20b 100644
---- a/sysdeps/unix/sysv/linux/x86_64/ldd-rewrite.sed
-+++ b/sysdeps/unix/sysv/linux/x86_64/ldd-rewrite.sed
-@@ -1,3 +1,3 @@
- /LD_TRACE_LOADED_OBJECTS=1/a\
- add_env="$add_env LD_LIBRARY_VERSION=\\$verify_out"
--s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|x32\)\(/[^/]*\)\(-x86-64\|-x32\)\(\.so\.[0-9.]*\)[   ]*$_\1"\2\4\6 \264\4-x86-64\6 \2x32\4-x32\6"_
-+s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|x32\)\(/[^/]*\)\(-x86-64\|-x32\)\(\.so\.[0-9.]*\)[    ]*$_\1"\232\4\6 \2\4-x86-64\6 \2x32\4-x32\6"_
diff --git a/glibc/glibc-2.32-2.patch b/glibc/glibc-2.32-2.patch
new file mode 100755 (executable)
index 0000000..53476d2
--- /dev/null
@@ -0,0 +1,2779 @@
+diff --git a/NEWS b/NEWS
+index 485b8ddffa..3030735839 100644
+--- a/NEWS
++++ b/NEWS
+@@ -5,6 +5,17 @@ See the end for copying conditions.
+ Please send GNU C library bug reports via <https://sourceware.org/bugzilla/>
+ using `glibc' in the "product" field.
\f
++The following bugs are resolved with this release:
++
++  [26534] libm.so 2.32 SIGILL in pow() due to FMA4 instruction on non-FMA4
++    system
++  [26555] string: strerrorname_np does not return the documented value
++  [26636] libc: 32-bit shmctl(IPC_INFO) crashes when shminfo struct is
++    at the end of a memory mapping
++  [26637] libc: semctl SEM_STAT_ANY fails to pass the buffer specified
++    by the caller to the kernel
++  [26639] libc: msgctl IPC_INFO and MSG_INFO return garbage
++
+ Version 2.32
+ Major new features:
+diff --git a/iconv/Versions b/iconv/Versions
+index 8a5f4cf780..d51af52fa3 100644
+--- a/iconv/Versions
++++ b/iconv/Versions
+@@ -6,7 +6,9 @@ libc {
+   GLIBC_PRIVATE {
+     # functions shared with iconv program
+     __gconv_get_alias_db; __gconv_get_cache; __gconv_get_modules_db;
+-    __gconv_open; __gconv_create_spec;
++
++    # functions used elsewhere in glibc
++    __gconv_open; __gconv_create_spec; __gconv_destroy_spec;
+     # function used by the gconv modules
+     __gconv_transliterate;
+diff --git a/iconv/gconv_charset.c b/iconv/gconv_charset.c
+index 6ccd0773cc..4ba0aa99f5 100644
+--- a/iconv/gconv_charset.c
++++ b/iconv/gconv_charset.c
+@@ -216,3 +216,13 @@ out:
+   return ret;
+ }
+ libc_hidden_def (__gconv_create_spec)
++
++
++void
++__gconv_destroy_spec (struct gconv_spec *conv_spec)
++{
++  free (conv_spec->fromcode);
++  free (conv_spec->tocode);
++  return;
++}
++libc_hidden_def (__gconv_destroy_spec)
+diff --git a/iconv/gconv_charset.h b/iconv/gconv_charset.h
+index b39b09aea1..e9c122cf7e 100644
+--- a/iconv/gconv_charset.h
++++ b/iconv/gconv_charset.h
+@@ -48,33 +48,6 @@
+ #define GCONV_IGNORE_ERRORS_SUFFIX "IGNORE"
+-/* This function accepts the charset names of the source and destination of the
+-   conversion and populates *conv_spec with an equivalent conversion
+-   specification that may later be used by __gconv_open.  The charset names
+-   might contain options in the form of suffixes that alter the conversion,
+-   e.g. "ISO-10646/UTF-8/TRANSLIT".  It processes the charset names, ignoring
+-   and truncating any suffix options in fromcode, and processing and truncating
+-   any suffix options in tocode.  Supported suffix options ("TRANSLIT" or
+-   "IGNORE") when found in tocode lead to the corresponding flag in *conv_spec
+-   to be set to true.  Unrecognized suffix options are silently discarded.  If
+-   the function succeeds, it returns conv_spec back to the caller.  It returns
+-   NULL upon failure.  */
+-struct gconv_spec *
+-__gconv_create_spec (struct gconv_spec *conv_spec, const char *fromcode,
+-                     const char *tocode);
+-libc_hidden_proto (__gconv_create_spec)
+-
+-
+-/* This function frees all heap memory allocated by __gconv_create_spec.  */
+-static void __attribute__ ((unused))
+-gconv_destroy_spec (struct gconv_spec *conv_spec)
+-{
+-  free (conv_spec->fromcode);
+-  free (conv_spec->tocode);
+-  return;
+-}
+-
+-
+ /* This function copies in-order, characters from the source 's' that are
+    either alpha-numeric or one in one of these: "_-.,:/" - into the destination
+    'wp' while dropping all other characters.  In the process, it converts all
+diff --git a/iconv/gconv_int.h b/iconv/gconv_int.h
+index e86938dae7..f721ce30ff 100644
+--- a/iconv/gconv_int.h
++++ b/iconv/gconv_int.h
+@@ -152,6 +152,27 @@ extern int __gconv_open (struct gconv_spec *conv_spec,
+                          __gconv_t *handle, int flags);
+ libc_hidden_proto (__gconv_open)
++/* This function accepts the charset names of the source and destination of the
++   conversion and populates *conv_spec with an equivalent conversion
++   specification that may later be used by __gconv_open.  The charset names
++   might contain options in the form of suffixes that alter the conversion,
++   e.g. "ISO-10646/UTF-8/TRANSLIT".  It processes the charset names, ignoring
++   and truncating any suffix options in fromcode, and processing and truncating
++   any suffix options in tocode.  Supported suffix options ("TRANSLIT" or
++   "IGNORE") when found in tocode lead to the corresponding flag in *conv_spec
++   to be set to true.  Unrecognized suffix options are silently discarded.  If
++   the function succeeds, it returns conv_spec back to the caller.  It returns
++   NULL upon failure.  */
++extern struct gconv_spec *
++__gconv_create_spec (struct gconv_spec *conv_spec, const char *fromcode,
++                     const char *tocode);
++libc_hidden_proto (__gconv_create_spec)
++
++/* This function frees all heap memory allocated by __gconv_create_spec.  */
++extern void
++__gconv_destroy_spec (struct gconv_spec *conv_spec);
++libc_hidden_proto (__gconv_destroy_spec)
++
+ /* Free resources associated with transformation descriptor CD.  */
+ extern int __gconv_close (__gconv_t cd)
+      attribute_hidden;
+diff --git a/iconv/iconv_open.c b/iconv/iconv_open.c
+index dd54bc12e0..5b30055c04 100644
+--- a/iconv/iconv_open.c
++++ b/iconv/iconv_open.c
+@@ -39,7 +39,7 @@ iconv_open (const char *tocode, const char *fromcode)
+   int res = __gconv_open (&conv_spec, &cd, 0);
+-  gconv_destroy_spec (&conv_spec);
++  __gconv_destroy_spec (&conv_spec);
+   if (__builtin_expect (res, __GCONV_OK) != __GCONV_OK)
+     {
+diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c
+index b4334faa57..d59979759c 100644
+--- a/iconv/iconv_prog.c
++++ b/iconv/iconv_prog.c
+@@ -184,7 +184,7 @@ main (int argc, char *argv[])
+       /* Let's see whether we have these coded character sets.  */
+       res = __gconv_open (&conv_spec, &cd, 0);
+-      gconv_destroy_spec (&conv_spec);
++      __gconv_destroy_spec (&conv_spec);
+       if (res != __GCONV_OK)
+       {
+diff --git a/intl/dcigettext.c b/intl/dcigettext.c
+index 2e7c662bc7..bd332e71da 100644
+--- a/intl/dcigettext.c
++++ b/intl/dcigettext.c
+@@ -1120,15 +1120,18 @@ _nl_find_msg (struct loaded_l10nfile *domain_file,
+ # ifdef _LIBC
+-                    struct gconv_spec conv_spec
+-                      = { .fromcode = norm_add_slashes (charset, ""),
+-                          .tocode = norm_add_slashes (outcharset, ""),
+-                          /* We always want to use transliteration.  */
+-                          .translit = true,
+-                          .ignore = false
+-                        };
++                    struct gconv_spec conv_spec;
++
++                      __gconv_create_spec (&conv_spec, charset, outcharset);
++
++                    /* We always want to use transliteration.  */
++                      conv_spec.translit = true;
++
+                     int r = __gconv_open (&conv_spec, &convd->conv,
+                                           GCONV_AVOID_NOCONV);
++
++                      __gconv_destroy_spec (&conv_spec);
++
+                     if (__builtin_expect (r != __GCONV_OK, 0))
+                       {
+                         /* If the output encoding is the same there is
+diff --git a/intl/tst-codeset.c b/intl/tst-codeset.c
+index fd70432eca..e9f6e5e09f 100644
+--- a/intl/tst-codeset.c
++++ b/intl/tst-codeset.c
+@@ -22,13 +22,11 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
++#include <support/check.h>
+ static int
+ do_test (void)
+ {
+-  char *s;
+-  int result = 0;
+-
+   unsetenv ("LANGUAGE");
+   unsetenv ("OUTPUT_CHARSET");
+   setlocale (LC_ALL, "de_DE.ISO-8859-1");
+@@ -36,25 +34,21 @@ do_test (void)
+   bindtextdomain ("codeset", OBJPFX "domaindir");
+   /* Here we expect output in ISO-8859-1.  */
+-  s = gettext ("cheese");
+-  if (strcmp (s, "K\344se"))
+-    {
+-      printf ("call 1 returned: %s\n", s);
+-      result = 1;
+-    }
++  TEST_COMPARE_STRING (gettext ("cheese"), "K\344se");
++  /* Here we expect output in UTF-8.  */
+   bind_textdomain_codeset ("codeset", "UTF-8");
++  TEST_COMPARE_STRING (gettext ("cheese"), "K\303\244se");
+-  /* Here we expect output in UTF-8.  */
+-  s = gettext ("cheese");
+-  if (strcmp (s, "K\303\244se"))
+-    {
+-      printf ("call 2 returned: %s\n", s);
+-      result = 1;
+-    }
+-
+-  return result;
++  /* `a with umlaut' is transliterated to `ae'.  */
++  bind_textdomain_codeset ("codeset", "ASCII//TRANSLIT");
++  TEST_COMPARE_STRING (gettext ("cheese"), "Kaese");
++
++  /* Transliteration also works by default even if not set.  */
++  bind_textdomain_codeset ("codeset", "ASCII");
++  TEST_COMPARE_STRING (gettext ("cheese"), "Kaese");
++
++  return 0;
+ }
+-#define TEST_FUNCTION do_test ()
+-#include "../test-skeleton.c"
++#include <support/test-driver.c>
+diff --git a/stdio-common/Makefile b/stdio-common/Makefile
+index 8475fd1f09..eff0c98d82 100644
+--- a/stdio-common/Makefile
++++ b/stdio-common/Makefile
+@@ -69,7 +69,8 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
+        tst-printf-bz25691 \
+        tst-vfprintf-width-prec-alloc \
+        tst-printf-fp-free \
+-       tst-printf-fp-leak
++       tst-printf-fp-leak \
++       test-strerr
+ test-srcs = tst-unbputc tst-printf tst-printfsz-islongdouble
+diff --git a/stdio-common/errlist.c b/stdio-common/errlist.c
+index d15f13a22a..2ecf121674 100644
+--- a/stdio-common/errlist.c
++++ b/stdio-common/errlist.c
+@@ -20,9 +20,13 @@
+ #include <libintl.h>
+ #include <array_length.h>
++#ifndef ERR_MAP
++# define ERR_MAP(n) n
++#endif
++
+ const char *const _sys_errlist_internal[] =
+   {
+-#define _S(n, str)         [n] = str,
++#define _S(n, str)         [ERR_MAP(n)] = str,
+ #include <errlist.h>
+ #undef _S
+   };
+@@ -41,20 +45,21 @@ static const union sys_errname_t
+   {
+ #define MSGSTRFIELD1(line) str##line
+ #define MSGSTRFIELD(line)  MSGSTRFIELD1(line)
+-#define _S(n, str)         char MSGSTRFIELD(__LINE__)[sizeof(str)];
++#define _S(n, str)         char MSGSTRFIELD(__LINE__)[sizeof(#n)];
+ #include <errlist.h>
+ #undef _S
+   };
+   char str[0];
+ } _sys_errname = { {
+-#define _S(n, s) s,
++#define _S(n, s) #n,
+ #include <errlist.h>
+ #undef _S
+ } };
+ static const unsigned short _sys_errnameidx[] =
+ {
+-#define _S(n, s) [n] = offsetof(union sys_errname_t, MSGSTRFIELD(__LINE__)),
++#define _S(n, s) \
++  [ERR_MAP(n)] = offsetof(union sys_errname_t, MSGSTRFIELD(__LINE__)),
+ #include <errlist.h>
+ #undef _S
+ };
+diff --git a/stdio-common/test-strerr.c b/stdio-common/test-strerr.c
+index fded208118..d77b81d507 100644
+--- a/stdio-common/test-strerr.c
++++ b/stdio-common/test-strerr.c
+@@ -18,46 +18,672 @@
+ #include <string.h>
+ #include <errno.h>
+-#include <array_length.h>
+ #include <support/support.h>
+ #include <support/check.h>
+-#define N_(name)      name
+-
+-static const char *const errlist[] =
+-  {
+-/* This file is auto-generated from errlist.def.  */
+-#include <errlist.h>
+-  };
+-
+-#define MSGSTR_T errname_t
+-#define MSGSTR   errname
+-#define MSGIDX   errnameidx
+-#include <errlist-name.h>
+-#undef MSGSTR
+-#undef MSGIDX
+-
+ static int
+ do_test (void)
+ {
+-  TEST_VERIFY (strerrordesc_np (-1) == NULL);
+-  TEST_VERIFY (strerrordesc_np (array_length (errlist)) == NULL);
+-  for (size_t i = 0; i < array_length (errlist); i++)
+-    {
+-      if (errlist[i] == NULL)
+-        continue;
+-      TEST_COMPARE_STRING (strerrordesc_np (i), errlist[i]);
+-    }
++  TEST_COMPARE_STRING (strerrordesc_np (0), "Success");
++  TEST_COMPARE_STRING (strerrorname_np (0), "0");
+-  TEST_VERIFY (strerrorname_np (-1) == NULL);
+-  TEST_VERIFY (strerrorname_np (array_length (errlist)) == NULL);
+-  for (size_t i = 0; i < array_length (errlist); i++)
+-    {
+-      if (errlist[i] == NULL)
+-        continue;
+-      TEST_COMPARE_STRING (strerrorname_np (i), errname.str + errnameidx[i]);
+-    }
++#ifdef EPERM
++  TEST_COMPARE_STRING (strerrordesc_np (EPERM), "Operation not permitted");
++  TEST_COMPARE_STRING (strerrorname_np (EPERM), "EPERM");
++#endif
++#ifdef ENOENT
++  TEST_COMPARE_STRING (strerrordesc_np (ENOENT),
++                     "No such file or directory");
++  TEST_COMPARE_STRING (strerrorname_np (ENOENT), "ENOENT");
++#endif
++#ifdef ESRCH
++  TEST_COMPARE_STRING (strerrordesc_np (ESRCH), "No such process");
++  TEST_COMPARE_STRING (strerrorname_np (ESRCH), "ESRCH");
++#endif
++#ifdef EINTR
++  TEST_COMPARE_STRING (strerrordesc_np (EINTR), "Interrupted system call");
++  TEST_COMPARE_STRING (strerrorname_np (EINTR), "EINTR");
++#endif
++#ifdef EIO
++  TEST_COMPARE_STRING (strerrordesc_np (EIO), "Input/output error");
++  TEST_COMPARE_STRING (strerrorname_np (EIO), "EIO");
++#endif
++#ifdef ENXIO
++  TEST_COMPARE_STRING (strerrordesc_np (ENXIO), "No such device or address");
++  TEST_COMPARE_STRING (strerrorname_np (ENXIO), "ENXIO");
++#endif
++#ifdef E2BIG
++  TEST_COMPARE_STRING (strerrordesc_np (E2BIG), "Argument list too long");
++  TEST_COMPARE_STRING (strerrorname_np (E2BIG), "E2BIG");
++#endif
++#ifdef ENOEXEC
++  TEST_COMPARE_STRING (strerrordesc_np (ENOEXEC), "Exec format error");
++  TEST_COMPARE_STRING (strerrorname_np (ENOEXEC), "ENOEXEC");
++#endif
++#ifdef EBADF
++  TEST_COMPARE_STRING (strerrordesc_np (EBADF), "Bad file descriptor");
++  TEST_COMPARE_STRING (strerrorname_np (EBADF), "EBADF");
++#endif
++#ifdef ECHILD
++  TEST_COMPARE_STRING (strerrordesc_np (ECHILD), "No child processes");
++  TEST_COMPARE_STRING (strerrorname_np (ECHILD), "ECHILD");
++#endif
++#ifdef EDEADLK
++  TEST_COMPARE_STRING (strerrordesc_np (EDEADLK),
++                     "Resource deadlock avoided");
++  TEST_COMPARE_STRING (strerrorname_np (EDEADLK), "EDEADLK");
++#endif
++#ifdef ENOMEM
++  TEST_COMPARE_STRING (strerrordesc_np (ENOMEM), "Cannot allocate memory");
++  TEST_COMPARE_STRING (strerrorname_np (ENOMEM), "ENOMEM");
++#endif
++#ifdef EACCES
++  TEST_COMPARE_STRING (strerrordesc_np (EACCES), "Permission denied");
++  TEST_COMPARE_STRING (strerrorname_np (EACCES), "EACCES");
++#endif
++#ifdef EFAULT
++  TEST_COMPARE_STRING (strerrordesc_np (EFAULT), "Bad address");
++  TEST_COMPARE_STRING (strerrorname_np (EFAULT), "EFAULT");
++#endif
++#ifdef ENOTBLK
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTBLK), "Block device required");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTBLK), "ENOTBLK");
++#endif
++#ifdef EBUSY
++  TEST_COMPARE_STRING (strerrordesc_np (EBUSY), "Device or resource busy");
++  TEST_COMPARE_STRING (strerrorname_np (EBUSY), "EBUSY");
++#endif
++#ifdef EEXIST
++  TEST_COMPARE_STRING (strerrordesc_np (EEXIST), "File exists");
++  TEST_COMPARE_STRING (strerrorname_np (EEXIST), "EEXIST");
++#endif
++#ifdef EXDEV
++  TEST_COMPARE_STRING (strerrordesc_np (EXDEV), "Invalid cross-device link");
++  TEST_COMPARE_STRING (strerrorname_np (EXDEV), "EXDEV");
++#endif
++#ifdef ENODEV
++  TEST_COMPARE_STRING (strerrordesc_np (ENODEV), "No such device");
++  TEST_COMPARE_STRING (strerrorname_np (ENODEV), "ENODEV");
++#endif
++#ifdef ENOTDIR
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTDIR), "Not a directory");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTDIR), "ENOTDIR");
++#endif
++#ifdef EISDIR
++  TEST_COMPARE_STRING (strerrordesc_np (EISDIR), "Is a directory");
++  TEST_COMPARE_STRING (strerrorname_np (EISDIR), "EISDIR");
++#endif
++#ifdef EINVAL
++  TEST_COMPARE_STRING (strerrordesc_np (EINVAL), "Invalid argument");
++  TEST_COMPARE_STRING (strerrorname_np (EINVAL), "EINVAL");
++#endif
++#ifdef EMFILE
++  TEST_COMPARE_STRING (strerrordesc_np (EMFILE), "Too many open files");
++  TEST_COMPARE_STRING (strerrorname_np (EMFILE), "EMFILE");
++#endif
++#ifdef ENFILE
++  TEST_COMPARE_STRING (strerrordesc_np (ENFILE),
++                     "Too many open files in system");
++  TEST_COMPARE_STRING (strerrorname_np (ENFILE), "ENFILE");
++#endif
++#ifdef ENOTTY
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTTY),
++                     "Inappropriate ioctl for device");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTTY), "ENOTTY");
++#endif
++#ifdef ETXTBSY
++  TEST_COMPARE_STRING (strerrordesc_np (ETXTBSY), "Text file busy");
++  TEST_COMPARE_STRING (strerrorname_np (ETXTBSY), "ETXTBSY");
++#endif
++#ifdef EFBIG
++  TEST_COMPARE_STRING (strerrordesc_np (EFBIG), "File too large");
++  TEST_COMPARE_STRING (strerrorname_np (EFBIG), "EFBIG");
++#endif
++#ifdef ENOSPC
++  TEST_COMPARE_STRING (strerrordesc_np (ENOSPC), "No space left on device");
++  TEST_COMPARE_STRING (strerrorname_np (ENOSPC), "ENOSPC");
++#endif
++#ifdef ESPIPE
++  TEST_COMPARE_STRING (strerrordesc_np (ESPIPE), "Illegal seek");
++  TEST_COMPARE_STRING (strerrorname_np (ESPIPE), "ESPIPE");
++#endif
++#ifdef EROFS
++  TEST_COMPARE_STRING (strerrordesc_np (EROFS), "Read-only file system");
++  TEST_COMPARE_STRING (strerrorname_np (EROFS), "EROFS");
++#endif
++#ifdef EMLINK
++  TEST_COMPARE_STRING (strerrordesc_np (EMLINK), "Too many links");
++  TEST_COMPARE_STRING (strerrorname_np (EMLINK), "EMLINK");
++#endif
++#ifdef EPIPE
++  TEST_COMPARE_STRING (strerrordesc_np (EPIPE), "Broken pipe");
++  TEST_COMPARE_STRING (strerrorname_np (EPIPE), "EPIPE");
++#endif
++#ifdef EDOM
++  TEST_COMPARE_STRING (strerrordesc_np (EDOM),
++                     "Numerical argument out of domain");
++  TEST_COMPARE_STRING (strerrorname_np (EDOM), "EDOM");
++#endif
++#ifdef ERANGE
++  TEST_COMPARE_STRING (strerrordesc_np (ERANGE),
++                     "Numerical result out of range");
++  TEST_COMPARE_STRING (strerrorname_np (ERANGE), "ERANGE");
++#endif
++#ifdef EAGAIN
++  TEST_COMPARE_STRING (strerrordesc_np (EAGAIN),
++                     "Resource temporarily unavailable");
++  TEST_COMPARE_STRING (strerrorname_np (EAGAIN), "EAGAIN");
++#endif
++#ifdef EINPROGRESS
++  TEST_COMPARE_STRING (strerrordesc_np (EINPROGRESS),
++                     "Operation now in progress");
++  TEST_COMPARE_STRING (strerrorname_np (EINPROGRESS), "EINPROGRESS");
++#endif
++#ifdef EALREADY
++  TEST_COMPARE_STRING (strerrordesc_np (EALREADY),
++                     "Operation already in progress");
++  TEST_COMPARE_STRING (strerrorname_np (EALREADY), "EALREADY");
++#endif
++#ifdef ENOTSOCK
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTSOCK),
++                     "Socket operation on non-socket");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTSOCK), "ENOTSOCK");
++#endif
++#ifdef EMSGSIZE
++  TEST_COMPARE_STRING (strerrordesc_np (EMSGSIZE), "Message too long");
++  TEST_COMPARE_STRING (strerrorname_np (EMSGSIZE), "EMSGSIZE");
++#endif
++#ifdef EPROTOTYPE
++  TEST_COMPARE_STRING (strerrordesc_np (EPROTOTYPE),
++                     "Protocol wrong type for socket");
++  TEST_COMPARE_STRING (strerrorname_np (EPROTOTYPE), "EPROTOTYPE");
++#endif
++#ifdef ENOPROTOOPT
++  TEST_COMPARE_STRING (strerrordesc_np (ENOPROTOOPT),
++                     "Protocol not available");
++  TEST_COMPARE_STRING (strerrorname_np (ENOPROTOOPT), "ENOPROTOOPT");
++#endif
++#ifdef EPROTONOSUPPORT
++  TEST_COMPARE_STRING (strerrordesc_np (EPROTONOSUPPORT),
++                     "Protocol not supported");
++  TEST_COMPARE_STRING (strerrorname_np (EPROTONOSUPPORT), "EPROTONOSUPPORT");
++#endif
++#ifdef ESOCKTNOSUPPORT
++  TEST_COMPARE_STRING (strerrordesc_np (ESOCKTNOSUPPORT),
++                     "Socket type not supported");
++  TEST_COMPARE_STRING (strerrorname_np (ESOCKTNOSUPPORT), "ESOCKTNOSUPPORT");
++#endif
++#ifdef EOPNOTSUPP
++  TEST_COMPARE_STRING (strerrordesc_np (EOPNOTSUPP),
++                     "Operation not supported");
++  TEST_COMPARE_STRING (strerrorname_np (EOPNOTSUPP), "EOPNOTSUPP");
++#endif
++#ifdef EPFNOSUPPORT
++  TEST_COMPARE_STRING (strerrordesc_np (EPFNOSUPPORT),
++                     "Protocol family not supported");
++  TEST_COMPARE_STRING (strerrorname_np (EPFNOSUPPORT), "EPFNOSUPPORT");
++#endif
++#ifdef EAFNOSUPPORT
++  TEST_COMPARE_STRING (strerrordesc_np (EAFNOSUPPORT),
++                     "Address family not supported by protocol");
++  TEST_COMPARE_STRING (strerrorname_np (EAFNOSUPPORT), "EAFNOSUPPORT");
++#endif
++#ifdef EADDRINUSE
++  TEST_COMPARE_STRING (strerrordesc_np (EADDRINUSE),
++                     "Address already in use");
++  TEST_COMPARE_STRING (strerrorname_np (EADDRINUSE), "EADDRINUSE");
++#endif
++#ifdef EADDRNOTAVAIL
++  TEST_COMPARE_STRING (strerrordesc_np (EADDRNOTAVAIL),
++                     "Cannot assign requested address");
++  TEST_COMPARE_STRING (strerrorname_np (EADDRNOTAVAIL), "EADDRNOTAVAIL");
++#endif
++#ifdef ENETDOWN
++  TEST_COMPARE_STRING (strerrordesc_np (ENETDOWN), "Network is down");
++  TEST_COMPARE_STRING (strerrorname_np (ENETDOWN), "ENETDOWN");
++#endif
++#ifdef ENETUNREACH
++  TEST_COMPARE_STRING (strerrordesc_np (ENETUNREACH),
++                     "Network is unreachable");
++  TEST_COMPARE_STRING (strerrorname_np (ENETUNREACH), "ENETUNREACH");
++#endif
++#ifdef ENETRESET
++  TEST_COMPARE_STRING (strerrordesc_np (ENETRESET),
++                     "Network dropped connection on reset");
++  TEST_COMPARE_STRING (strerrorname_np (ENETRESET), "ENETRESET");
++#endif
++#ifdef ECONNABORTED
++  TEST_COMPARE_STRING (strerrordesc_np (ECONNABORTED),
++                     "Software caused connection abort");
++  TEST_COMPARE_STRING (strerrorname_np (ECONNABORTED), "ECONNABORTED");
++#endif
++#ifdef ECONNRESET
++  TEST_COMPARE_STRING (strerrordesc_np (ECONNRESET),
++                     "Connection reset by peer");
++  TEST_COMPARE_STRING (strerrorname_np (ECONNRESET), "ECONNRESET");
++#endif
++#ifdef ENOBUFS
++  TEST_COMPARE_STRING (strerrordesc_np (ENOBUFS),
++                     "No buffer space available");
++  TEST_COMPARE_STRING (strerrorname_np (ENOBUFS), "ENOBUFS");
++#endif
++#ifdef EISCONN
++  TEST_COMPARE_STRING (strerrordesc_np (EISCONN),
++                     "Transport endpoint is already connected");
++  TEST_COMPARE_STRING (strerrorname_np (EISCONN), "EISCONN");
++#endif
++#ifdef ENOTCONN
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTCONN),
++                     "Transport endpoint is not connected");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTCONN), "ENOTCONN");
++#endif
++#ifdef EDESTADDRREQ
++  TEST_COMPARE_STRING (strerrordesc_np (EDESTADDRREQ),
++                     "Destination address required");
++  TEST_COMPARE_STRING (strerrorname_np (EDESTADDRREQ), "EDESTADDRREQ");
++#endif
++#ifdef ESHUTDOWN
++  TEST_COMPARE_STRING (strerrordesc_np (ESHUTDOWN),
++                     "Cannot send after transport endpoint shutdown");
++  TEST_COMPARE_STRING (strerrorname_np (ESHUTDOWN), "ESHUTDOWN");
++#endif
++#ifdef ETOOMANYREFS
++  TEST_COMPARE_STRING (strerrordesc_np (ETOOMANYREFS),
++                     "Too many references: cannot splice");
++  TEST_COMPARE_STRING (strerrorname_np (ETOOMANYREFS), "ETOOMANYREFS");
++#endif
++#ifdef ETIMEDOUT
++  TEST_COMPARE_STRING (strerrordesc_np (ETIMEDOUT), "Connection timed out");
++  TEST_COMPARE_STRING (strerrorname_np (ETIMEDOUT), "ETIMEDOUT");
++#endif
++#ifdef ECONNREFUSED
++  TEST_COMPARE_STRING (strerrordesc_np (ECONNREFUSED), "Connection refused");
++  TEST_COMPARE_STRING (strerrorname_np (ECONNREFUSED), "ECONNREFUSED");
++#endif
++#ifdef ELOOP
++  TEST_COMPARE_STRING (strerrordesc_np (ELOOP),
++                     "Too many levels of symbolic links");
++  TEST_COMPARE_STRING (strerrorname_np (ELOOP), "ELOOP");
++#endif
++#ifdef ENAMETOOLONG
++  TEST_COMPARE_STRING (strerrordesc_np (ENAMETOOLONG), "File name too long");
++  TEST_COMPARE_STRING (strerrorname_np (ENAMETOOLONG), "ENAMETOOLONG");
++#endif
++#ifdef EHOSTDOWN
++  TEST_COMPARE_STRING (strerrordesc_np (EHOSTDOWN), "Host is down");
++  TEST_COMPARE_STRING (strerrorname_np (EHOSTDOWN), "EHOSTDOWN");
++#endif
++#ifdef EHOSTUNREACH
++  TEST_COMPARE_STRING (strerrordesc_np (EHOSTUNREACH), "No route to host");
++  TEST_COMPARE_STRING (strerrorname_np (EHOSTUNREACH), "EHOSTUNREACH");
++#endif
++#ifdef ENOTEMPTY
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTEMPTY), "Directory not empty");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTEMPTY), "ENOTEMPTY");
++#endif
++#ifdef EUSERS
++  TEST_COMPARE_STRING (strerrordesc_np (EUSERS), "Too many users");
++  TEST_COMPARE_STRING (strerrorname_np (EUSERS), "EUSERS");
++#endif
++#ifdef EDQUOT
++  TEST_COMPARE_STRING (strerrordesc_np (EDQUOT), "Disk quota exceeded");
++  TEST_COMPARE_STRING (strerrorname_np (EDQUOT), "EDQUOT");
++#endif
++#ifdef ESTALE
++  TEST_COMPARE_STRING (strerrordesc_np (ESTALE), "Stale file handle");
++  TEST_COMPARE_STRING (strerrorname_np (ESTALE), "ESTALE");
++#endif
++#ifdef EREMOTE
++  TEST_COMPARE_STRING (strerrordesc_np (EREMOTE), "Object is remote");
++  TEST_COMPARE_STRING (strerrorname_np (EREMOTE), "EREMOTE");
++#endif
++#ifdef ENOLCK
++  TEST_COMPARE_STRING (strerrordesc_np (ENOLCK), "No locks available");
++  TEST_COMPARE_STRING (strerrorname_np (ENOLCK), "ENOLCK");
++#endif
++#ifdef ENOSYS
++  TEST_COMPARE_STRING (strerrordesc_np (ENOSYS), "Function not implemented");
++  TEST_COMPARE_STRING (strerrorname_np (ENOSYS), "ENOSYS");
++#endif
++#ifdef EILSEQ
++  TEST_COMPARE_STRING (strerrordesc_np (EILSEQ),
++                     "Invalid or incomplete multibyte or wide character");
++  TEST_COMPARE_STRING (strerrorname_np (EILSEQ), "EILSEQ");
++#endif
++#ifdef EBADMSG
++  TEST_COMPARE_STRING (strerrordesc_np (EBADMSG), "Bad message");
++  TEST_COMPARE_STRING (strerrorname_np (EBADMSG), "EBADMSG");
++#endif
++#ifdef EIDRM
++  TEST_COMPARE_STRING (strerrordesc_np (EIDRM), "Identifier removed");
++  TEST_COMPARE_STRING (strerrorname_np (EIDRM), "EIDRM");
++#endif
++#ifdef EMULTIHOP
++  TEST_COMPARE_STRING (strerrordesc_np (EMULTIHOP), "Multihop attempted");
++  TEST_COMPARE_STRING (strerrorname_np (EMULTIHOP), "EMULTIHOP");
++#endif
++#ifdef ENODATA
++  TEST_COMPARE_STRING (strerrordesc_np (ENODATA), "No data available");
++  TEST_COMPARE_STRING (strerrorname_np (ENODATA), "ENODATA");
++#endif
++#ifdef ENOLINK
++  TEST_COMPARE_STRING (strerrordesc_np (ENOLINK), "Link has been severed");
++  TEST_COMPARE_STRING (strerrorname_np (ENOLINK), "ENOLINK");
++#endif
++#ifdef ENOMSG
++  TEST_COMPARE_STRING (strerrordesc_np (ENOMSG),
++                     "No message of desired type");
++  TEST_COMPARE_STRING (strerrorname_np (ENOMSG), "ENOMSG");
++#endif
++#ifdef ENOSR
++  TEST_COMPARE_STRING (strerrordesc_np (ENOSR), "Out of streams resources");
++  TEST_COMPARE_STRING (strerrorname_np (ENOSR), "ENOSR");
++#endif
++#ifdef ENOSTR
++  TEST_COMPARE_STRING (strerrordesc_np (ENOSTR), "Device not a stream");
++  TEST_COMPARE_STRING (strerrorname_np (ENOSTR), "ENOSTR");
++#endif
++#ifdef EOVERFLOW
++  TEST_COMPARE_STRING (strerrordesc_np (EOVERFLOW),
++                     "Value too large for defined data type");
++  TEST_COMPARE_STRING (strerrorname_np (EOVERFLOW), "EOVERFLOW");
++#endif
++#ifdef EPROTO
++  TEST_COMPARE_STRING (strerrordesc_np (EPROTO), "Protocol error");
++  TEST_COMPARE_STRING (strerrorname_np (EPROTO), "EPROTO");
++#endif
++#ifdef ETIME
++  TEST_COMPARE_STRING (strerrordesc_np (ETIME), "Timer expired");
++  TEST_COMPARE_STRING (strerrorname_np (ETIME), "ETIME");
++#endif
++#ifdef ECANCELED
++  TEST_COMPARE_STRING (strerrordesc_np (ECANCELED), "Operation canceled");
++  TEST_COMPARE_STRING (strerrorname_np (ECANCELED), "ECANCELED");
++#endif
++#ifdef EOWNERDEAD
++  TEST_COMPARE_STRING (strerrordesc_np (EOWNERDEAD), "Owner died");
++  TEST_COMPARE_STRING (strerrorname_np (EOWNERDEAD), "EOWNERDEAD");
++#endif
++#ifdef ENOTRECOVERABLE
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTRECOVERABLE),
++                     "State not recoverable");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTRECOVERABLE), "ENOTRECOVERABLE");
++#endif
++#ifdef ERESTART
++  TEST_COMPARE_STRING (strerrordesc_np (ERESTART),
++                     "Interrupted system call should be restarted");
++  TEST_COMPARE_STRING (strerrorname_np (ERESTART), "ERESTART");
++#endif
++#ifdef ECHRNG
++  TEST_COMPARE_STRING (strerrordesc_np (ECHRNG),
++                     "Channel number out of range");
++  TEST_COMPARE_STRING (strerrorname_np (ECHRNG), "ECHRNG");
++#endif
++#ifdef EL2NSYNC
++  TEST_COMPARE_STRING (strerrordesc_np (EL2NSYNC),
++                     "Level 2 not synchronized");
++  TEST_COMPARE_STRING (strerrorname_np (EL2NSYNC), "EL2NSYNC");
++#endif
++#ifdef EL3HLT
++  TEST_COMPARE_STRING (strerrordesc_np (EL3HLT), "Level 3 halted");
++  TEST_COMPARE_STRING (strerrorname_np (EL3HLT), "EL3HLT");
++#endif
++#ifdef EL3RST
++  TEST_COMPARE_STRING (strerrordesc_np (EL3RST), "Level 3 reset");
++  TEST_COMPARE_STRING (strerrorname_np (EL3RST), "EL3RST");
++#endif
++#ifdef ELNRNG
++  TEST_COMPARE_STRING (strerrordesc_np (ELNRNG), "Link number out of range");
++  TEST_COMPARE_STRING (strerrorname_np (ELNRNG), "ELNRNG");
++#endif
++#ifdef EUNATCH
++  TEST_COMPARE_STRING (strerrordesc_np (EUNATCH),
++                     "Protocol driver not attached");
++  TEST_COMPARE_STRING (strerrorname_np (EUNATCH), "EUNATCH");
++#endif
++#ifdef ENOCSI
++  TEST_COMPARE_STRING (strerrordesc_np (ENOCSI),
++                     "No CSI structure available");
++  TEST_COMPARE_STRING (strerrorname_np (ENOCSI), "ENOCSI");
++#endif
++#ifdef EL2HLT
++  TEST_COMPARE_STRING (strerrordesc_np (EL2HLT), "Level 2 halted");
++  TEST_COMPARE_STRING (strerrorname_np (EL2HLT), "EL2HLT");
++#endif
++#ifdef EBADE
++  TEST_COMPARE_STRING (strerrordesc_np (EBADE), "Invalid exchange");
++  TEST_COMPARE_STRING (strerrorname_np (EBADE), "EBADE");
++#endif
++#ifdef EBADR
++  TEST_COMPARE_STRING (strerrordesc_np (EBADR),
++                     "Invalid request descriptor");
++  TEST_COMPARE_STRING (strerrorname_np (EBADR), "EBADR");
++#endif
++#ifdef EXFULL
++  TEST_COMPARE_STRING (strerrordesc_np (EXFULL), "Exchange full");
++  TEST_COMPARE_STRING (strerrorname_np (EXFULL), "EXFULL");
++#endif
++#ifdef ENOANO
++  TEST_COMPARE_STRING (strerrordesc_np (ENOANO), "No anode");
++  TEST_COMPARE_STRING (strerrorname_np (ENOANO), "ENOANO");
++#endif
++#ifdef EBADRQC
++  TEST_COMPARE_STRING (strerrordesc_np (EBADRQC), "Invalid request code");
++  TEST_COMPARE_STRING (strerrorname_np (EBADRQC), "EBADRQC");
++#endif
++#ifdef EBADSLT
++  TEST_COMPARE_STRING (strerrordesc_np (EBADSLT), "Invalid slot");
++  TEST_COMPARE_STRING (strerrorname_np (EBADSLT), "EBADSLT");
++#endif
++#ifdef EBFONT
++  TEST_COMPARE_STRING (strerrordesc_np (EBFONT), "Bad font file format");
++  TEST_COMPARE_STRING (strerrorname_np (EBFONT), "EBFONT");
++#endif
++#ifdef ENONET
++  TEST_COMPARE_STRING (strerrordesc_np (ENONET),
++                     "Machine is not on the network");
++  TEST_COMPARE_STRING (strerrorname_np (ENONET), "ENONET");
++#endif
++#ifdef ENOPKG
++  TEST_COMPARE_STRING (strerrordesc_np (ENOPKG), "Package not installed");
++  TEST_COMPARE_STRING (strerrorname_np (ENOPKG), "ENOPKG");
++#endif
++#ifdef EADV
++  TEST_COMPARE_STRING (strerrordesc_np (EADV), "Advertise error");
++  TEST_COMPARE_STRING (strerrorname_np (EADV), "EADV");
++#endif
++#ifdef ESRMNT
++  TEST_COMPARE_STRING (strerrordesc_np (ESRMNT), "Srmount error");
++  TEST_COMPARE_STRING (strerrorname_np (ESRMNT), "ESRMNT");
++#endif
++#ifdef ECOMM
++  TEST_COMPARE_STRING (strerrordesc_np (ECOMM),
++                     "Communication error on send");
++  TEST_COMPARE_STRING (strerrorname_np (ECOMM), "ECOMM");
++#endif
++#ifdef EDOTDOT
++  TEST_COMPARE_STRING (strerrordesc_np (EDOTDOT), "RFS specific error");
++  TEST_COMPARE_STRING (strerrorname_np (EDOTDOT), "EDOTDOT");
++#endif
++#ifdef ENOTUNIQ
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTUNIQ),
++                     "Name not unique on network");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTUNIQ), "ENOTUNIQ");
++#endif
++#ifdef EBADFD
++  TEST_COMPARE_STRING (strerrordesc_np (EBADFD),
++                     "File descriptor in bad state");
++  TEST_COMPARE_STRING (strerrorname_np (EBADFD), "EBADFD");
++#endif
++#ifdef EREMCHG
++  TEST_COMPARE_STRING (strerrordesc_np (EREMCHG), "Remote address changed");
++  TEST_COMPARE_STRING (strerrorname_np (EREMCHG), "EREMCHG");
++#endif
++#ifdef ELIBACC
++  TEST_COMPARE_STRING (strerrordesc_np (ELIBACC),
++                     "Can not access a needed shared library");
++  TEST_COMPARE_STRING (strerrorname_np (ELIBACC), "ELIBACC");
++#endif
++#ifdef ELIBBAD
++  TEST_COMPARE_STRING (strerrordesc_np (ELIBBAD),
++                     "Accessing a corrupted shared library");
++  TEST_COMPARE_STRING (strerrorname_np (ELIBBAD), "ELIBBAD");
++#endif
++#ifdef ELIBSCN
++  TEST_COMPARE_STRING (strerrordesc_np (ELIBSCN),
++                     ".lib section in a.out corrupted");
++  TEST_COMPARE_STRING (strerrorname_np (ELIBSCN), "ELIBSCN");
++#endif
++#ifdef ELIBMAX
++  TEST_COMPARE_STRING (strerrordesc_np (ELIBMAX),
++                     "Attempting to link in too many shared libraries");
++  TEST_COMPARE_STRING (strerrorname_np (ELIBMAX), "ELIBMAX");
++#endif
++#ifdef ELIBEXEC
++  TEST_COMPARE_STRING (strerrordesc_np (ELIBEXEC),
++                     "Cannot exec a shared library directly");
++  TEST_COMPARE_STRING (strerrorname_np (ELIBEXEC), "ELIBEXEC");
++#endif
++#ifdef ESTRPIPE
++  TEST_COMPARE_STRING (strerrordesc_np (ESTRPIPE), "Streams pipe error");
++  TEST_COMPARE_STRING (strerrorname_np (ESTRPIPE), "ESTRPIPE");
++#endif
++#ifdef EUCLEAN
++  TEST_COMPARE_STRING (strerrordesc_np (EUCLEAN),
++                     "Structure needs cleaning");
++  TEST_COMPARE_STRING (strerrorname_np (EUCLEAN), "EUCLEAN");
++#endif
++#ifdef ENOTNAM
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTNAM),
++                     "Not a XENIX named type file");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTNAM), "ENOTNAM");
++#endif
++#ifdef ENAVAIL
++  TEST_COMPARE_STRING (strerrordesc_np (ENAVAIL),
++                     "No XENIX semaphores available");
++  TEST_COMPARE_STRING (strerrorname_np (ENAVAIL), "ENAVAIL");
++#endif
++#ifdef EISNAM
++  TEST_COMPARE_STRING (strerrordesc_np (EISNAM), "Is a named type file");
++  TEST_COMPARE_STRING (strerrorname_np (EISNAM), "EISNAM");
++#endif
++#ifdef EREMOTEIO
++  TEST_COMPARE_STRING (strerrordesc_np (EREMOTEIO), "Remote I/O error");
++  TEST_COMPARE_STRING (strerrorname_np (EREMOTEIO), "EREMOTEIO");
++#endif
++#ifdef ENOMEDIUM
++  TEST_COMPARE_STRING (strerrordesc_np (ENOMEDIUM), "No medium found");
++  TEST_COMPARE_STRING (strerrorname_np (ENOMEDIUM), "ENOMEDIUM");
++#endif
++#ifdef EMEDIUMTYPE
++  TEST_COMPARE_STRING (strerrordesc_np (EMEDIUMTYPE), "Wrong medium type");
++  TEST_COMPARE_STRING (strerrorname_np (EMEDIUMTYPE), "EMEDIUMTYPE");
++#endif
++#ifdef ENOKEY
++  TEST_COMPARE_STRING (strerrordesc_np (ENOKEY),
++                     "Required key not available");
++  TEST_COMPARE_STRING (strerrorname_np (ENOKEY), "ENOKEY");
++#endif
++#ifdef EKEYEXPIRED
++  TEST_COMPARE_STRING (strerrordesc_np (EKEYEXPIRED), "Key has expired");
++  TEST_COMPARE_STRING (strerrorname_np (EKEYEXPIRED), "EKEYEXPIRED");
++#endif
++#ifdef EKEYREVOKED
++  TEST_COMPARE_STRING (strerrordesc_np (EKEYREVOKED),
++                     "Key has been revoked");
++  TEST_COMPARE_STRING (strerrorname_np (EKEYREVOKED), "EKEYREVOKED");
++#endif
++#ifdef EKEYREJECTED
++  TEST_COMPARE_STRING (strerrordesc_np (EKEYREJECTED),
++                     "Key was rejected by service");
++  TEST_COMPARE_STRING (strerrorname_np (EKEYREJECTED), "EKEYREJECTED");
++#endif
++#ifdef ERFKILL
++  TEST_COMPARE_STRING (strerrordesc_np (ERFKILL),
++                     "Operation not possible due to RF-kill");
++  TEST_COMPARE_STRING (strerrorname_np (ERFKILL), "ERFKILL");
++#endif
++#ifdef EHWPOISON
++  TEST_COMPARE_STRING (strerrordesc_np (EHWPOISON),
++                     "Memory page has hardware error");
++  TEST_COMPARE_STRING (strerrorname_np (EHWPOISON), "EHWPOISON");
++#endif
++#ifdef EBADRPC
++  TEST_COMPARE_STRING (strerrordesc_np (EBADRPC), "RPC struct is bad");
++  TEST_COMPARE_STRING (strerrorname_np (EBADRPC), "EBADRPC");
++#endif
++#ifdef EFTYPE
++  TEST_COMPARE_STRING (strerrordesc_np (EFTYPE),
++                     "Inappropriate file type or format");
++  TEST_COMPARE_STRING (strerrorname_np (EFTYPE), "EFTYPE");
++#endif
++#ifdef EPROCUNAVAIL
++  TEST_COMPARE_STRING (strerrordesc_np (EPROCUNAVAIL),
++                     "RPC bad procedure for program");
++  TEST_COMPARE_STRING (strerrorname_np (EPROCUNAVAIL), "EPROCUNAVAIL");
++#endif
++#ifdef EAUTH
++  TEST_COMPARE_STRING (strerrordesc_np (EAUTH), "Authentication error");
++  TEST_COMPARE_STRING (strerrorname_np (EAUTH), "EAUTH");
++#endif
++#ifdef EDIED
++  TEST_COMPARE_STRING (strerrordesc_np (EDIED), "Translator died");
++  TEST_COMPARE_STRING (strerrorname_np (EDIED), "EDIED");
++#endif
++#ifdef ERPCMISMATCH
++  TEST_COMPARE_STRING (strerrordesc_np (ERPCMISMATCH), "RPC version wrong");
++  TEST_COMPARE_STRING (strerrorname_np (ERPCMISMATCH), "ERPCMISMATCH");
++#endif
++#ifdef EGREGIOUS
++  TEST_COMPARE_STRING (strerrordesc_np (EGREGIOUS),
++                     "You really blew it this time");
++  TEST_COMPARE_STRING (strerrorname_np (EGREGIOUS), "EGREGIOUS");
++#endif
++#ifdef EPROCLIM
++  TEST_COMPARE_STRING (strerrordesc_np (EPROCLIM), "Too many processes");
++  TEST_COMPARE_STRING (strerrorname_np (EPROCLIM), "EPROCLIM");
++#endif
++#ifdef EGRATUITOUS
++  TEST_COMPARE_STRING (strerrordesc_np (EGRATUITOUS), "Gratuitous error");
++  TEST_COMPARE_STRING (strerrorname_np (EGRATUITOUS), "EGRATUITOUS");
++#endif
++#if defined (ENOTSUP) && ENOTSUP != EOPNOTSUPP
++  TEST_COMPARE_STRING (strerrordesc_np (ENOTSUP), "Not supported");
++  TEST_COMPARE_STRING (strerrorname_np (ENOTSUP), "ENOTSUP");
++#endif
++#ifdef EPROGMISMATCH
++  TEST_COMPARE_STRING (strerrordesc_np (EPROGMISMATCH),
++                     "RPC program version wrong");
++  TEST_COMPARE_STRING (strerrorname_np (EPROGMISMATCH), "EPROGMISMATCH");
++#endif
++#ifdef EBACKGROUND
++  TEST_COMPARE_STRING (strerrordesc_np (EBACKGROUND),
++                     "Inappropriate operation for background process");
++  TEST_COMPARE_STRING (strerrorname_np (EBACKGROUND), "EBACKGROUND");
++#endif
++#ifdef EIEIO
++  TEST_COMPARE_STRING (strerrordesc_np (EIEIO), "Computer bought the farm");
++  TEST_COMPARE_STRING (strerrorname_np (EIEIO), "EIEIO");
++#endif
++#if defined (EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
++  TEST_COMPARE_STRING (strerrordesc_np (EWOULDBLOCK),
++                     "Operation would block");
++  TEST_COMPARE_STRING (strerrorname_np (EWOULDBLOCK), "EWOULDBLOCK");
++#endif
++#ifdef ENEEDAUTH
++  TEST_COMPARE_STRING (strerrordesc_np (ENEEDAUTH), "Need authenticator");
++  TEST_COMPARE_STRING (strerrorname_np (ENEEDAUTH), "ENEEDAUTH");
++#endif
++#ifdef ED
++  TEST_COMPARE_STRING (strerrordesc_np (ED), "?");
++  TEST_COMPARE_STRING (strerrorname_np (ED), "ED");
++#endif
++#ifdef EPROGUNAVAIL
++  TEST_COMPARE_STRING (strerrordesc_np (EPROGUNAVAIL),
++                     "RPC program not available");
++  TEST_COMPARE_STRING (strerrorname_np (EPROGUNAVAIL), "EPROGUNAVAIL");
++#endif
+   return 0;
+ }
+diff --git a/sysdeps/aarch64/multiarch/memcpy.c b/sysdeps/aarch64/multiarch/memcpy.c
+index 7cf5f033e8..799d60c98c 100644
+--- a/sysdeps/aarch64/multiarch/memcpy.c
++++ b/sysdeps/aarch64/multiarch/memcpy.c
+@@ -41,7 +41,8 @@ libc_ifunc (__libc_memcpy,
+               ? __memcpy_falkor
+               : (IS_THUNDERX2 (midr) || IS_THUNDERX2PA (midr)
+                 ? __memcpy_thunderx2
+-                : (IS_NEOVERSE_N1 (midr)
++                : (IS_NEOVERSE_N1 (midr) || IS_NEOVERSE_N2 (midr)
++                   || IS_NEOVERSE_V1 (midr)
+                    ? __memcpy_simd
+                    : __memcpy_generic)))));
+diff --git a/sysdeps/aarch64/multiarch/memcpy_advsimd.S b/sysdeps/aarch64/multiarch/memcpy_advsimd.S
+index d4ba747777..48bb6d7ca4 100644
+--- a/sysdeps/aarch64/multiarch/memcpy_advsimd.S
++++ b/sysdeps/aarch64/multiarch/memcpy_advsimd.S
+@@ -223,12 +223,13 @@ L(copy_long_backwards):
+       b.ls    L(copy64_from_start)
+ L(loop64_backwards):
+-      stp     A_q, B_q, [dstend, -32]
++      str     B_q, [dstend, -16]
++      str     A_q, [dstend, -32]
+       ldp     A_q, B_q, [srcend, -96]
+-      stp     C_q, D_q, [dstend, -64]
++      str     D_q, [dstend, -48]
++      str     C_q, [dstend, -64]!
+       ldp     C_q, D_q, [srcend, -128]
+       sub     srcend, srcend, 64
+-      sub     dstend, dstend, 64
+       subs    count, count, 64
+       b.hi    L(loop64_backwards)
+diff --git a/sysdeps/aarch64/multiarch/memmove.c b/sysdeps/aarch64/multiarch/memmove.c
+index ad10aa8ac6..46a4cb3a54 100644
+--- a/sysdeps/aarch64/multiarch/memmove.c
++++ b/sysdeps/aarch64/multiarch/memmove.c
+@@ -41,7 +41,8 @@ libc_ifunc (__libc_memmove,
+               ? __memmove_falkor
+               : (IS_THUNDERX2 (midr) || IS_THUNDERX2PA (midr)
+                 ? __memmove_thunderx2
+-                : (IS_NEOVERSE_N1 (midr)
++                : (IS_NEOVERSE_N1 (midr) || IS_NEOVERSE_N2 (midr)
++                   || IS_NEOVERSE_V1 (midr)
+                    ? __memmove_simd
+                    : __memmove_generic)))));
+diff --git a/sysdeps/gnu/errlist.h b/sysdeps/gnu/errlist.h
+index 5d11ed723d..6329e5f393 100644
+--- a/sysdeps/gnu/errlist.h
++++ b/sysdeps/gnu/errlist.h
+@@ -1,24 +1,21 @@
+-#ifndef ERR_MAP
+-#define ERR_MAP(value) value
+-#endif
+-_S(ERR_MAP(0), N_("Success"))
++_S(0, N_("Success"))
+ #ifdef EPERM
+ /*
+ TRANS Only the owner of the file (or other resource)
+ TRANS or processes with special privileges can perform the operation. */
+-_S(ERR_MAP(EPERM), N_("Operation not permitted"))
++_S(EPERM, N_("Operation not permitted"))
+ #endif
+ #ifdef ENOENT
+ /*
+ TRANS This is a ``file doesn't exist'' error
+ TRANS for ordinary files that are referenced in contexts where they are
+ TRANS expected to already exist. */
+-_S(ERR_MAP(ENOENT), N_("No such file or directory"))
++_S(ENOENT, N_("No such file or directory"))
+ #endif
+ #ifdef ESRCH
+ /*
+ TRANS No process matches the specified process ID. */
+-_S(ERR_MAP(ESRCH), N_("No such process"))
++_S(ESRCH, N_("No such process"))
+ #endif
+ #ifdef EINTR
+ /*
+@@ -29,12 +26,12 @@ TRANS
+ TRANS You can choose to have functions resume after a signal that is handled,
+ TRANS rather than failing with @code{EINTR}; see @ref{Interrupted
+ TRANS Primitives}. */
+-_S(ERR_MAP(EINTR), N_("Interrupted system call"))
++_S(EINTR, N_("Interrupted system call"))
+ #endif
+ #ifdef EIO
+ /*
+ TRANS Usually used for physical read or write errors. */
+-_S(ERR_MAP(EIO), N_("Input/output error"))
++_S(EIO, N_("Input/output error"))
+ #endif
+ #ifdef ENXIO
+ /*
+@@ -43,7 +40,7 @@ TRANS represented by a file you specified, and it couldn't find the device.
+ TRANS This can mean that the device file was installed incorrectly, or that
+ TRANS the physical device is missing or not correctly attached to the
+ TRANS computer. */
+-_S(ERR_MAP(ENXIO), N_("No such device or address"))
++_S(ENXIO, N_("No such device or address"))
+ #endif
+ #ifdef E2BIG
+ /*
+@@ -51,27 +48,27 @@ TRANS Used when the arguments passed to a new program
+ TRANS being executed with one of the @code{exec} functions (@pxref{Executing a
+ TRANS File}) occupy too much memory space.  This condition never arises on
+ TRANS @gnuhurdsystems{}. */
+-_S(ERR_MAP(E2BIG), N_("Argument list too long"))
++_S(E2BIG, N_("Argument list too long"))
+ #endif
+ #ifdef ENOEXEC
+ /*
+ TRANS Invalid executable file format.  This condition is detected by the
+ TRANS @code{exec} functions; see @ref{Executing a File}. */
+-_S(ERR_MAP(ENOEXEC), N_("Exec format error"))
++_S(ENOEXEC, N_("Exec format error"))
+ #endif
+ #ifdef EBADF
+ /*
+ TRANS For example, I/O on a descriptor that has been
+ TRANS closed or reading from a descriptor open only for writing (or vice
+ TRANS versa). */
+-_S(ERR_MAP(EBADF), N_("Bad file descriptor"))
++_S(EBADF, N_("Bad file descriptor"))
+ #endif
+ #ifdef ECHILD
+ /*
+ TRANS This error happens on operations that are
+ TRANS supposed to manipulate child processes, when there aren't any processes
+ TRANS to manipulate. */
+-_S(ERR_MAP(ECHILD), N_("No child processes"))
++_S(ECHILD, N_("No child processes"))
+ #endif
+ #ifdef EDEADLK
+ /*
+@@ -79,74 +76,74 @@ TRANS Allocating a system resource would have resulted in a
+ TRANS deadlock situation.  The system does not guarantee that it will notice
+ TRANS all such situations.  This error means you got lucky and the system
+ TRANS noticed; it might just hang.  @xref{File Locks}, for an example. */
+-_S(ERR_MAP(EDEADLK), N_("Resource deadlock avoided"))
++_S(EDEADLK, N_("Resource deadlock avoided"))
+ #endif
+ #ifdef ENOMEM
+ /*
+ TRANS The system cannot allocate more virtual memory
+ TRANS because its capacity is full. */
+-_S(ERR_MAP(ENOMEM), N_("Cannot allocate memory"))
++_S(ENOMEM, N_("Cannot allocate memory"))
+ #endif
+ #ifdef EACCES
+ /*
+ TRANS The file permissions do not allow the attempted operation. */
+-_S(ERR_MAP(EACCES), N_("Permission denied"))
++_S(EACCES, N_("Permission denied"))
+ #endif
+ #ifdef EFAULT
+ /*
+ TRANS An invalid pointer was detected.
+ TRANS On @gnuhurdsystems{}, this error never happens; you get a signal instead. */
+-_S(ERR_MAP(EFAULT), N_("Bad address"))
++_S(EFAULT, N_("Bad address"))
+ #endif
+ #ifdef ENOTBLK
+ /*
+ TRANS A file that isn't a block special file was given in a situation that
+ TRANS requires one.  For example, trying to mount an ordinary file as a file
+ TRANS system in Unix gives this error. */
+-_S(ERR_MAP(ENOTBLK), N_("Block device required"))
++_S(ENOTBLK, N_("Block device required"))
+ #endif
+ #ifdef EBUSY
+ /*
+ TRANS A system resource that can't be shared is already in use.
+ TRANS For example, if you try to delete a file that is the root of a currently
+ TRANS mounted filesystem, you get this error. */
+-_S(ERR_MAP(EBUSY), N_("Device or resource busy"))
++_S(EBUSY, N_("Device or resource busy"))
+ #endif
+ #ifdef EEXIST
+ /*
+ TRANS An existing file was specified in a context where it only
+ TRANS makes sense to specify a new file. */
+-_S(ERR_MAP(EEXIST), N_("File exists"))
++_S(EEXIST, N_("File exists"))
+ #endif
+ #ifdef EXDEV
+ /*
+ TRANS An attempt to make an improper link across file systems was detected.
+ TRANS This happens not only when you use @code{link} (@pxref{Hard Links}) but
+ TRANS also when you rename a file with @code{rename} (@pxref{Renaming Files}). */
+-_S(ERR_MAP(EXDEV), N_("Invalid cross-device link"))
++_S(EXDEV, N_("Invalid cross-device link"))
+ #endif
+ #ifdef ENODEV
+ /*
+ TRANS The wrong type of device was given to a function that expects a
+ TRANS particular sort of device. */
+-_S(ERR_MAP(ENODEV), N_("No such device"))
++_S(ENODEV, N_("No such device"))
+ #endif
+ #ifdef ENOTDIR
+ /*
+ TRANS A file that isn't a directory was specified when a directory is required. */
+-_S(ERR_MAP(ENOTDIR), N_("Not a directory"))
++_S(ENOTDIR, N_("Not a directory"))
+ #endif
+ #ifdef EISDIR
+ /*
+ TRANS You cannot open a directory for writing,
+ TRANS or create or remove hard links to it. */
+-_S(ERR_MAP(EISDIR), N_("Is a directory"))
++_S(EISDIR, N_("Is a directory"))
+ #endif
+ #ifdef EINVAL
+ /*
+ TRANS This is used to indicate various kinds of problems
+ TRANS with passing the wrong argument to a library function. */
+-_S(ERR_MAP(EINVAL), N_("Invalid argument"))
++_S(EINVAL, N_("Invalid argument"))
+ #endif
+ #ifdef EMFILE
+ /*
+@@ -157,20 +154,20 @@ TRANS In BSD and GNU, the number of open files is controlled by a resource
+ TRANS limit that can usually be increased.  If you get this error, you might
+ TRANS want to increase the @code{RLIMIT_NOFILE} limit or make it unlimited;
+ TRANS @pxref{Limits on Resources}. */
+-_S(ERR_MAP(EMFILE), N_("Too many open files"))
++_S(EMFILE, N_("Too many open files"))
+ #endif
+ #ifdef ENFILE
+ /*
+ TRANS There are too many distinct file openings in the entire system.  Note
+ TRANS that any number of linked channels count as just one file opening; see
+ TRANS @ref{Linked Channels}.  This error never occurs on @gnuhurdsystems{}. */
+-_S(ERR_MAP(ENFILE), N_("Too many open files in system"))
++_S(ENFILE, N_("Too many open files in system"))
+ #endif
+ #ifdef ENOTTY
+ /*
+ TRANS Inappropriate I/O control operation, such as trying to set terminal
+ TRANS modes on an ordinary file. */
+-_S(ERR_MAP(ENOTTY), N_("Inappropriate ioctl for device"))
++_S(ENOTTY, N_("Inappropriate ioctl for device"))
+ #endif
+ #ifdef ETXTBSY
+ /*
+@@ -179,35 +176,35 @@ TRANS write to a file that is currently being executed.  Often using a
+ TRANS debugger to run a program is considered having it open for writing and
+ TRANS will cause this error.  (The name stands for ``text file busy''.)  This
+ TRANS is not an error on @gnuhurdsystems{}; the text is copied as necessary. */
+-_S(ERR_MAP(ETXTBSY), N_("Text file busy"))
++_S(ETXTBSY, N_("Text file busy"))
+ #endif
+ #ifdef EFBIG
+ /*
+ TRANS The size of a file would be larger than allowed by the system. */
+-_S(ERR_MAP(EFBIG), N_("File too large"))
++_S(EFBIG, N_("File too large"))
+ #endif
+ #ifdef ENOSPC
+ /*
+ TRANS Write operation on a file failed because the
+ TRANS disk is full. */
+-_S(ERR_MAP(ENOSPC), N_("No space left on device"))
++_S(ENOSPC, N_("No space left on device"))
+ #endif
+ #ifdef ESPIPE
+ /*
+ TRANS Invalid seek operation (such as on a pipe). */
+-_S(ERR_MAP(ESPIPE), N_("Illegal seek"))
++_S(ESPIPE, N_("Illegal seek"))
+ #endif
+ #ifdef EROFS
+ /*
+ TRANS An attempt was made to modify something on a read-only file system. */
+-_S(ERR_MAP(EROFS), N_("Read-only file system"))
++_S(EROFS, N_("Read-only file system"))
+ #endif
+ #ifdef EMLINK
+ /*
+ TRANS The link count of a single file would become too large.
+ TRANS @code{rename} can cause this error if the file being renamed already has
+ TRANS as many links as it can take (@pxref{Renaming Files}). */
+-_S(ERR_MAP(EMLINK), N_("Too many links"))
++_S(EMLINK, N_("Too many links"))
+ #endif
+ #ifdef EPIPE
+ /*
+@@ -216,19 +213,19 @@ TRANS Every library function that returns this error code also generates a
+ TRANS @code{SIGPIPE} signal; this signal terminates the program if not handled
+ TRANS or blocked.  Thus, your program will never actually see @code{EPIPE}
+ TRANS unless it has handled or blocked @code{SIGPIPE}. */
+-_S(ERR_MAP(EPIPE), N_("Broken pipe"))
++_S(EPIPE, N_("Broken pipe"))
+ #endif
+ #ifdef EDOM
+ /*
+ TRANS Used by mathematical functions when an argument value does
+ TRANS not fall into the domain over which the function is defined. */
+-_S(ERR_MAP(EDOM), N_("Numerical argument out of domain"))
++_S(EDOM, N_("Numerical argument out of domain"))
+ #endif
+ #ifdef ERANGE
+ /*
+ TRANS Used by mathematical functions when the result value is
+ TRANS not representable because of overflow or underflow. */
+-_S(ERR_MAP(ERANGE), N_("Numerical result out of range"))
++_S(ERANGE, N_("Numerical result out of range"))
+ #endif
+ #ifdef EAGAIN
+ /*
+@@ -261,7 +258,7 @@ TRANS Such shortages are usually fairly serious and affect the whole system,
+ TRANS so usually an interactive program should report the error to the user
+ TRANS and return to its command loop.
+ TRANS @end itemize */
+-_S(ERR_MAP(EAGAIN), N_("Resource temporarily unavailable"))
++_S(EAGAIN, N_("Resource temporarily unavailable"))
+ #endif
+ #ifdef EINPROGRESS
+ /*
+@@ -273,47 +270,47 @@ TRANS the operation has begun and will take some time.  Attempts to manipulate
+ TRANS the object before the call completes return @code{EALREADY}.  You can
+ TRANS use the @code{select} function to find out when the pending operation
+ TRANS has completed; @pxref{Waiting for I/O}. */
+-_S(ERR_MAP(EINPROGRESS), N_("Operation now in progress"))
++_S(EINPROGRESS, N_("Operation now in progress"))
+ #endif
+ #ifdef EALREADY
+ /*
+ TRANS An operation is already in progress on an object that has non-blocking
+ TRANS mode selected. */
+-_S(ERR_MAP(EALREADY), N_("Operation already in progress"))
++_S(EALREADY, N_("Operation already in progress"))
+ #endif
+ #ifdef ENOTSOCK
+ /*
+ TRANS A file that isn't a socket was specified when a socket is required. */
+-_S(ERR_MAP(ENOTSOCK), N_("Socket operation on non-socket"))
++_S(ENOTSOCK, N_("Socket operation on non-socket"))
+ #endif
+ #ifdef EMSGSIZE
+ /*
+ TRANS The size of a message sent on a socket was larger than the supported
+ TRANS maximum size. */
+-_S(ERR_MAP(EMSGSIZE), N_("Message too long"))
++_S(EMSGSIZE, N_("Message too long"))
+ #endif
+ #ifdef EPROTOTYPE
+ /*
+ TRANS The socket type does not support the requested communications protocol. */
+-_S(ERR_MAP(EPROTOTYPE), N_("Protocol wrong type for socket"))
++_S(EPROTOTYPE, N_("Protocol wrong type for socket"))
+ #endif
+ #ifdef ENOPROTOOPT
+ /*
+ TRANS You specified a socket option that doesn't make sense for the
+ TRANS particular protocol being used by the socket.  @xref{Socket Options}. */
+-_S(ERR_MAP(ENOPROTOOPT), N_("Protocol not available"))
++_S(ENOPROTOOPT, N_("Protocol not available"))
+ #endif
+ #ifdef EPROTONOSUPPORT
+ /*
+ TRANS The socket domain does not support the requested communications protocol
+ TRANS (perhaps because the requested protocol is completely invalid).
+ TRANS @xref{Creating a Socket}. */
+-_S(ERR_MAP(EPROTONOSUPPORT), N_("Protocol not supported"))
++_S(EPROTONOSUPPORT, N_("Protocol not supported"))
+ #endif
+ #ifdef ESOCKTNOSUPPORT
+ /*
+ TRANS The socket type is not supported. */
+-_S(ERR_MAP(ESOCKTNOSUPPORT), N_("Socket type not supported"))
++_S(ESOCKTNOSUPPORT, N_("Socket type not supported"))
+ #endif
+ #ifdef EOPNOTSUPP
+ /*
+@@ -323,71 +320,71 @@ TRANS implemented for all communications protocols.  On @gnuhurdsystems{}, this
+ TRANS error can happen for many calls when the object does not support the
+ TRANS particular operation; it is a generic indication that the server knows
+ TRANS nothing to do for that call. */
+-_S(ERR_MAP(EOPNOTSUPP), N_("Operation not supported"))
++_S(EOPNOTSUPP, N_("Operation not supported"))
+ #endif
+ #ifdef EPFNOSUPPORT
+ /*
+ TRANS The socket communications protocol family you requested is not supported. */
+-_S(ERR_MAP(EPFNOSUPPORT), N_("Protocol family not supported"))
++_S(EPFNOSUPPORT, N_("Protocol family not supported"))
+ #endif
+ #ifdef EAFNOSUPPORT
+ /*
+ TRANS The address family specified for a socket is not supported; it is
+ TRANS inconsistent with the protocol being used on the socket.  @xref{Sockets}. */
+-_S(ERR_MAP(EAFNOSUPPORT), N_("Address family not supported by protocol"))
++_S(EAFNOSUPPORT, N_("Address family not supported by protocol"))
+ #endif
+ #ifdef EADDRINUSE
+ /*
+ TRANS The requested socket address is already in use.  @xref{Socket Addresses}. */
+-_S(ERR_MAP(EADDRINUSE), N_("Address already in use"))
++_S(EADDRINUSE, N_("Address already in use"))
+ #endif
+ #ifdef EADDRNOTAVAIL
+ /*
+ TRANS The requested socket address is not available; for example, you tried
+ TRANS to give a socket a name that doesn't match the local host name.
+ TRANS @xref{Socket Addresses}. */
+-_S(ERR_MAP(EADDRNOTAVAIL), N_("Cannot assign requested address"))
++_S(EADDRNOTAVAIL, N_("Cannot assign requested address"))
+ #endif
+ #ifdef ENETDOWN
+ /*
+ TRANS A socket operation failed because the network was down. */
+-_S(ERR_MAP(ENETDOWN), N_("Network is down"))
++_S(ENETDOWN, N_("Network is down"))
+ #endif
+ #ifdef ENETUNREACH
+ /*
+ TRANS A socket operation failed because the subnet containing the remote host
+ TRANS was unreachable. */
+-_S(ERR_MAP(ENETUNREACH), N_("Network is unreachable"))
++_S(ENETUNREACH, N_("Network is unreachable"))
+ #endif
+ #ifdef ENETRESET
+ /*
+ TRANS A network connection was reset because the remote host crashed. */
+-_S(ERR_MAP(ENETRESET), N_("Network dropped connection on reset"))
++_S(ENETRESET, N_("Network dropped connection on reset"))
+ #endif
+ #ifdef ECONNABORTED
+ /*
+ TRANS A network connection was aborted locally. */
+-_S(ERR_MAP(ECONNABORTED), N_("Software caused connection abort"))
++_S(ECONNABORTED, N_("Software caused connection abort"))
+ #endif
+ #ifdef ECONNRESET
+ /*
+ TRANS A network connection was closed for reasons outside the control of the
+ TRANS local host, such as by the remote machine rebooting or an unrecoverable
+ TRANS protocol violation. */
+-_S(ERR_MAP(ECONNRESET), N_("Connection reset by peer"))
++_S(ECONNRESET, N_("Connection reset by peer"))
+ #endif
+ #ifdef ENOBUFS
+ /*
+ TRANS The kernel's buffers for I/O operations are all in use.  In GNU, this
+ TRANS error is always synonymous with @code{ENOMEM}; you may get one or the
+ TRANS other from network operations. */
+-_S(ERR_MAP(ENOBUFS), N_("No buffer space available"))
++_S(ENOBUFS, N_("No buffer space available"))
+ #endif
+ #ifdef EISCONN
+ /*
+ TRANS You tried to connect a socket that is already connected.
+ TRANS @xref{Connecting}. */
+-_S(ERR_MAP(EISCONN), N_("Transport endpoint is already connected"))
++_S(EISCONN, N_("Transport endpoint is already connected"))
+ #endif
+ #ifdef ENOTCONN
+ /*
+@@ -395,74 +392,74 @@ TRANS The socket is not connected to anything.  You get this error when you
+ TRANS try to transmit data over a socket, without first specifying a
+ TRANS destination for the data.  For a connectionless socket (for datagram
+ TRANS protocols, such as UDP), you get @code{EDESTADDRREQ} instead. */
+-_S(ERR_MAP(ENOTCONN), N_("Transport endpoint is not connected"))
++_S(ENOTCONN, N_("Transport endpoint is not connected"))
+ #endif
+ #ifdef EDESTADDRREQ
+ /*
+ TRANS No default destination address was set for the socket.  You get this
+ TRANS error when you try to transmit data over a connectionless socket,
+ TRANS without first specifying a destination for the data with @code{connect}. */
+-_S(ERR_MAP(EDESTADDRREQ), N_("Destination address required"))
++_S(EDESTADDRREQ, N_("Destination address required"))
+ #endif
+ #ifdef ESHUTDOWN
+ /*
+ TRANS The socket has already been shut down. */
+-_S(ERR_MAP(ESHUTDOWN), N_("Cannot send after transport endpoint shutdown"))
++_S(ESHUTDOWN, N_("Cannot send after transport endpoint shutdown"))
+ #endif
+ #ifdef ETOOMANYREFS
+-_S(ERR_MAP(ETOOMANYREFS), N_("Too many references: cannot splice"))
++_S(ETOOMANYREFS, N_("Too many references: cannot splice"))
+ #endif
+ #ifdef ETIMEDOUT
+ /*
+ TRANS A socket operation with a specified timeout received no response during
+ TRANS the timeout period. */
+-_S(ERR_MAP(ETIMEDOUT), N_("Connection timed out"))
++_S(ETIMEDOUT, N_("Connection timed out"))
+ #endif
+ #ifdef ECONNREFUSED
+ /*
+ TRANS A remote host refused to allow the network connection (typically because
+ TRANS it is not running the requested service). */
+-_S(ERR_MAP(ECONNREFUSED), N_("Connection refused"))
++_S(ECONNREFUSED, N_("Connection refused"))
+ #endif
+ #ifdef ELOOP
+ /*
+ TRANS Too many levels of symbolic links were encountered in looking up a file name.
+ TRANS This often indicates a cycle of symbolic links. */
+-_S(ERR_MAP(ELOOP), N_("Too many levels of symbolic links"))
++_S(ELOOP, N_("Too many levels of symbolic links"))
+ #endif
+ #ifdef ENAMETOOLONG
+ /*
+ TRANS Filename too long (longer than @code{PATH_MAX}; @pxref{Limits for
+ TRANS Files}) or host name too long (in @code{gethostname} or
+ TRANS @code{sethostname}; @pxref{Host Identification}). */
+-_S(ERR_MAP(ENAMETOOLONG), N_("File name too long"))
++_S(ENAMETOOLONG, N_("File name too long"))
+ #endif
+ #ifdef EHOSTDOWN
+ /*
+ TRANS The remote host for a requested network connection is down. */
+-_S(ERR_MAP(EHOSTDOWN), N_("Host is down"))
++_S(EHOSTDOWN, N_("Host is down"))
+ #endif
+ /*
+ TRANS The remote host for a requested network connection is not reachable. */
+ #ifdef EHOSTUNREACH
+-_S(ERR_MAP(EHOSTUNREACH), N_("No route to host"))
++_S(EHOSTUNREACH, N_("No route to host"))
+ #endif
+ #ifdef ENOTEMPTY
+ /*
+ TRANS Directory not empty, where an empty directory was expected.  Typically,
+ TRANS this error occurs when you are trying to delete a directory. */
+-_S(ERR_MAP(ENOTEMPTY), N_("Directory not empty"))
++_S(ENOTEMPTY, N_("Directory not empty"))
+ #endif
+ #ifdef EUSERS
+ /*
+ TRANS The file quota system is confused because there are too many users.
+ TRANS @c This can probably happen in a GNU system when using NFS. */
+-_S(ERR_MAP(EUSERS), N_("Too many users"))
++_S(EUSERS, N_("Too many users"))
+ #endif
+ #ifdef EDQUOT
+ /*
+ TRANS The user's disk quota was exceeded. */
+-_S(ERR_MAP(EDQUOT), N_("Disk quota exceeded"))
++_S(EDQUOT, N_("Disk quota exceeded"))
+ #endif
+ #ifdef ESTALE
+ /*
+@@ -471,7 +468,7 @@ TRANS file system which is due to file system rearrangements on the server host
+ TRANS for NFS file systems or corruption in other file systems.
+ TRANS Repairing this condition usually requires unmounting, possibly repairing
+ TRANS and remounting the file system. */
+-_S(ERR_MAP(ESTALE), N_("Stale file handle"))
++_S(ESTALE, N_("Stale file handle"))
+ #endif
+ #ifdef EREMOTE
+ /*
+@@ -479,7 +476,7 @@ TRANS An attempt was made to NFS-mount a remote file system with a file name tha
+ TRANS already specifies an NFS-mounted file.
+ TRANS (This is an error on some operating systems, but we expect it to work
+ TRANS properly on @gnuhurdsystems{}, making this error code impossible.) */
+-_S(ERR_MAP(EREMOTE), N_("Object is remote"))
++_S(EREMOTE, N_("Object is remote"))
+ #endif
+ #ifdef ENOLCK
+ /*
+@@ -487,7 +484,7 @@ TRANS This is used by the file locking facilities; see
+ TRANS @ref{File Locks}.  This error is never generated by @gnuhurdsystems{}, but
+ TRANS it can result from an operation to an NFS server running another
+ TRANS operating system. */
+-_S(ERR_MAP(ENOLCK), N_("No locks available"))
++_S(ENOLCK, N_("No locks available"))
+ #endif
+ #ifdef ENOSYS
+ /*
+@@ -496,46 +493,46 @@ TRANS not implemented at all, either in the C library itself or in the
+ TRANS operating system.  When you get this error, you can be sure that this
+ TRANS particular function will always fail with @code{ENOSYS} unless you
+ TRANS install a new version of the C library or the operating system. */
+-_S(ERR_MAP(ENOSYS), N_("Function not implemented"))
++_S(ENOSYS, N_("Function not implemented"))
+ #endif
+ #ifdef EILSEQ
+ /*
+ TRANS While decoding a multibyte character the function came along an invalid
+ TRANS or an incomplete sequence of bytes or the given wide character is invalid. */
+-_S(ERR_MAP(EILSEQ), N_("Invalid or incomplete multibyte or wide character"))
++_S(EILSEQ, N_("Invalid or incomplete multibyte or wide character"))
+ #endif
+ #ifdef EBADMSG
+-_S(ERR_MAP(EBADMSG), N_("Bad message"))
++_S(EBADMSG, N_("Bad message"))
+ #endif
+ #ifdef EIDRM
+-_S(ERR_MAP(EIDRM), N_("Identifier removed"))
++_S(EIDRM, N_("Identifier removed"))
+ #endif
+ #ifdef EMULTIHOP
+-_S(ERR_MAP(EMULTIHOP), N_("Multihop attempted"))
++_S(EMULTIHOP, N_("Multihop attempted"))
+ #endif
+ #ifdef ENODATA
+-_S(ERR_MAP(ENODATA), N_("No data available"))
++_S(ENODATA, N_("No data available"))
+ #endif
+ #ifdef ENOLINK
+-_S(ERR_MAP(ENOLINK), N_("Link has been severed"))
++_S(ENOLINK, N_("Link has been severed"))
+ #endif
+ #ifdef ENOMSG
+-_S(ERR_MAP(ENOMSG), N_("No message of desired type"))
++_S(ENOMSG, N_("No message of desired type"))
+ #endif
+ #ifdef ENOSR
+-_S(ERR_MAP(ENOSR), N_("Out of streams resources"))
++_S(ENOSR, N_("Out of streams resources"))
+ #endif
+ #ifdef ENOSTR
+-_S(ERR_MAP(ENOSTR), N_("Device not a stream"))
++_S(ENOSTR, N_("Device not a stream"))
+ #endif
+ #ifdef EOVERFLOW
+-_S(ERR_MAP(EOVERFLOW), N_("Value too large for defined data type"))
++_S(EOVERFLOW, N_("Value too large for defined data type"))
+ #endif
+ #ifdef EPROTO
+-_S(ERR_MAP(EPROTO), N_("Protocol error"))
++_S(EPROTO, N_("Protocol error"))
+ #endif
+ #ifdef ETIME
+-_S(ERR_MAP(ETIME), N_("Timer expired"))
++_S(ETIME, N_("Timer expired"))
+ #endif
+ #ifdef ECANCELED
+ /*
+@@ -543,148 +540,148 @@ TRANS An asynchronous operation was canceled before it
+ TRANS completed.  @xref{Asynchronous I/O}.  When you call @code{aio_cancel},
+ TRANS the normal result is for the operations affected to complete with this
+ TRANS error; @pxref{Cancel AIO Operations}. */
+-_S(ERR_MAP(ECANCELED), N_("Operation canceled"))
++_S(ECANCELED, N_("Operation canceled"))
+ #endif
+ #ifdef EOWNERDEAD
+-_S(ERR_MAP(EOWNERDEAD), N_("Owner died"))
++_S(EOWNERDEAD, N_("Owner died"))
+ #endif
+ #ifdef ENOTRECOVERABLE
+-_S(ERR_MAP(ENOTRECOVERABLE), N_("State not recoverable"))
++_S(ENOTRECOVERABLE, N_("State not recoverable"))
+ #endif
+ #ifdef ERESTART
+-_S(ERR_MAP(ERESTART), N_("Interrupted system call should be restarted"))
++_S(ERESTART, N_("Interrupted system call should be restarted"))
+ #endif
+ #ifdef ECHRNG
+-_S(ERR_MAP(ECHRNG), N_("Channel number out of range"))
++_S(ECHRNG, N_("Channel number out of range"))
+ #endif
+ #ifdef EL2NSYNC
+-_S(ERR_MAP(EL2NSYNC), N_("Level 2 not synchronized"))
++_S(EL2NSYNC, N_("Level 2 not synchronized"))
+ #endif
+ #ifdef EL3HLT
+-_S(ERR_MAP(EL3HLT), N_("Level 3 halted"))
++_S(EL3HLT, N_("Level 3 halted"))
+ #endif
+ #ifdef EL3RST
+-_S(ERR_MAP(EL3RST), N_("Level 3 reset"))
++_S(EL3RST, N_("Level 3 reset"))
+ #endif
+ #ifdef ELNRNG
+-_S(ERR_MAP(ELNRNG), N_("Link number out of range"))
++_S(ELNRNG, N_("Link number out of range"))
+ #endif
+ #ifdef EUNATCH
+-_S(ERR_MAP(EUNATCH), N_("Protocol driver not attached"))
++_S(EUNATCH, N_("Protocol driver not attached"))
+ #endif
+ #ifdef ENOCSI
+-_S(ERR_MAP(ENOCSI), N_("No CSI structure available"))
++_S(ENOCSI, N_("No CSI structure available"))
+ #endif
+ #ifdef EL2HLT
+-_S(ERR_MAP(EL2HLT), N_("Level 2 halted"))
++_S(EL2HLT, N_("Level 2 halted"))
+ #endif
+ #ifdef EBADE
+-_S(ERR_MAP(EBADE), N_("Invalid exchange"))
++_S(EBADE, N_("Invalid exchange"))
+ #endif
+ #ifdef EBADR
+-_S(ERR_MAP(EBADR), N_("Invalid request descriptor"))
++_S(EBADR, N_("Invalid request descriptor"))
+ #endif
+ #ifdef EXFULL
+-_S(ERR_MAP(EXFULL), N_("Exchange full"))
++_S(EXFULL, N_("Exchange full"))
+ #endif
+ #ifdef ENOANO
+-_S(ERR_MAP(ENOANO), N_("No anode"))
++_S(ENOANO, N_("No anode"))
+ #endif
+ #ifdef EBADRQC
+-_S(ERR_MAP(EBADRQC), N_("Invalid request code"))
++_S(EBADRQC, N_("Invalid request code"))
+ #endif
+ #ifdef EBADSLT
+-_S(ERR_MAP(EBADSLT), N_("Invalid slot"))
++_S(EBADSLT, N_("Invalid slot"))
+ #endif
+ #ifdef EBFONT
+-_S(ERR_MAP(EBFONT), N_("Bad font file format"))
++_S(EBFONT, N_("Bad font file format"))
+ #endif
+ #ifdef ENONET
+-_S(ERR_MAP(ENONET), N_("Machine is not on the network"))
++_S(ENONET, N_("Machine is not on the network"))
+ #endif
+ #ifdef ENOPKG
+-_S(ERR_MAP(ENOPKG), N_("Package not installed"))
++_S(ENOPKG, N_("Package not installed"))
+ #endif
+ #ifdef EADV
+-_S(ERR_MAP(EADV), N_("Advertise error"))
++_S(EADV, N_("Advertise error"))
+ #endif
+ #ifdef ESRMNT
+-_S(ERR_MAP(ESRMNT), N_("Srmount error"))
++_S(ESRMNT, N_("Srmount error"))
+ #endif
+ #ifdef ECOMM
+-_S(ERR_MAP(ECOMM), N_("Communication error on send"))
++_S(ECOMM, N_("Communication error on send"))
+ #endif
+ #ifdef EDOTDOT
+-_S(ERR_MAP(EDOTDOT), N_("RFS specific error"))
++_S(EDOTDOT, N_("RFS specific error"))
+ #endif
+ #ifdef ENOTUNIQ
+-_S(ERR_MAP(ENOTUNIQ), N_("Name not unique on network"))
++_S(ENOTUNIQ, N_("Name not unique on network"))
+ #endif
+ #ifdef EBADFD
+-_S(ERR_MAP(EBADFD), N_("File descriptor in bad state"))
++_S(EBADFD, N_("File descriptor in bad state"))
+ #endif
+ #ifdef EREMCHG
+-_S(ERR_MAP(EREMCHG), N_("Remote address changed"))
++_S(EREMCHG, N_("Remote address changed"))
+ #endif
+ #ifdef ELIBACC
+-_S(ERR_MAP(ELIBACC), N_("Can not access a needed shared library"))
++_S(ELIBACC, N_("Can not access a needed shared library"))
+ #endif
+ #ifdef ELIBBAD
+-_S(ERR_MAP(ELIBBAD), N_("Accessing a corrupted shared library"))
++_S(ELIBBAD, N_("Accessing a corrupted shared library"))
+ #endif
+ #ifdef ELIBSCN
+-_S(ERR_MAP(ELIBSCN), N_(".lib section in a.out corrupted"))
++_S(ELIBSCN, N_(".lib section in a.out corrupted"))
+ #endif
+ #ifdef ELIBMAX
+-_S(ERR_MAP(ELIBMAX), N_("Attempting to link in too many shared libraries"))
++_S(ELIBMAX, N_("Attempting to link in too many shared libraries"))
+ #endif
+ #ifdef ELIBEXEC
+-_S(ERR_MAP(ELIBEXEC), N_("Cannot exec a shared library directly"))
++_S(ELIBEXEC, N_("Cannot exec a shared library directly"))
+ #endif
+ #ifdef ESTRPIPE
+-_S(ERR_MAP(ESTRPIPE), N_("Streams pipe error"))
++_S(ESTRPIPE, N_("Streams pipe error"))
+ #endif
+ #ifdef EUCLEAN
+-_S(ERR_MAP(EUCLEAN), N_("Structure needs cleaning"))
++_S(EUCLEAN, N_("Structure needs cleaning"))
+ #endif
+ #ifdef ENOTNAM
+-_S(ERR_MAP(ENOTNAM), N_("Not a XENIX named type file"))
++_S(ENOTNAM, N_("Not a XENIX named type file"))
+ #endif
+ #ifdef ENAVAIL
+-_S(ERR_MAP(ENAVAIL), N_("No XENIX semaphores available"))
++_S(ENAVAIL, N_("No XENIX semaphores available"))
+ #endif
+ #ifdef EISNAM
+-_S(ERR_MAP(EISNAM), N_("Is a named type file"))
++_S(EISNAM, N_("Is a named type file"))
+ #endif
+ #ifdef EREMOTEIO
+-_S(ERR_MAP(EREMOTEIO), N_("Remote I/O error"))
++_S(EREMOTEIO, N_("Remote I/O error"))
+ #endif
+ #ifdef ENOMEDIUM
+-_S(ERR_MAP(ENOMEDIUM), N_("No medium found"))
++_S(ENOMEDIUM, N_("No medium found"))
+ #endif
+ #ifdef EMEDIUMTYPE
+-_S(ERR_MAP(EMEDIUMTYPE), N_("Wrong medium type"))
++_S(EMEDIUMTYPE, N_("Wrong medium type"))
+ #endif
+ #ifdef ENOKEY
+-_S(ERR_MAP(ENOKEY), N_("Required key not available"))
++_S(ENOKEY, N_("Required key not available"))
+ #endif
+ #ifdef EKEYEXPIRED
+-_S(ERR_MAP(EKEYEXPIRED), N_("Key has expired"))
++_S(EKEYEXPIRED, N_("Key has expired"))
+ #endif
+ #ifdef EKEYREVOKED
+-_S(ERR_MAP(EKEYREVOKED), N_("Key has been revoked"))
++_S(EKEYREVOKED, N_("Key has been revoked"))
+ #endif
+ #ifdef EKEYREJECTED
+-_S(ERR_MAP(EKEYREJECTED), N_("Key was rejected by service"))
++_S(EKEYREJECTED, N_("Key was rejected by service"))
+ #endif
+ #ifdef ERFKILL
+-_S(ERR_MAP(ERFKILL), N_("Operation not possible due to RF-kill"))
++_S(ERFKILL, N_("Operation not possible due to RF-kill"))
+ #endif
+ #ifdef EHWPOISON
+-_S(ERR_MAP(EHWPOISON), N_("Memory page has hardware error"))
++_S(EHWPOISON, N_("Memory page has hardware error"))
+ #endif
+ #ifdef EBADRPC
+-_S(ERR_MAP(EBADRPC), N_("RPC struct is bad"))
++_S(EBADRPC, N_("RPC struct is bad"))
+ #endif
+ #ifdef EFTYPE
+ /*
+@@ -693,40 +690,40 @@ TRANS operation, or a data file had the wrong format.
+ TRANS
+ TRANS On some systems @code{chmod} returns this error if you try to set the
+ TRANS sticky bit on a non-directory file; @pxref{Setting Permissions}. */
+-_S(ERR_MAP(EFTYPE), N_("Inappropriate file type or format"))
++_S(EFTYPE, N_("Inappropriate file type or format"))
+ #endif
+ #ifdef EPROCUNAVAIL
+-_S(ERR_MAP(EPROCUNAVAIL), N_("RPC bad procedure for program"))
++_S(EPROCUNAVAIL, N_("RPC bad procedure for program"))
+ #endif
+ #ifdef EAUTH
+-_S(ERR_MAP(EAUTH), N_("Authentication error"))
++_S(EAUTH, N_("Authentication error"))
+ #endif
+ #ifdef EDIED
+ /*
+ TRANS On @gnuhurdsystems{}, opening a file returns this error when the file is
+ TRANS translated by a program and the translator program dies while starting
+ TRANS up, before it has connected to the file. */
+-_S(ERR_MAP(EDIED), N_("Translator died"))
++_S(EDIED, N_("Translator died"))
+ #endif
+ #ifdef ERPCMISMATCH
+-_S(ERR_MAP(ERPCMISMATCH), N_("RPC version wrong"))
++_S(ERPCMISMATCH, N_("RPC version wrong"))
+ #endif
+ #ifdef EGREGIOUS
+ /*
+ TRANS You did @strong{what}? */
+-_S(ERR_MAP(EGREGIOUS), N_("You really blew it this time"))
++_S(EGREGIOUS, N_("You really blew it this time"))
+ #endif
+ #ifdef EPROCLIM
+ /*
+ TRANS This means that the per-user limit on new process would be exceeded by
+ TRANS an attempted @code{fork}.  @xref{Limits on Resources}, for details on
+ TRANS the @code{RLIMIT_NPROC} limit. */
+-_S(ERR_MAP(EPROCLIM), N_("Too many processes"))
++_S(EPROCLIM, N_("Too many processes"))
+ #endif
+ #ifdef EGRATUITOUS
+ /*
+ TRANS This error code has no purpose. */
+-_S(ERR_MAP(EGRATUITOUS), N_("Gratuitous error"))
++_S(EGRATUITOUS, N_("Gratuitous error"))
+ #endif
+ #if defined (ENOTSUP) && ENOTSUP != EOPNOTSUPP
+ /*
+@@ -742,10 +739,10 @@ TRANS values.
+ TRANS
+ TRANS If the entire function is not available at all in the implementation,
+ TRANS it returns @code{ENOSYS} instead. */
+-_S(ERR_MAP(ENOTSUP), N_("Not supported"))
++_S(ENOTSUP, N_("Not supported"))
+ #endif
+ #ifdef EPROGMISMATCH
+-_S(ERR_MAP(EPROGMISMATCH), N_("RPC program version wrong"))
++_S(EPROGMISMATCH, N_("RPC program version wrong"))
+ #endif
+ #ifdef EBACKGROUND
+ /*
+@@ -755,7 +752,7 @@ TRANS foreground process group of the terminal.  Users do not usually see this
+ TRANS error because functions such as @code{read} and @code{write} translate
+ TRANS it into a @code{SIGTTIN} or @code{SIGTTOU} signal.  @xref{Job Control},
+ TRANS for information on process groups and these signals. */
+-_S(ERR_MAP(EBACKGROUND), N_("Inappropriate operation for background process"))
++_S(EBACKGROUND, N_("Inappropriate operation for background process"))
+ #endif
+ #ifdef EIEIO
+ /*
+@@ -773,7 +770,7 @@ TRANS @c "bought the farm" means "died".  -jtobey
+ TRANS @c
+ TRANS @c Translators, please do not translate this litteraly, translate it into
+ TRANS @c an idiomatic funny way of saying that the computer died. */
+-_S(ERR_MAP(EIEIO), N_("Computer bought the farm"))
++_S(EIEIO, N_("Computer bought the farm"))
+ #endif
+ #if defined (EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
+ /*
+@@ -782,18 +779,18 @@ TRANS The values are always the same, on every operating system.
+ TRANS
+ TRANS C libraries in many older Unix systems have @code{EWOULDBLOCK} as a
+ TRANS separate error code. */
+-_S(ERR_MAP(EWOULDBLOCK), N_("Operation would block"))
++_S(EWOULDBLOCK, N_("Operation would block"))
+ #endif
+ #ifdef ENEEDAUTH
+-_S(ERR_MAP(ENEEDAUTH), N_("Need authenticator"))
++_S(ENEEDAUTH, N_("Need authenticator"))
+ #endif
+ #ifdef ED
+ /*
+ TRANS The experienced user will know what is wrong.
+ TRANS @c This error code is a joke.  Its perror text is part of the joke.
+ TRANS @c Don't change it. */
+-_S(ERR_MAP(ED), N_("?"))
++_S(ED, N_("?"))
+ #endif
+ #ifdef EPROGUNAVAIL
+-_S(ERR_MAP(EPROGUNAVAIL), N_("RPC program not available"))
++_S(EPROGUNAVAIL, N_("RPC program not available"))
+ #endif
+diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
+index 9b2a253032..34748ffcd1 100644
+--- a/sysdeps/unix/sysv/linux/Makefile
++++ b/sysdeps/unix/sysv/linux/Makefile
+@@ -100,7 +100,7 @@ tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
+        tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
+        test-errno-linux tst-memfd_create tst-mlock2 tst-pkey \
+        tst-rlimit-infinity tst-ofdlocks tst-gettid tst-gettid-kill \
+-       tst-tgkill
++       tst-tgkill tst-sysvsem-linux tst-sysvmsg-linux tst-sysvshm-linux
+ tests-internal += tst-ofdlocks-compat tst-sigcontext-get_pc
+ CFLAGS-tst-sigcontext-get_pc.c = -fasynchronous-unwind-tables
+diff --git a/sysdeps/unix/sysv/linux/aarch64/configure b/sysdeps/unix/sysv/linux/aarch64/configure
+index 27d50e1d3c..290670a67a 100644
+--- a/sysdeps/unix/sysv/linux/aarch64/configure
++++ b/sysdeps/unix/sysv/linux/aarch64/configure
+@@ -6,10 +6,10 @@ arch_minimum_kernel=3.7.0
+ test -n "$libc_cv_slibdir" ||
+ case "$prefix" in
+ /usr | /usr/)
+-  libc_cv_slibdir='/lib64'
++  libc_cv_slibdir='/lib'
+   libc_cv_rtlddir='/lib'
+   if test "$libdir" = '${exec_prefix}/lib'; then
+-    libdir='${exec_prefix}/lib64';
++    libdir='${exec_prefix}/lib';
+     # Locale data can be shared between 32-bit and 64-bit libraries.
+     libc_cv_complocaledir='${exec_prefix}/lib/locale'
+   fi
+diff --git a/sysdeps/unix/sysv/linux/aarch64/cpu-features.h b/sysdeps/unix/sysv/linux/aarch64/cpu-features.h
+index fc688450ee..00a4d0c8e7 100644
+--- a/sysdeps/unix/sysv/linux/aarch64/cpu-features.h
++++ b/sysdeps/unix/sysv/linux/aarch64/cpu-features.h
+@@ -54,6 +54,10 @@
+                         && MIDR_PARTNUM(midr) == 0x000)
+ #define IS_NEOVERSE_N1(midr) (MIDR_IMPLEMENTOR(midr) == 'A'                 \
+                             && MIDR_PARTNUM(midr) == 0xd0c)
++#define IS_NEOVERSE_N2(midr) (MIDR_IMPLEMENTOR(midr) == 'A'                 \
++                            && MIDR_PARTNUM(midr) == 0xd49)
++#define IS_NEOVERSE_V1(midr) (MIDR_IMPLEMENTOR(midr) == 'A'                 \
++                            && MIDR_PARTNUM(midr) == 0xd40)
+ #define IS_EMAG(midr) (MIDR_IMPLEMENTOR(midr) == 'P'                        \
+                        && MIDR_PARTNUM(midr) == 0x000)
+diff --git a/sysdeps/unix/sysv/linux/msgctl.c b/sysdeps/unix/sysv/linux/msgctl.c
+index 0776472d5e..a1f24ab242 100644
+--- a/sysdeps/unix/sysv/linux/msgctl.c
++++ b/sysdeps/unix/sysv/linux/msgctl.c
+@@ -90,8 +90,15 @@ __msgctl64 (int msqid, int cmd, struct __msqid64_ds *buf)
+   struct kernel_msqid64_ds ksemid, *arg = NULL;
+   if (buf != NULL)
+     {
+-      msqid64_to_kmsqid64 (buf, &ksemid);
+-      arg = &ksemid;
++      /* This is a Linux extension where kernel returns a 'struct msginfo'
++       instead.  */
++      if (cmd == IPC_INFO || cmd == MSG_INFO)
++      arg = (struct kernel_msqid64_ds *) buf;
++      else
++      {
++        msqid64_to_kmsqid64 (buf, &ksemid);
++        arg = &ksemid;
++      }
+     }
+ # ifdef __ASSUME_SYSVIPC_BROKEN_MODE_T
+   if (cmd == IPC_SET)
+@@ -169,8 +176,15 @@ __msgctl (int msqid, int cmd, struct msqid_ds *buf)
+   struct __msqid64_ds msqid64, *buf64 = NULL;
+   if (buf != NULL)
+     {
+-      msqid_to_msqid64 (&msqid64, buf);
+-      buf64 = &msqid64;
++      /* This is a Linux extension where kernel returns a 'struct msginfo'
++       instead.  */
++      if (cmd == IPC_INFO || cmd == MSG_INFO)
++      buf64 = (struct __msqid64_ds *) buf;
++      else
++      {
++        msqid_to_msqid64 (&msqid64, buf);
++        buf64 = &msqid64;
++      }
+     }
+   int ret = __msgctl64 (msqid, cmd, buf64);
+diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c
+index f131a26fc7..1cdabde8f2 100644
+--- a/sysdeps/unix/sysv/linux/semctl.c
++++ b/sysdeps/unix/sysv/linux/semctl.c
+@@ -102,6 +102,7 @@ semun64_to_ksemun64 (int cmd, union semun64 semun64,
+       r.array = semun64.array;
+       break;
+     case SEM_STAT:
++    case SEM_STAT_ANY:
+     case IPC_STAT:
+     case IPC_SET:
+       r.buf = buf;
+@@ -150,6 +151,7 @@ __semctl64 (int semid, int semnum, int cmd, ...)
+     case IPC_STAT:      /* arg.buf */
+     case IPC_SET:
+     case SEM_STAT:
++    case SEM_STAT_ANY:
+     case IPC_INFO:      /* arg.__buf */
+     case SEM_INFO:
+       va_start (ap, cmd);
+@@ -238,6 +240,7 @@ semun_to_semun64 (int cmd, union semun semun, struct __semid64_ds *semid64)
+       r.array = semun.array;
+       break;
+     case SEM_STAT:
++    case SEM_STAT_ANY:
+     case IPC_STAT:
+     case IPC_SET:
+       r.buf = semid64;
+@@ -267,6 +270,7 @@ __semctl (int semid, int semnum, int cmd, ...)
+     case IPC_STAT:      /* arg.buf */
+     case IPC_SET:
+     case SEM_STAT:
++    case SEM_STAT_ANY:
+     case IPC_INFO:      /* arg.__buf */
+     case SEM_INFO:
+       va_start (ap, cmd);
+@@ -321,6 +325,7 @@ __semctl_mode16 (int semid, int semnum, int cmd, ...)
+     case IPC_STAT:      /* arg.buf */
+     case IPC_SET:
+     case SEM_STAT:
++    case SEM_STAT_ANY:
+     case IPC_INFO:      /* arg.__buf */
+     case SEM_INFO:
+       va_start (ap, cmd);
+@@ -354,6 +359,7 @@ __old_semctl (int semid, int semnum, int cmd, ...)
+     case IPC_STAT:      /* arg.buf */
+     case IPC_SET:
+     case SEM_STAT:
++    case SEM_STAT_ANY:
+     case IPC_INFO:      /* arg.__buf */
+     case SEM_INFO:
+       va_start (ap, cmd);
+diff --git a/sysdeps/unix/sysv/linux/shmctl.c b/sysdeps/unix/sysv/linux/shmctl.c
+index 76d88441f1..1d19a798b1 100644
+--- a/sysdeps/unix/sysv/linux/shmctl.c
++++ b/sysdeps/unix/sysv/linux/shmctl.c
+@@ -90,8 +90,15 @@ __shmctl64 (int shmid, int cmd, struct __shmid64_ds *buf)
+   struct kernel_shmid64_ds kshmid, *arg = NULL;
+   if (buf != NULL)
+     {
+-      shmid64_to_kshmid64 (buf, &kshmid);
+-      arg = &kshmid;
++      /* This is a Linux extension where kernel expects either a
++       'struct shminfo' (IPC_INFO) or 'struct shm_info' (SHM_INFO).  */
++      if (cmd == IPC_INFO || cmd == SHM_INFO)
++      arg = (struct kernel_shmid64_ds *) buf;
++      else
++      {
++        shmid64_to_kshmid64 (buf, &kshmid);
++        arg = &kshmid;
++      }
+     }
+ # ifdef __ASSUME_SYSVIPC_BROKEN_MODE_T
+   if (cmd == IPC_SET)
+@@ -107,7 +114,6 @@ __shmctl64 (int shmid, int cmd, struct __shmid64_ds *buf)
+   switch (cmd)
+     {
+-      case IPC_INFO:
+       case IPC_STAT:
+       case SHM_STAT:
+       case SHM_STAT_ANY:
+@@ -168,8 +174,15 @@ __shmctl (int shmid, int cmd, struct shmid_ds *buf)
+   struct __shmid64_ds shmid64, *buf64 = NULL;
+   if (buf != NULL)
+     {
+-      shmid_to_shmid64 (&shmid64, buf);
+-      buf64 = &shmid64;
++      /* This is a Linux extension where kernel expects either a
++       'struct shminfo' (IPC_INFO) or 'struct shm_info' (SHM_INFO).  */
++      if (cmd == IPC_INFO || cmd == SHM_INFO)
++      buf64 = (struct __shmid64_ds *) buf;
++      else
++      {
++        shmid_to_shmid64 (&shmid64, buf);
++        buf64 = &shmid64;
++      }
+     }
+   int ret = __shmctl64 (shmid, cmd, buf64);
+@@ -178,7 +191,6 @@ __shmctl (int shmid, int cmd, struct shmid_ds *buf)
+   switch (cmd)
+     {
+-      case IPC_INFO:
+       case IPC_STAT:
+       case SHM_STAT:
+       case SHM_STAT_ANY:
+diff --git a/sysdeps/unix/sysv/linux/tst-sysvmsg-linux.c b/sysdeps/unix/sysv/linux/tst-sysvmsg-linux.c
+new file mode 100644
+index 0000000000..630f4f792c
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/tst-sysvmsg-linux.c
+@@ -0,0 +1,177 @@
++/* Basic tests for Linux SYSV message queue extensions.
++   Copyright (C) 2020 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, see
++   <https://www.gnu.org/licenses/>.  */
++
++#include <sys/ipc.h>
++#include <sys/msg.h>
++#include <errno.h>
++#include <stdlib.h>
++#include <stdbool.h>
++#include <stdio.h>
++
++#include <support/check.h>
++#include <support/temp_file.h>
++
++#define MSGQ_MODE 0644
++
++/* These are for the temporary file we generate.  */
++static char *name;
++static int msqid;
++
++static void
++remove_msq (void)
++{
++  /* Enforce message queue removal in case of early test failure.
++     Ignore error since the msg may already have being removed.  */
++  msgctl (msqid, IPC_RMID, NULL);
++}
++
++static void
++do_prepare (int argc, char *argv[])
++{
++  TEST_VERIFY_EXIT (create_temp_file ("tst-sysvmsg.", &name) != -1);
++}
++
++#define PREPARE do_prepare
++
++struct test_msginfo
++{
++  int msgmax;
++  int msgmnb;
++  int msgmni;
++};
++
++/* It tries to obtain some system-wide SysV messsage queue information from
++   /proc to check against IPC_INFO/MSG_INFO.  The /proc only returns the
++   tunables value of MSGMAX, MSGMNB, and MSGMNI.
++
++   The kernel also returns constant value for MSGSSZ, MSGSEG and also MSGMAP,
++   MSGPOOL, and MSGTQL (for IPC_INFO).  The issue to check them is they might
++   change over kernel releases.  */
++
++static int
++read_proc_file (const char *file)
++{
++  FILE *f = fopen (file, "r");
++  if (f == NULL)
++    FAIL_UNSUPPORTED ("/proc is not mounted or %s is not available", file);
++
++  int v;
++  int r = fscanf (f, "%d", & v);
++  TEST_VERIFY_EXIT (r == 1);
++
++  fclose (f);
++  return v;
++}
++
++
++/* Check if the message queue with IDX (index into the kernel's internal
++   array) matches the one with KEY.  The CMD is either MSG_STAT or
++   MSG_STAT_ANY.  */
++
++static bool
++check_msginfo (int idx, key_t key, int cmd)
++{
++  struct msqid_ds msginfo;
++  int mid = msgctl (idx, cmd, &msginfo);
++  /* Ignore unused array slot returned by the kernel or information from
++     unknown message queue.  */
++  if ((mid == -1 && errno == EINVAL) || mid != msqid)
++    return false;
++
++  if (mid == -1)
++    FAIL_EXIT1 ("msgctl with %s failed: %m",
++              cmd == MSG_STAT ? "MSG_STAT" : "MSG_STAT_ANY");
++
++  TEST_COMPARE (msginfo.msg_perm.__key, key);
++  TEST_COMPARE (msginfo.msg_perm.mode, MSGQ_MODE);
++  TEST_COMPARE (msginfo.msg_qnum, 0);
++
++  return true;
++}
++
++static int
++do_test (void)
++{
++  atexit (remove_msq);
++
++  key_t key = ftok (name, 'G');
++  if (key == -1)
++    FAIL_EXIT1 ("ftok failed: %m");
++
++  msqid = msgget (key, MSGQ_MODE | IPC_CREAT);
++  if (msqid == -1)
++    FAIL_EXIT1 ("msgget failed: %m");
++
++  struct test_msginfo tipcinfo;
++  tipcinfo.msgmax = read_proc_file ("/proc/sys/kernel/msgmax");
++  tipcinfo.msgmnb = read_proc_file ("/proc/sys/kernel/msgmnb");
++  tipcinfo.msgmni = read_proc_file ("/proc/sys/kernel/msgmni");
++
++  int msqidx;
++
++  {
++    struct msginfo ipcinfo;
++    msqidx = msgctl (msqid, IPC_INFO, (struct msqid_ds *) &ipcinfo);
++    if (msqidx == -1)
++      FAIL_EXIT1 ("msgctl with IPC_INFO failed: %m");
++
++    TEST_COMPARE (ipcinfo.msgmax, tipcinfo.msgmax);
++    TEST_COMPARE (ipcinfo.msgmnb, tipcinfo.msgmnb);
++    TEST_COMPARE (ipcinfo.msgmni, tipcinfo.msgmni);
++  }
++
++  /* Same as before but with MSG_INFO.  */
++  {
++    struct msginfo ipcinfo;
++    msqidx = msgctl (msqid, MSG_INFO, (struct msqid_ds *) &ipcinfo);
++    if (msqidx == -1)
++      FAIL_EXIT1 ("msgctl with IPC_INFO failed: %m");
++
++    TEST_COMPARE (ipcinfo.msgmax, tipcinfo.msgmax);
++    TEST_COMPARE (ipcinfo.msgmnb, tipcinfo.msgmnb);
++    TEST_COMPARE (ipcinfo.msgmni, tipcinfo.msgmni);
++  }
++
++  /* We check if the created message queue shows in global list.  */
++  bool found = false;
++  for (int i = 0; i <= msqidx; i++)
++    {
++      /* We can't tell apart if MSG_STAT_ANY is not supported (kernel older
++       than 4.17) or if the index used is invalid.  So it just check if the
++       value returned from a valid call matches the created message
++       queue.  */
++      check_msginfo (i, key, MSG_STAT_ANY);
++
++      if (check_msginfo (i, key, MSG_STAT))
++      {
++        found = true;
++        break;
++      }
++    }
++
++  if (!found)
++    FAIL_EXIT1 ("msgctl with MSG_STAT/MSG_STAT_ANY could not find the "
++              "created message queue");
++
++  if (msgctl (msqid, IPC_RMID, NULL) == -1)
++    FAIL_EXIT1 ("msgctl failed");
++
++  return 0;
++}
++
++#include <support/test-driver.c>
+diff --git a/sysdeps/unix/sysv/linux/tst-sysvsem-linux.c b/sysdeps/unix/sysv/linux/tst-sysvsem-linux.c
+new file mode 100644
+index 0000000000..45f19e2d37
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/tst-sysvsem-linux.c
+@@ -0,0 +1,184 @@
++/* Basic tests for Linux SYSV semaphore extensions.
++   Copyright (C) 2020 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, see
++   <https://www.gnu.org/licenses/>.  */
++
++#include <sys/ipc.h>
++#include <sys/sem.h>
++#include <errno.h>
++#include <stdlib.h>
++#include <stdbool.h>
++#include <stdio.h>
++
++#include <support/check.h>
++#include <support/temp_file.h>
++
++/* These are for the temporary file we generate.  */
++static char *name;
++static int semid;
++
++static void
++remove_sem (void)
++{
++  /* Enforce message queue removal in case of early test failure.
++     Ignore error since the sem may already have being removed.  */
++  semctl (semid, 0, IPC_RMID, 0);
++}
++
++static void
++do_prepare (int argc, char *argv[])
++{
++  TEST_VERIFY_EXIT (create_temp_file ("tst-sysvsem.", &name) != -1);
++}
++
++#define PREPARE do_prepare
++
++#define SEM_MODE 0644
++
++union semun
++{
++  int val;
++  struct semid_ds *buf;
++  unsigned short  *array;
++  struct seminfo *__buf;
++};
++
++struct test_seminfo
++{
++  int semmsl;
++  int semmns;
++  int semopm;
++  int semmni;
++};
++
++/* It tries to obtain some system-wide SysV semaphore information from /proc
++   to check against IPC_INFO/SEM_INFO.  The /proc only returns the tunables
++   value of SEMMSL, SEMMNS, SEMOPM, and SEMMNI.
++
++   The kernel also returns constant value for SEMVMX, SEMMNU, SEMMAP, SEMUME,
++   and also SEMUSZ and SEMAEM (for IPC_INFO).  The issue to check them is they
++   might change over kernel releases.  */
++
++static void
++read_sem_stat (struct test_seminfo *tseminfo)
++{
++  FILE *f = fopen ("/proc/sys/kernel/sem", "r");
++  if (f == NULL)
++    FAIL_UNSUPPORTED ("/proc is not mounted or /proc/sys/kernel/sem is not "
++                    "available");
++
++  int r = fscanf (f, "%d %d %d %d",
++                &tseminfo->semmsl, &tseminfo->semmns, &tseminfo->semopm,
++                &tseminfo->semmni);
++  TEST_VERIFY_EXIT (r == 4);
++
++  fclose (f);
++}
++
++
++/* Check if the semaphore with IDX (index into the kernel's internal array)
++   matches the one with KEY.  The CMD is either SEM_STAT or SEM_STAT_ANY.  */
++
++static bool
++check_seminfo (int idx, key_t key, int cmd)
++{
++  struct semid_ds seminfo;
++  int sid = semctl (idx, 0, cmd, (union semun) { .buf = &seminfo });
++  /* Ignore unused array slot returned by the kernel or information from
++     unknown semaphores.  */
++  if ((sid == -1 && errno == EINVAL) || sid != semid)
++    return false;
++
++  if (sid == -1)
++    FAIL_EXIT1 ("semctl with SEM_STAT failed (errno=%d)", errno);
++
++  TEST_COMPARE (seminfo.sem_perm.__key, key);
++  TEST_COMPARE (seminfo.sem_perm.mode, SEM_MODE);
++  TEST_COMPARE (seminfo.sem_nsems, 1);
++
++  return true;
++}
++
++static int
++do_test (void)
++{
++  atexit (remove_sem);
++
++  key_t key = ftok (name, 'G');
++  if (key == -1)
++    FAIL_EXIT1 ("ftok failed: %m");
++
++  semid = semget (key, 1, IPC_CREAT | IPC_EXCL | SEM_MODE);
++  if (semid == -1)
++    FAIL_EXIT1 ("semget failed: %m");
++
++  struct test_seminfo tipcinfo;
++  read_sem_stat (&tipcinfo);
++
++  int semidx;
++
++  {
++    struct seminfo ipcinfo;
++    semidx = semctl (semid, 0, IPC_INFO, (union semun) { .__buf = &ipcinfo });
++    if (semidx == -1)
++      FAIL_EXIT1 ("semctl with IPC_INFO failed: %m");
++
++    TEST_COMPARE (ipcinfo.semmsl, tipcinfo.semmsl);
++    TEST_COMPARE (ipcinfo.semmns, tipcinfo.semmns);
++    TEST_COMPARE (ipcinfo.semopm, tipcinfo.semopm);
++    TEST_COMPARE (ipcinfo.semmni, tipcinfo.semmni);
++  }
++
++  /* Same as before but with SEM_INFO.  */
++  {
++    struct seminfo ipcinfo;
++    semidx = semctl (semid, 0, SEM_INFO, (union semun) { .__buf = &ipcinfo });
++    if (semidx == -1)
++      FAIL_EXIT1 ("semctl with IPC_INFO failed: %m");
++
++    TEST_COMPARE (ipcinfo.semmsl, tipcinfo.semmsl);
++    TEST_COMPARE (ipcinfo.semmns, tipcinfo.semmns);
++    TEST_COMPARE (ipcinfo.semopm, tipcinfo.semopm);
++    TEST_COMPARE (ipcinfo.semmni, tipcinfo.semmni);
++  }
++
++  /* We check if the created semaphore shows in the system-wide status.  */
++  bool found = false;
++  for (int i = 0; i <= semidx; i++)
++    {
++      /* We can't tell apart if SEM_STAT_ANY is not supported (kernel older
++       than 4.17) or if the index used is invalid.  So it just check if
++       value returned from a valid call matches the created semaphore.  */
++      check_seminfo (i, key, SEM_STAT_ANY);
++
++      if (check_seminfo (i, key, SEM_STAT))
++      {
++        found = true;
++        break;
++      }
++    }
++
++  if (!found)
++    FAIL_EXIT1 ("semctl with SEM_STAT/SEM_STAT_ANY could not find the "
++              "created  semaphore");
++
++  if (semctl (semid, 0, IPC_RMID, 0) == -1)
++    FAIL_EXIT1 ("semctl failed: %m");
++
++  return 0;
++}
++
++#include <support/test-driver.c>
+diff --git a/sysdeps/unix/sysv/linux/tst-sysvshm-linux.c b/sysdeps/unix/sysv/linux/tst-sysvshm-linux.c
+new file mode 100644
+index 0000000000..7128ae2e14
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/tst-sysvshm-linux.c
+@@ -0,0 +1,185 @@
++/* Basic tests for Linux SYSV shared memory extensions.
++   Copyright (C) 2020 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, see
++   <https://www.gnu.org/licenses/>.  */
++
++#include <sys/ipc.h>
++#include <sys/shm.h>
++#include <errno.h>
++#include <stdlib.h>
++#include <stdbool.h>
++#include <stdio.h>
++#include <unistd.h>
++#include <inttypes.h>
++#include <limits.h>
++
++#include <support/check.h>
++#include <support/temp_file.h>
++
++#define SHM_MODE 0644
++
++/* These are for the temporary file we generate.  */
++static char *name;
++static int shmid;
++static long int pgsz;
++
++static void
++remove_shm (void)
++{
++  /* Enforce message queue removal in case of early test failure.
++     Ignore error since the shm may already have being removed.  */
++  shmctl (shmid, IPC_RMID, NULL);
++}
++
++static void
++do_prepare (int argc, char *argv[])
++{
++  TEST_VERIFY_EXIT (create_temp_file ("tst-sysvshm.", &name) != -1);
++}
++
++#define PREPARE do_prepare
++
++struct test_shminfo
++{
++  unsigned long int shmall;
++  unsigned long int shmmax;
++  unsigned long int shmmni;
++};
++
++/* It tries to obtain some system-wide SysV shared memory information from
++   /proc to check against IPC_INFO/SHM_INFO.  The /proc only returns the
++   tunables value of SHMALL, SHMMAX, and SHMMNI.  */
++
++static uint64_t
++read_proc_file (const char *file)
++{
++  FILE *f = fopen (file, "r");
++  if (f == NULL)
++    FAIL_UNSUPPORTED ("/proc is not mounted or %s is not available", file);
++
++  /* Handle 32-bit binaries running on 64-bit kernels.  */
++  uint64_t v;
++  int r = fscanf (f, "%" SCNu64, &v);
++  TEST_VERIFY_EXIT (r == 1);
++
++  fclose (f);
++  return v;
++}
++
++
++/* Check if the message queue with IDX (index into the kernel's internal
++   array) matches the one with KEY.  The CMD is either SHM_STAT or
++   SHM_STAT_ANY.  */
++
++static bool
++check_shminfo (int idx, key_t key, int cmd)
++{
++  struct shmid_ds shminfo;
++  int sid = shmctl (idx, cmd, &shminfo);
++  /* Ignore unused array slot returned by the kernel or information from
++     unknown message queue.  */
++  if ((sid == -1 && errno == EINVAL) || sid != shmid)
++    return false;
++
++  if (sid == -1)
++    FAIL_EXIT1 ("shmctl with %s failed: %m",
++              cmd == SHM_STAT ? "SHM_STAT" : "SHM_STAT_ANY");
++
++  TEST_COMPARE (shminfo.shm_perm.__key, key);
++  TEST_COMPARE (shminfo.shm_perm.mode, SHM_MODE);
++  TEST_COMPARE (shminfo.shm_segsz, pgsz);
++
++  return true;
++}
++
++static int
++do_test (void)
++{
++  atexit (remove_shm);
++
++  pgsz = sysconf (_SC_PAGESIZE);
++  if (pgsz == -1)
++    FAIL_EXIT1 ("sysconf (_SC_PAGESIZE) failed: %m");
++
++  key_t key = ftok (name, 'G');
++  if (key == -1)
++    FAIL_EXIT1 ("ftok failed: %m");
++
++  shmid = shmget (key, pgsz, IPC_CREAT | IPC_EXCL | SHM_MODE);
++  if (shmid == -1)
++    FAIL_EXIT1 ("shmget failed: %m");
++
++  struct test_shminfo tipcinfo;
++  {
++    uint64_t v = read_proc_file ("/proc/sys/kernel/shmmax");
++#if LONG_MAX == INT_MAX
++    /* Kernel explicit clamp the value for shmmax on compat symbol (32-bit
++       binaries running on 64-bit kernels).  */
++    if (v > INT_MAX)
++      v = INT_MAX;
++#endif
++    tipcinfo.shmmax = v;
++  }
++  tipcinfo.shmall = read_proc_file ("/proc/sys/kernel/shmall");
++  tipcinfo.shmmni = read_proc_file ("/proc/sys/kernel/shmmni");
++
++  int shmidx;
++
++  /* Note: SHM_INFO does not return a shminfo, but rather a 'struct shm_info'.
++     It is tricky to verify its values since the syscall returns system wide
++     resources consumed by shared memory.  The shmctl implementation handles
++     SHM_INFO as IPC_INFO, so the IPC_INFO test should validate SHM_INFO as
++     well.  */
++
++  {
++    struct shminfo ipcinfo;
++    shmidx = shmctl (shmid, IPC_INFO, (struct shmid_ds *) &ipcinfo);
++    if (shmidx == -1)
++      FAIL_EXIT1 ("shmctl with IPC_INFO failed: %m");
++
++    TEST_COMPARE (ipcinfo.shmall, tipcinfo.shmall);
++    TEST_COMPARE (ipcinfo.shmmax, tipcinfo.shmmax);
++    TEST_COMPARE (ipcinfo.shmmni, tipcinfo.shmmni);
++  }
++
++  /* We check if the created shared memory shows in the global list.  */
++  bool found = false;
++  for (int i = 0; i <= shmidx; i++)
++    {
++      /* We can't tell apart if SHM_STAT_ANY is not supported (kernel older
++       than 4.17) or if the index used is invalid.  So it just check if
++       value returned from a valid call matches the created message
++       queue.  */
++      check_shminfo (i, key, SHM_STAT_ANY);
++
++      if (check_shminfo (i, key, SHM_STAT))
++      {
++        found = true;
++        break;
++      }
++    }
++
++  if (!found)
++    FAIL_EXIT1 ("shmctl with SHM_STAT/SHM_STAT_ANY could not find the "
++              "created shared memory");
++
++  if (shmctl (shmid, IPC_RMID, NULL) == -1)
++    FAIL_EXIT1 ("shmctl failed");
++
++  return 0;
++}
++
++#include <support/test-driver.c>
+diff --git a/sysdeps/unix/sysv/linux/x86_64/64/configure b/sysdeps/unix/sysv/linux/x86_64/64/configure
+index 9d298faba7..cef1ec842c 100644
+--- a/sysdeps/unix/sysv/linux/x86_64/64/configure
++++ b/sysdeps/unix/sysv/linux/x86_64/64/configure
+@@ -4,10 +4,10 @@
+ test -n "$libc_cv_slibdir" ||
+ case "$prefix" in
+ /usr | /usr/)
+-  libc_cv_slibdir='/lib64'
+-  libc_cv_rtlddir='/lib64'
++  libc_cv_slibdir='/lib'
++  libc_cv_rtlddir='/lib'
+   if test "$libdir" = '${exec_prefix}/lib'; then
+-    libdir='${exec_prefix}/lib64';
++    libdir='${exec_prefix}/lib';
+     # Locale data can be shared between 32-bit and 64-bit libraries.
+     libc_cv_complocaledir='${exec_prefix}/lib/locale'
+   fi
+diff --git a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
+index 062c04689d..7783757726 100644
+--- a/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
++++ b/sysdeps/unix/sysv/linux/x86_64/ldconfig.h
+@@ -18,9 +18,9 @@
+ #include <sysdeps/generic/ldconfig.h>
+ #define SYSDEP_KNOWN_INTERPRETER_NAMES \
+-  { "/lib/ld-linux.so.2", FLAG_ELF_LIBC6 }, \
++  { "/lib32/ld-linux.so.2", FLAG_ELF_LIBC6 }, \
+   { "/libx32/ld-linux-x32.so.2", FLAG_ELF_LIBC6 }, \
+-  { "/lib64/ld-linux-x86-64.so.2", FLAG_ELF_LIBC6 },
++  { "/lib/ld-linux-x86-64.so.2", FLAG_ELF_LIBC6 },
+ #define SYSDEP_KNOWN_LIBRARY_NAMES \
+   { "libc.so.6", FLAG_ELF_LIBC6 },    \
+   { "libm.so.6", FLAG_ELF_LIBC6 },
+diff --git a/sysdeps/unix/sysv/linux/x86_64/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/x86_64/ldd-rewrite.sed
+index 44d76e8aa1..7d6cb1e20b 100644
+--- a/sysdeps/unix/sysv/linux/x86_64/ldd-rewrite.sed
++++ b/sysdeps/unix/sysv/linux/x86_64/ldd-rewrite.sed
+@@ -1,3 +1,3 @@
+ /LD_TRACE_LOADED_OBJECTS=1/a\
+ add_env="$add_env LD_LIBRARY_VERSION=\\$verify_out"
+-s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|x32\)\(/[^/]*\)\(-x86-64\|-x32\)\(\.so\.[0-9.]*\)[   ]*$_\1"\2\4\6 \264\4-x86-64\6 \2x32\4-x32\6"_
++s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|x32\)\(/[^/]*\)\(-x86-64\|-x32\)\(\.so\.[0-9.]*\)[    ]*$_\1"\232\4\6 \2\4-x86-64\6 \2x32\4-x32\6"_
+diff --git a/sysdeps/x86_64/fpu/multiarch/ifunc-fma4.h b/sysdeps/x86_64/fpu/multiarch/ifunc-fma4.h
+index 7659758972..e5fd5ac9cb 100644
+--- a/sysdeps/x86_64/fpu/multiarch/ifunc-fma4.h
++++ b/sysdeps/x86_64/fpu/multiarch/ifunc-fma4.h
+@@ -32,7 +32,7 @@ IFUNC_SELECTOR (void)
+       && CPU_FEATURE_USABLE_P (cpu_features, AVX2))
+     return OPTIMIZE (fma);
+-  if (CPU_FEATURE_USABLE_P (cpu_features, FMA))
++  if (CPU_FEATURE_USABLE_P (cpu_features, FMA4))
+     return OPTIMIZE (fma4);
+   return OPTIMIZE (sse2);
+diff --git a/sysvipc/test-sysvsem.c b/sysvipc/test-sysvsem.c
+index 01dbff343a..b7284e0b48 100644
+--- a/sysvipc/test-sysvsem.c
++++ b/sysvipc/test-sysvsem.c
+@@ -20,6 +20,7 @@
+ #include <stdlib.h>
+ #include <errno.h>
+ #include <string.h>
++#include <stdbool.h>
+ #include <sys/types.h>
+ #include <sys/ipc.h>
+ #include <sys/sem.h>
+diff --git a/version.h b/version.h
+index 83cd196798..e6ca7a8857 100644
+--- a/version.h
++++ b/version.h
+@@ -1,4 +1,4 @@
+ /* This file just defines the current version number of libc.  */
+-#define RELEASE "release"
++#define RELEASE "stable"
+ #define VERSION "2.32"