About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / vDSO / vdso_test.c


Based on kernel version 4.8. Page generated on 2016-10-06 23:19 EST.

1	/*
2	 * vdso_test.c: Sample code to test parse_vdso.c
3	 * Copyright (c) 2014 Andy Lutomirski
4	 * Subject to the GNU General Public License, version 2
5	 *
6	 * Compile with:
7	 * gcc -std=gnu99 vdso_test.c parse_vdso.c
8	 *
9	 * Tested on x86, 32-bit and 64-bit.  It may work on other architectures, too.
10	 */
11	
12	#include <stdint.h>
13	#include <elf.h>
14	#include <stdio.h>
15	#include <sys/auxv.h>
16	#include <sys/time.h>
17	
18	extern void *vdso_sym(const char *version, const char *name);
19	extern void vdso_init_from_sysinfo_ehdr(uintptr_t base);
20	extern void vdso_init_from_auxv(void *auxv);
21	
22	int main(int argc, char **argv)
23	{
24		unsigned long sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR);
25		if (!sysinfo_ehdr) {
26			printf("AT_SYSINFO_EHDR is not present!\n");
27			return 0;
28		}
29	
30		vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR));
31	
32		/* Find gettimeofday. */
33		typedef long (*gtod_t)(struct timeval *tv, struct timezone *tz);
34		gtod_t gtod = (gtod_t)vdso_sym("LINUX_2.6", "__vdso_gettimeofday");
35	
36		if (!gtod) {
37			printf("Could not find __vdso_gettimeofday\n");
38			return 1;
39		}
40	
41		struct timeval tv;
42		long ret = gtod(&tv, 0);
43	
44		if (ret == 0) {
45			printf("The time is %lld.%06lld\n",
46			       (long long)tv.tv_sec, (long long)tv.tv_usec);
47		} else {
48			printf("__vdso_gettimeofday failed\n");
49		}
50	
51		return 0;
52	}
Hide Line Numbers


About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog