From 45ff34638f034877b6a490c217d6a0632ce263f4 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 11 Sep 2017 08:18:11 -0700 Subject: 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/dl-hwcap.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'sysdeps/x86/dl-hwcap.h') diff --git a/sysdeps/x86/dl-hwcap.h b/sysdeps/x86/dl-hwcap.h index c956684..38627e9 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 * -- cgit v1.1