[Midnightbsd-cvs] src [8778] trunk: rework the vdso symbols to make them weak.

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sun Sep 25 23:02:19 EDT 2016


Revision: 8778
          http://svnweb.midnightbsd.org/src/?rev=8778
Author:   laffer1
Date:     2016-09-25 23:02:19 -0400 (Sun, 25 Sep 2016)
Log Message:
-----------
rework the vdso symbols to make them weak. this lets static binaries use fast gettimeofday

Modified Paths:
--------------
    trunk/lib/libc/amd64/sys/__vdso_gettc.c
    trunk/lib/libc/i386/sys/__vdso_gettc.c
    trunk/lib/libc/sys/__vdso_gettimeofday.c
    trunk/lib/libc/sys/gettimeofday.c
    trunk/sys/sys/vdso.h

Modified: trunk/lib/libc/amd64/sys/__vdso_gettc.c
===================================================================
--- trunk/lib/libc/amd64/sys/__vdso_gettc.c	2016-09-26 03:00:58 UTC (rev 8777)
+++ trunk/lib/libc/amd64/sys/__vdso_gettc.c	2016-09-26 03:02:19 UTC (rev 8778)
@@ -27,9 +27,11 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <sys/elf.h>
 #include <sys/time.h>
 #include <sys/vdso.h>
 #include <machine/cpufunc.h>
+#include "libc_private.h"
 
 static u_int
 __vdso_gettc_low(const struct vdso_timehands *th)
@@ -41,6 +43,7 @@
 	return (rv);
 }
 
+#pragma weak __vdso_gettc
 u_int
 __vdso_gettc(const struct vdso_timehands *th)
 {
@@ -47,3 +50,11 @@
 
 	return (th->th_x86_shift > 0 ? __vdso_gettc_low(th) : rdtsc32());
 }
+
+#pragma weak __vdso_gettimekeep
+int
+__vdso_gettimekeep(struct vdso_timekeep **tk)
+{
+
+	return (_elf_aux_info(AT_TIMEKEEP, tk, sizeof(*tk)));
+}

Modified: trunk/lib/libc/i386/sys/__vdso_gettc.c
===================================================================
--- trunk/lib/libc/i386/sys/__vdso_gettc.c	2016-09-26 03:00:58 UTC (rev 8777)
+++ trunk/lib/libc/i386/sys/__vdso_gettc.c	2016-09-26 03:02:19 UTC (rev 8778)
@@ -27,9 +27,11 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <sys/elf.h>
 #include <sys/time.h>
 #include <sys/vdso.h>
 #include <machine/cpufunc.h>
+#include "libc_private.h"
 
 static u_int
 __vdso_gettc_low(const struct vdso_timehands *th)
@@ -48,3 +50,11 @@
 
 	return (th->th_x86_shift > 0 ? __vdso_gettc_low(th) : rdtsc32());
 }
+
+#pragma weak __vdso_gettimekeep
+int
+__vdso_gettimekeep(struct vdso_timekeep **tk)
+{
+
+	return (_elf_aux_info(AT_TIMEKEEP, tk, sizeof(*tk)));
+}

Modified: trunk/lib/libc/sys/__vdso_gettimeofday.c
===================================================================
--- trunk/lib/libc/sys/__vdso_gettimeofday.c	2016-09-26 03:00:58 UTC (rev 8777)
+++ trunk/lib/libc/sys/__vdso_gettimeofday.c	2016-09-26 03:02:19 UTC (rev 8778)
@@ -79,6 +79,7 @@
 
 static struct vdso_timekeep *tk;
 
+#pragma weak __vdso_gettimeofday
 int
 __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
 {
@@ -88,7 +89,7 @@
 	if (tz != NULL)
 		return (ENOSYS);
 	if (tk == NULL) {
-		error = _elf_aux_info(AT_TIMEKEEP, &tk, sizeof(tk));
+		error = __vdso_gettimekeep(&tk);
 		if (error != 0 || tk == NULL)
 			return (ENOSYS);
 	}
@@ -101,6 +102,7 @@
 	return (0);
 }
 
+#pragma weak __vdso_clock_gettime
 int
 __vdso_clock_gettime(clockid_t clock_id, struct timespec *ts)
 {

Modified: trunk/lib/libc/sys/gettimeofday.c
===================================================================
--- trunk/lib/libc/sys/gettimeofday.c	2016-09-26 03:00:58 UTC (rev 8777)
+++ trunk/lib/libc/sys/gettimeofday.c	2016-09-26 03:02:19 UTC (rev 8778)
@@ -41,10 +41,7 @@
 {
 	int error;
 
-	if (__vdso_gettimeofday != NULL && __vdso_gettc != NULL)
-		error = __vdso_gettimeofday(tv, tz);
-	else
-		error = ENOSYS;
+	error = __vdso_gettimeofday(tv, tz);
 	if (error == ENOSYS)
 		error = __sys_gettimeofday(tv, tz);
 	return (error);

Modified: trunk/sys/sys/vdso.h
===================================================================
--- trunk/sys/sys/vdso.h	2016-09-26 03:00:58 UTC (rev 8777)
+++ trunk/sys/sys/vdso.h	2016-09-26 03:02:19 UTC (rev 8778)
@@ -61,13 +61,9 @@
 struct timezone;
 
 int __vdso_clock_gettime(clockid_t clock_id, struct timespec *ts);
-#pragma weak __vdso_clock_gettime
-
 int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz);
-#pragma weak __vdso_gettimeofday
-
 u_int __vdso_gettc(const struct vdso_timehands *vdso_th);
-#pragma weak __vdso_gettc
+int __vdso_gettimekeep(struct vdso_timekeep **tk);
 
 #endif
 



More information about the Midnightbsd-cvs mailing list