###1. VDSO VDSO就是Virtual Dynamic Shared Object,就是内核提供的虚拟的.so,这类.so文件不在磁盘上,而是包含在内核里面。内核把包含某一.so的物理页在程序启动的时候映射入其进程的内存空间,对应的程序就可以当普通的.so来使用里头的函数 linux上目前使用的vdso是“linux-vdso.so.1”(旧版的名称可能是“linux-gate.so.1”), 通过ldd命令可以发现,基本所有的应用都会依赖这一so $ ldd cat linux-vdso.so.1 => (0x00007fff47ffe000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f45f6af2000) /lib64/ld-linux-x86-64.so.2 (0x00007f45f6ecc000) VDSO在进程中映射的地址可通过如下方式来查看: $ cat /proc/xxx/maps | grep vdso 需要注意的是, 新的内核中提供了的进程地址随机化功能, 因此,linux-vdso.so.1每一次的映射地址都不相同(即使是对于同一个可执行程序), linux中的”/proc/sys/kernel/randomize_va_space”用于控制linux的进程地址随机化, 取值如下: 0 : 表示关闭内存地址随机化 1 : 表示将mmap的基址,stack和vdso地址随机化 2 :...