]> sourceware.org Git - glibc.git/commitdiff
x86: Add x86_64 to x86-64 HWCAP [BZ #22093]
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 11 Sep 2017 15:18:11 +0000 (08:18 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 11 Sep 2017 15:18:32 +0000 (08:18 -0700)
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.

ChangeLog
sysdeps/x86/cpu-features.c
sysdeps/x86/dl-hwcap.h
sysdeps/x86/dl-procinfo.c
sysdeps/x86_64/Makefile
sysdeps/x86_64/tst-x86_64-1.c [new file with mode: 0644]
sysdeps/x86_64/tst-x86_64mod-1.c [new file with mode: 0644]

index 96e79845fa44be5bc6b86b5f70dca41547e19a16..952501cbe35cfd18bf54eb6f6ea50256adf7ee94 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2017-09-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+       [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.
+
 2017-09-11  Siddhesh Poyarekar  <siddhesh@sourceware.org>
 
        * po/sv.po: Update translations.
index 6f900840d45c5cb384e4e5f738fd4f07237c6b64..c267f17b7633e3bee19f38d8150220045f5b328b 100644 (file)
@@ -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;
 
index c95668415ab850b4b180aa86fc4443028b2e2666..38627e9eefb4f0b1a47bf2c57afedfc62468a92a 100644 (file)
 # 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 *
index 43ab8fe25b8e68948165af6e7dfcb6187d840b9f..0192feb850006f336f17183fab8f07595205e661 100644 (file)
@@ -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
index 7f3ffe34badd42ce909bd2ef5a4d164ba95615c5..1514805f4a6402e2c77b7ca3396a74b10bafb361 100644 (file)
@@ -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 (file)
index 0000000..ba1a55c
--- /dev/null
@@ -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 (file)
index 0000000..83dfafb
--- /dev/null
@@ -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)
+{
+}
This page took 0.092832 seconds and 5 git commands to generate.