From patchwork Sun Sep 30 22:22:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Rafael Avila de Espindola X-Patchwork-Id: 29592 Received: (qmail 121100 invoked by alias); 30 Sep 2018 22:22:36 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 121083 invoked by uid 89); 30 Sep 2018 22:22:35 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_LOW, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=filter, Under, sk:interna, existed X-HELO: mail1.protonmail.ch Date: Sun, 30 Sep 2018 22:22:16 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=espindo.la; s=protonmail; t=1538346144; bh=byZgm63ve9xdEJBkfThwKZBlcoIKnbdDNw5G6InSsxA=; h=Date:To:From:Reply-To:Subject:Feedback-ID:From; b=WTQp/I4TREBNhUAfglvZAyfhDR+wFulGmNEuaKRUe4rYI+9zGL6PamVYlWGI7hnYg tH3rKdvU4gzDyTtFQkE7NEKNPdC8UqXpXENjhjx6CYNQsI+soEmgsKJOg3E/RGGwsi hAk/NY3Hcm82l363UbzYHYsYprMtYlZkPlEyPyKk= To: libc-alpha@sourceware.org, "H.J. Lu" , Florian Weimer , Szabolcs Nagy From: Rafael Avila de Espindola Reply-To: Rafael Avila de Espindola Subject: [PATCH v3] Enable VDSO on x86_64 statically linked programs. Message-ID: MIME-Version: 1.0 All the required code already existed, and some of it was already running. AT_SYSINFO_EHDR is processed if NEED_DL_SYSINFO_DSO is defined, but it looks like it always is. The call to setup_vdso is also unconditional, so all that was left to do was setup the function pointers and use them. This patch just replaces some #ifdef SHARED with a new USE_VSYSCALL. It is always defined when SHARED is and is always defined on x86_64. --- I intend to change all architectures, but it seems better to change one at a time so that if one architecture has a special requirement it will be easier to spot. Since sysdeps/unix/sysv/linux/sysdep-vdso.h is used by multiple architectures, we cannot just remove the #ifdef as done in the previous patch. 2018-09-30 Rafael Ávila de Espíndola [BZ #19767] * Makeconfig: Add -DUSE_VSYSCALL to CPPFLAGS-.os. * nptl/Makefile: Add tst-cond11-static to tests-static and tests. * nptl/tst-cond11-static.c: New File. * sysdeps/unix/sysv/linux/Makefile: Add tst-affinity-static to tests-static and tests * sysdeps/unix/sysv/linux/sysdep-vdso.h: Use USE_VSYSCALL instead of SHARED. * sysdeps/unix/sysv/linux/tst-affinity-static.c: New file. * sysdeps/unix/sysv/linux/x86/libc-vdso.h: Use USE_VSYSCALL instead of SHARED. * sysdeps/unix/sysv/linux/x86_64/init-first.c: remove #ifdef SHARED. * sysdeps/unix/sysv/linux/x86_64/sysdep.h: define USE_VSYSCALL. diff --git a/Makeconfig b/Makeconfig index a9e50e5b60..2e38d26a57 100644 --- a/Makeconfig +++ b/Makeconfig @@ -999,7 +999,7 @@ ifeq (yes,$(build-shared)) # Under --enable-shared, we will build a shared library of PIC objects. # The PIC object files are named foo.os. object-suffixes += .os -CPPFLAGS-.os = -DPIC -DSHARED +CPPFLAGS-.os = -DPIC -DSHARED -DUSE_VSYSCALL CFLAGS-.os = $(filter %frame-pointer,$(+cflags)) $(pic-ccflag) libtype.os := lib%_pic.a # This can be changed by a sysdep makefile diff --git a/nptl/Makefile b/nptl/Makefile index be8066524c..1b384548a1 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -449,9 +449,10 @@ link-libc-static := $(common-objpfx)libc.a $(static-gnulib) \ tests-static += tst-locale1 tst-locale2 tst-stackguard1-static \ tst-cancel21-static tst-cancel24-static tst-cond8-static \ tst-mutex8-static tst-mutexpi8-static tst-sem11-static \ - tst-sem12-static + tst-sem12-static tst-cond11-static + tests += tst-cancel21-static tst-cancel24-static \ - tst-cond8-static + tst-cond8-static tst-cond11-static tests-internal += tst-sem11-static tst-sem12-static tst-stackguard1-static xtests-static += tst-setuid1-static diff --git a/nptl/tst-cond11-static.c b/nptl/tst-cond11-static.c new file mode 100644 index 0000000000..9bccb8ec8b --- /dev/null +++ b/nptl/tst-cond11-static.c @@ -0,0 +1 @@ +#include "tst-cond11.c" diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 773aaea0e9..05a4ab1e55 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -143,6 +143,9 @@ sysdep_routines += sched_getcpu oldglob tests += tst-affinity tst-affinity-pid +tests-static := tst-affinity-static +tests += $(tests-static) + CFLAGS-fork.c = $(libio-mtsafe) CFLAGS-getpid.o = -fomit-frame-pointer CFLAGS-getpid.os = -fomit-frame-pointer diff --git a/sysdeps/unix/sysv/linux/sysdep-vdso.h b/sysdeps/unix/sysv/linux/sysdep-vdso.h index 1912c1c156..8781b3915c 100644 --- a/sysdeps/unix/sysv/linux/sysdep-vdso.h +++ b/sysdeps/unix/sysv/linux/sysdep-vdso.h @@ -26,13 +26,11 @@ funcptr (args) #endif -#ifdef SHARED +#if defined(HAVE_VSYSCALL) && defined(USE_VSYSCALL) -# ifdef HAVE_VSYSCALL +# include -# include - -# define INLINE_VSYSCALL(name, nr, args...) \ +# define INLINE_VSYSCALL(name, nr, args...) \ ({ \ __label__ out; \ __label__ iserr; \ @@ -61,7 +59,7 @@ sc_ret; \ }) -# define INTERNAL_VSYSCALL(name, err, nr, args...) \ +# define INTERNAL_VSYSCALL(name, err, nr, args...) \ ({ \ __label__ out; \ long v_ret; \ @@ -79,20 +77,12 @@ out: \ v_ret; \ }) -# else -# define INLINE_VSYSCALL(name, nr, args...) \ - INLINE_SYSCALL (name, nr, ##args) -# define INTERNAL_VSYSCALL(name, err, nr, args...) \ - INTERNAL_SYSCALL (name, err, nr, ##args) -# endif /* HAVE_VSYSCALL */ +#else -# else /* SHARED */ - -# define INLINE_VSYSCALL(name, nr, args...) \ +# define INLINE_VSYSCALL(name, nr, args...) \ INLINE_SYSCALL (name, nr, ##args) -# define INTERNAL_VSYSCALL(name, err, nr, args...) \ +# define INTERNAL_VSYSCALL(name, err, nr, args...) \ INTERNAL_SYSCALL (name, err, nr, ##args) -#endif /* SHARED */ - +#endif /* defined(HAVE_VSYSCALL) && defined(USE_VSYSCALL) */ #endif /* SYSDEP_VDSO_LINUX_H */ diff --git a/sysdeps/unix/sysv/linux/tst-affinity-static.c b/sysdeps/unix/sysv/linux/tst-affinity-static.c new file mode 100644 index 0000000000..4022ea317a --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-affinity-static.c @@ -0,0 +1 @@ +#include "tst-affinity.c" diff --git a/sysdeps/unix/sysv/linux/x86/libc-vdso.h b/sysdeps/unix/sysv/linux/x86/libc-vdso.h index 6f86073dae..3ea43263fd 100644 --- a/sysdeps/unix/sysv/linux/x86/libc-vdso.h +++ b/sysdeps/unix/sysv/linux/x86/libc-vdso.h @@ -22,7 +22,7 @@ #include #include -#ifdef SHARED +#ifdef USE_VSYSCALL # include diff --git a/sysdeps/unix/sysv/linux/x86_64/init-first.c b/sysdeps/unix/sysv/linux/x86_64/init-first.c index 2320505804..ad19f4b055 100644 --- a/sysdeps/unix/sysv/linux/x86_64/init-first.c +++ b/sysdeps/unix/sysv/linux/x86_64/init-first.c @@ -16,11 +16,10 @@ License along with the GNU C Library; if not, see . */ -#ifdef SHARED -# include -# include -# include -# include +#include +#include +#include +#include long int (*VDSO_SYMBOL(clock_gettime)) (clockid_t, struct timespec *) attribute_hidden; @@ -46,7 +45,6 @@ __vdso_platform_setup (void) VDSO_SYMBOL(getcpu) = p; } -# define VDSO_SETUP __vdso_platform_setup -#endif +#define VDSO_SETUP __vdso_platform_setup #include diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h index f07eb04962..7b98ed5686 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -18,6 +18,11 @@ #ifndef _LINUX_X86_64_SYSDEP_H #define _LINUX_X86_64_SYSDEP_H 1 +/* Always enable vsyscalls on x86_64 */ +#ifndef USE_VSYSCALL +#define USE_VSYSCALL +#endif + /* There is some commonality. */ #include #include