Commit | Line | Data |
---|---|---|
4ebbefd6 AL |
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 | } |