## vDSO

The "vDSO" (virtual dynamic shared object) is a small shared library that the
kernel automatically maps into the address space of all user-space
applications. This way, user space can perform some system calls via this
interface and avoid the cost of entering kernel space.

This is important for
system calls that the community has detected to be performed most often by all
applications. Note that the regular joe doesn't have to deal with any of this as
glibc and the likes will already take care of this.

For much more, this is all better documented via `man vdso`.

### This example

No arguments are required, just:

```
$ make
$ ./vdso
=> vDSO base address: 0x7fab930dc000S
=> The following system calls are available via vDSO:
	__vdso_gettimeofday (address: 0x7fab930dc890)
	__vdso_clock_getres (address: 0x7fab930dcf70)
	__vdso_time (address: 0x7fab930dcb80)
	__vdso_sgx_enter_enclave (address: 0x7fab930dd530)
	__vdso_getrandom (address: 0x7fab930dd020)
	__vdso_clock_gettime (address: 0x7fab930dcbb0)
	__vdso_getcpu (address: 0x7fab930dcfe0)
=> After running 'getcpu' via vDSO: cpu: 14 - core: 0
```

That is, this program:

1. Fetches the base address for the vDSO.
2. Parses the ELF file that is the vDSO and obtains the name of all functions
   starting with `__vdso_*` (i.e. those that the kernel expects to be called).
3. As an example, it calls the `getcpu` system call by calling the parsed
   address for it directly.
