diff options
-rw-r--r-- | .SRCINFO | 8 | ||||
-rw-r--r-- | 0001-Revert-Assume-prlimit64-is-available.patch | 171 | ||||
-rw-r--r-- | 0002-x86-Add-x86_64-to-x86-64-HWCAP-BZ-22093.patch | 223 | ||||
-rw-r--r-- | PKGBUILD | 12 |
4 files changed, 409 insertions, 5 deletions
@@ -1,7 +1,7 @@ pkgbase = glibc-wsl pkgdesc = GNU C Library pkgver = 2.26 - pkgrel = 3 + pkgrel = 4 url = http://www.gnu.org/software/libc install = glibc.install arch = i686 @@ -15,7 +15,7 @@ pkgbase = glibc-wsl depends = tzdata depends = filesystem optdepends = gd: for memusagestat - provides = glibc=2.26-3 + provides = glibc=2.26-4 conflicts = glibc options = !strip options = staticlibs @@ -26,12 +26,16 @@ pkgbase = glibc-wsl source = locale.gen.txt source = locale-gen source = 0001-Don-t-use-IFUNC-resolver-for-longjmp-or-system-in-li.patch + source = 0002-x86-Add-x86_64-to-x86-64-HWCAP-BZ-22093.patch source = 0001-Revert-linux-spawni.c-simplify-error-reporting-to-pa.patch + source = 0001-Revert-Assume-prlimit64-is-available.patch md5sums = SKIP md5sums = 07ac979b6ab5eeb778d55f041529d623 md5sums = 476e9113489f93b348b21e144b6a8fcf md5sums = cbc073315c00b03898b7fc614274d6b3 + md5sums = bd9b13f3294b6357baa809e4416b9f44 md5sums = a987eab514bee92cc627453c777896e8 + md5sums = 5758d6e2a0ca3dbd6019063f895b64da pkgname = glibc-wsl diff --git a/0001-Revert-Assume-prlimit64-is-available.patch b/0001-Revert-Assume-prlimit64-is-available.patch new file mode 100644 index 000000000000..b76e43b2abf3 --- /dev/null +++ b/0001-Revert-Assume-prlimit64-is-available.patch @@ -0,0 +1,171 @@ +From e2cfb44540873fc0a566a8a119c550a64a38c319 Mon Sep 17 00:00:00 2001 +From: Patrick Stewart <patrick@rfcreations.com> +Date: Thu, 14 Sep 2017 18:26:22 +0100 +Subject: [PATCH] Revert "Assume prlimit64 is available." + +This reverts commit 695d7d138eda449678a1650a8b8b58181033353f. +--- + sysdeps/unix/sysv/linux/getrlimit64.c | 35 ++++++++++++++++++++++++++++++- + sysdeps/unix/sysv/linux/kernel-features.h | 5 +++++ + sysdeps/unix/sysv/linux/prlimit.c | 10 +++++++++ + sysdeps/unix/sysv/linux/setrlimit.c | 7 ++++++- + sysdeps/unix/sysv/linux/setrlimit64.c | 31 ++++++++++++++++++++++++++- + 5 files changed, 85 insertions(+), 3 deletions(-) + +diff --git a/sysdeps/unix/sysv/linux/getrlimit64.c b/sysdeps/unix/sysv/linux/getrlimit64.c +index 56af3c0646..37c173286f 100644 +--- a/sysdeps/unix/sysv/linux/getrlimit64.c ++++ b/sysdeps/unix/sysv/linux/getrlimit64.c +@@ -35,7 +35,40 @@ + int + __getrlimit64 (enum __rlimit_resource resource, struct rlimit64 *rlimits) + { +- return INLINE_SYSCALL_CALL (prlimit64, 0, resource, NULL, rlimits); ++#ifdef __NR_prlimit64 ++ int res = INLINE_SYSCALL_CALL (prlimit64, 0, resource, NULL, rlimits); ++ if (res == 0 || errno != ENOSYS) ++ return res; ++#endif ++ ++/* The fallback code only makes sense if the platform supports either ++ __NR_ugetrlimit and/or __NR_getrlimit. */ ++#if defined (__NR_ugetrlimit) || defined (__NR_getrlimit) ++# ifndef __NR_ugetrlimit ++# define __NR_ugetrlimit __NR_getrlimit ++# endif ++# if __RLIM_T_MATCHES_RLIM64_T ++# define rlimits32 (*rlimits) ++# else ++ struct rlimit rlimits32; ++# endif ++ ++ if (INLINE_SYSCALL_CALL (ugetrlimit, resource, &rlimits32) < 0) ++ return -1; ++ ++# if !__RLIM_T_MATCHES_RLIM64_T ++ if (rlimits32.rlim_cur == RLIM_INFINITY) ++ rlimits->rlim_cur = RLIM64_INFINITY; ++ else ++ rlimits->rlim_cur = rlimits32.rlim_cur; ++ if (rlimits32.rlim_max == RLIM_INFINITY) ++ rlimits->rlim_max = RLIM64_INFINITY; ++ else ++ rlimits->rlim_max = rlimits32.rlim_max; ++# endif /* !__RLIM_T_MATCHES_RLIM64_T */ ++#endif /* defined (__NR_ugetrlimit) || defined (__NR_getrlimit) */ ++ ++ return 0; + } + libc_hidden_def (__getrlimit64) + +diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h +index 9495db4fef..38788a75fb 100644 +--- a/sysdeps/unix/sysv/linux/kernel-features.h ++++ b/sysdeps/unix/sysv/linux/kernel-features.h +@@ -81,6 +81,11 @@ + /* Support for sendmmsg functionality was added in 3.0. */ + #define __ASSUME_SENDMMSG 1 + ++/* prlimit64 is available in 2.6.36. */ ++#if __LINUX_KERNEL_VERSION >= 0x020624 ++# define __ASSUME_PRLIMIT64 1 ++#endif ++ + /* On most architectures, most socket syscalls are supported for all + supported kernel versions, but on some socketcall architectures + separate syscalls were only added later. */ +diff --git a/sysdeps/unix/sysv/linux/prlimit.c b/sysdeps/unix/sysv/linux/prlimit.c +index d31980f10c..2996e73b81 100644 +--- a/sysdeps/unix/sysv/linux/prlimit.c ++++ b/sysdeps/unix/sysv/linux/prlimit.c +@@ -20,6 +20,7 @@ + #include <sys/syscall.h> + + ++#ifdef __NR_prlimit64 + int + prlimit (__pid_t pid, enum __rlimit_resource resource, + const struct rlimit *new_rlimit, struct rlimit *old_rlimit) +@@ -72,3 +73,12 @@ prlimit (__pid_t pid, enum __rlimit_resource resource, + + return res; + } ++#else ++int ++prlimit (__pid_t pid, enum __rlimit_resource resource, ++ const struct rlimit *new_rlimit, struct rlimit *old_rlimit) ++{ ++ return INLINE_SYSCALL_ERROR_RETURN_VALUE (ENOSYS); ++} ++stub_warning (prlimit) ++#endif +diff --git a/sysdeps/unix/sysv/linux/setrlimit.c b/sysdeps/unix/sysv/linux/setrlimit.c +index 8773c78236..01812ac355 100644 +--- a/sysdeps/unix/sysv/linux/setrlimit.c ++++ b/sysdeps/unix/sysv/linux/setrlimit.c +@@ -34,6 +34,7 @@ + int + __setrlimit (enum __rlimit_resource resource, const struct rlimit *rlim) + { ++# ifdef __NR_prlimit64 + struct rlimit64 rlim64; + + if (rlim->rlim_cur == RLIM_INFINITY) +@@ -45,7 +46,11 @@ __setrlimit (enum __rlimit_resource resource, const struct rlimit *rlim) + else + rlim64.rlim_max = rlim->rlim_max; + +- return INLINE_SYSCALL_CALL (prlimit64, 0, resource, &rlim64, NULL); ++ int res = INLINE_SYSCALL_CALL (prlimit64, 0, resource, &rlim64, NULL); ++ if (res == 0 || errno != ENOSYS) ++ return res; ++# endif ++ return INLINE_SYSCALL_CALL (setrlimit, resource, rlim); + } + + # if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) +diff --git a/sysdeps/unix/sysv/linux/setrlimit64.c b/sysdeps/unix/sysv/linux/setrlimit64.c +index db1960fc18..2dd129d99e 100644 +--- a/sysdeps/unix/sysv/linux/setrlimit64.c ++++ b/sysdeps/unix/sysv/linux/setrlimit64.c +@@ -36,7 +36,36 @@ + int + __setrlimit64 (enum __rlimit_resource resource, const struct rlimit64 *rlimits) + { +- return INLINE_SYSCALL_CALL (prlimit64, 0, resource, rlimits, NULL); ++ int res; ++ ++#ifdef __NR_prlimit64 ++ res = INLINE_SYSCALL_CALL (prlimit64, 0, resource, rlimits, NULL); ++ if (res == 0 || errno != ENOSYS) ++ return res; ++#endif ++ ++/* The fallback code only makes sense if the platform supports ++ __NR_setrlimit. */ ++#ifdef __NR_setrlimit ++# if !__RLIM_T_MATCHES_RLIM64_T ++ struct rlimit rlimits32; ++ ++ if (rlimits->rlim_cur >= RLIM_INFINITY) ++ rlimits32.rlim_cur = RLIM_INFINITY; ++ else ++ rlimits32.rlim_cur = rlimits->rlim_cur; ++ if (rlimits->rlim_max >= RLIM_INFINITY) ++ rlimits32.rlim_max = RLIM_INFINITY; ++ else ++ rlimits32.rlim_max = rlimits->rlim_max; ++# else ++# define rlimits32 (*rlimits) ++# endif ++ ++ res = INLINE_SYSCALL_CALL (setrlimit, resource, &rlimits32); ++#endif ++ ++ return res; + } + weak_alias (__setrlimit64, setrlimit64) + +-- +2.14.1 + diff --git a/0002-x86-Add-x86_64-to-x86-64-HWCAP-BZ-22093.patch b/0002-x86-Add-x86_64-to-x86-64-HWCAP-BZ-22093.patch new file mode 100644 index 000000000000..9d1f6ed66a05 --- /dev/null +++ b/0002-x86-Add-x86_64-to-x86-64-HWCAP-BZ-22093.patch @@ -0,0 +1,223 @@ +From 45ff34638f034877b6a490c217d6a0632ce263f4 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" <hjl.tools@gmail.com> +Date: Mon, 11 Sep 2017 08:18:11 -0700 +Subject: [PATCH] x86: Add x86_64 to x86-64 HWCAP [BZ #22093] + +Before glibc 2.26, ld.so set dl_platform to "x86_64" and searched the +"x86_64" subdirectory when loading a shared library. ld.so in glibc +2.26 was changed to set dl_platform to "haswell" or "xeon_phi", based +on supported ISAs. This led to shared library loading failure for +shared libraries placed under the "x86_64" subdirectory. + +This patch adds "x86_64" to x86-64 dl_hwcap so that ld.so will always +search the "x86_64" subdirectory when loading a shared library. + +NB: We can't set x86-64 dl_platform to "x86-64" since ld.so will skip +the "haswell" and "xeon_phi" subdirectories on "haswell" and "xeon_phi" +machines. + +Tested on i686 and x86-64. + + [BZ #22093] + * sysdeps/x86/cpu-features.c (init_cpu_features): Initialize + GLRO(dl_hwcap) to HWCAP_X86_64 for x86-64. + * sysdeps/x86/dl-hwcap.h (HWCAP_COUNT): Updated. + (HWCAP_IMPORTANT): Likewise. + (HWCAP_X86_64): New enum. + (HWCAP_X86_AVX512_1): Updated. + * sysdeps/x86/dl-procinfo.c (_dl_x86_hwcap_flags): Add "x86_64". + * sysdeps/x86_64/Makefile (tests): Add tst-x86_64-1. + (modules-names): Add x86_64/tst-x86_64mod-1. + (LDFLAGS-tst-x86_64mod-1.so): New. + ($(objpfx)tst-x86_64-1): Likewise. + ($(objpfx)x86_64/tst-x86_64mod-1.os): Likewise. + (tst-x86_64-1-clean): Likewise. + * sysdeps/x86_64/tst-x86_64-1.c: New file. + * sysdeps/x86_64/tst-x86_64mod-1.c: Likewise. +--- + sysdeps/x86/cpu-features.c | 3 ++- + sysdeps/x86/dl-hwcap.h | 12 +++++++----- + sysdeps/x86/dl-procinfo.c | 4 ++-- + sysdeps/x86_64/Makefile | 17 +++++++++++++++++ + sysdeps/x86_64/tst-x86_64-1.c | 26 ++++++++++++++++++++++++++ + sysdeps/x86_64/tst-x86_64mod-1.c | 22 ++++++++++++++++++++++ + 7 files changed, 76 insertions(+), 8 deletions(-) + create mode 100644 sysdeps/x86_64/tst-x86_64-1.c + create mode 100644 sysdeps/x86_64/tst-x86_64mod-1.c + +diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c +index 6f900840d4..c267f17b76 100644 +--- a/sysdeps/x86/cpu-features.c ++++ b/sysdeps/x86/cpu-features.c +@@ -336,7 +336,6 @@ no_cpuid: + + /* Reuse dl_platform, dl_hwcap and dl_hwcap_mask for x86. */ + GLRO(dl_platform) = NULL; +- GLRO(dl_hwcap) = 0; + #if !HAVE_TUNABLES && defined SHARED + /* The glibc.tune.hwcap_mask tunable is initialized already, so no need to do + this. */ +@@ -344,6 +343,7 @@ no_cpuid: + #endif + + #ifdef __x86_64__ ++ GLRO(dl_hwcap) = HWCAP_X86_64; + if (cpu_features->kind == arch_kind_intel) + { + if (CPU_FEATURES_ARCH_P (cpu_features, AVX512F_Usable) +@@ -374,6 +374,7 @@ no_cpuid: + GLRO(dl_platform) = "haswell"; + } + #else ++ GLRO(dl_hwcap) = 0; + if (CPU_FEATURES_CPU_P (cpu_features, SSE2)) + GLRO(dl_hwcap) |= HWCAP_X86_SSE2; + +diff --git a/sysdeps/x86/dl-hwcap.h b/sysdeps/x86/dl-hwcap.h +index c95668415a..38627e9eef 100644 +--- a/sysdeps/x86/dl-hwcap.h ++++ b/sysdeps/x86/dl-hwcap.h +@@ -24,15 +24,16 @@ + # define HWCAP_PLATFORMS_START 0 + # define HWCAP_PLATFORMS_COUNT 4 + # define HWCAP_START 0 +-# define HWCAP_COUNT 2 +-# define HWCAP_IMPORTANT (HWCAP_X86_SSE2 | HWCAP_X86_AVX512_1) ++# define HWCAP_COUNT 3 ++# define HWCAP_IMPORTANT \ ++ (HWCAP_X86_SSE2 | HWCAP_X86_64 | HWCAP_X86_AVX512_1) + #elif defined __x86_64__ + /* For 64 bit, only cover x86-64 platforms and capabilities. */ + # define HWCAP_PLATFORMS_START 2 + # define HWCAP_PLATFORMS_COUNT 4 + # define HWCAP_START 1 +-# define HWCAP_COUNT 2 +-# define HWCAP_IMPORTANT (HWCAP_X86_AVX512_1) ++# define HWCAP_COUNT 3 ++# define HWCAP_IMPORTANT (HWCAP_X86_64 | HWCAP_X86_AVX512_1) + #else + /* For 32 bit, only cover i586, i686 and SSE2. */ + # define HWCAP_PLATFORMS_START 0 +@@ -45,7 +46,8 @@ + enum + { + HWCAP_X86_SSE2 = 1 << 0, +- HWCAP_X86_AVX512_1 = 1 << 1 ++ HWCAP_X86_64 = 1 << 1, ++ HWCAP_X86_AVX512_1 = 1 << 2 + }; + + static inline const char * +diff --git a/sysdeps/x86/dl-procinfo.c b/sysdeps/x86/dl-procinfo.c +index 43ab8fe25b..0192feb850 100644 +--- a/sysdeps/x86/dl-procinfo.c ++++ b/sysdeps/x86/dl-procinfo.c +@@ -58,11 +58,11 @@ PROCINFO_CLASS struct cpu_features _dl_x86_cpu_features + #if !defined PROCINFO_DECL && defined SHARED + ._dl_x86_hwcap_flags + #else +-PROCINFO_CLASS const char _dl_x86_hwcap_flags[2][9] ++PROCINFO_CLASS const char _dl_x86_hwcap_flags[3][9] + #endif + #ifndef PROCINFO_DECL + = { +- "sse2", "avx512_1" ++ "sse2", "x86_64", "avx512_1" + } + #endif + #if !defined SHARED || defined PROCINFO_DECL +diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile +index 7f3ffe34ba..1514805f4a 100644 +--- a/sysdeps/x86_64/Makefile ++++ b/sysdeps/x86_64/Makefile +@@ -52,6 +52,12 @@ $(objpfx)tst-quad2pie: $(objpfx)tst-quadmod2pie.o + CFLAGS-tst-quad1pie.c = $(PIE-ccflag) + CFLAGS-tst-quad2pie.c = $(PIE-ccflag) + ++tests += tst-x86_64-1 ++modules-names += x86_64/tst-x86_64mod-1 ++LDFLAGS-tst-x86_64mod-1.so = -Wl,-soname,tst-x86_64mod-1.so ++ ++$(objpfx)tst-x86_64-1: $(objpfx)x86_64/tst-x86_64mod-1.so ++ + tests += tst-audit3 tst-audit4 tst-audit5 tst-audit6 tst-audit7 \ + tst-audit10 tst-sse tst-avx tst-avx512 + test-extras += tst-audit4-aux tst-audit10-aux \ +@@ -124,3 +130,14 @@ endif + ifeq ($(subdir),csu) + gen-as-const-headers += tlsdesc.sym rtld-offsets.sym + endif ++ ++$(objpfx)x86_64/tst-x86_64mod-1.os: $(objpfx)tst-x86_64mod-1.os ++ $(make-target-directory) ++ rm -f $@ ++ ln $< $@ ++ ++do-tests-clean common-mostlyclean: tst-x86_64-1-clean ++ ++.PHONY: tst-x86_64-1-clean ++tst-x86_64-1-clean: ++ -rm -rf $(objpfx)x86_64 +diff --git a/sysdeps/x86_64/tst-x86_64-1.c b/sysdeps/x86_64/tst-x86_64-1.c +new file mode 100644 +index 0000000000..ba1a55cdaf +--- /dev/null ++++ b/sysdeps/x86_64/tst-x86_64-1.c +@@ -0,0 +1,26 @@ ++/* Test searching the "x86_64" directory for shared libraries. ++ Copyright (C) 2017 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++extern void foo (void); ++ ++int ++main (void) ++{ ++ foo (); ++ return 0; ++} +diff --git a/sysdeps/x86_64/tst-x86_64mod-1.c b/sysdeps/x86_64/tst-x86_64mod-1.c +new file mode 100644 +index 0000000000..83dfafb5a8 +--- /dev/null ++++ b/sysdeps/x86_64/tst-x86_64mod-1.c +@@ -0,0 +1,22 @@ ++/* Test searching the "x86_64" directory for shared libraries. ++ Copyright (C) 2017 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 ++ <http://www.gnu.org/licenses/>. */ ++ ++void ++foo (void) ++{ ++} +-- +2.13.2 + @@ -7,7 +7,7 @@ pkgname=glibc-wsl pkgver=2.26 -pkgrel=3 +pkgrel=4 pkgdesc='GNU C Library' arch=(i686 x86_64) url='http://www.gnu.org/software/libc' @@ -28,12 +28,16 @@ source=(glibc::git+https://sourceware.org/git/glibc.git#commit=${_commit} locale.gen.txt locale-gen 0001-Don-t-use-IFUNC-resolver-for-longjmp-or-system-in-li.patch - 0001-Revert-linux-spawni.c-simplify-error-reporting-to-pa.patch) + 0002-x86-Add-x86_64-to-x86-64-HWCAP-BZ-22093.patch + 0001-Revert-linux-spawni.c-simplify-error-reporting-to-pa.patch + 0001-Revert-Assume-prlimit64-is-available.patch) md5sums=('SKIP' '07ac979b6ab5eeb778d55f041529d623' '476e9113489f93b348b21e144b6a8fcf' 'cbc073315c00b03898b7fc614274d6b3' - 'a987eab514bee92cc627453c777896e8') + 'bd9b13f3294b6357baa809e4416b9f44' + 'a987eab514bee92cc627453c777896e8' + '5758d6e2a0ca3dbd6019063f895b64da') # pkgver() { # cd glibc @@ -45,7 +49,9 @@ prepare() { cd glibc patch -p1 -i "$srcdir/0001-Don-t-use-IFUNC-resolver-for-longjmp-or-system-in-li.patch" + patch -p1 -i "$srcdir/0002-x86-Add-x86_64-to-x86-64-HWCAP-BZ-22093.patch" patch -p1 -i "$srcdir/0001-Revert-linux-spawni.c-simplify-error-reporting-to-pa.patch" + patch -p1 -i "$srcdir/0001-Revert-Assume-prlimit64-is-available.patch" } build() { |