diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-09-11 08:18:11 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-09-11 08:18:32 -0700 |
commit | 45ff34638f034877b6a490c217d6a0632ce263f4 (patch) | |
tree | dae86b84c59ccbc77c2d9d46403fee6ad3f29f20 /sysdeps/x86_64 | |
parent | 891abfd3c088c4bbfe724ff5bcfb9fca35db6d7d (diff) | |
download | glibc-45ff34638f034877b6a490c217d6a0632ce263f4.tar.gz |
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.
Diffstat (limited to 'sysdeps/x86_64')
-rw-r--r-- | sysdeps/x86_64/Makefile | 17 | ||||
-rw-r--r-- | sysdeps/x86_64/tst-x86_64-1.c | 26 | ||||
-rw-r--r-- | sysdeps/x86_64/tst-x86_64mod-1.c | 22 |
3 files changed, 65 insertions, 0 deletions
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) +{ +} |