这是一个快速示例程序。(这基本上会得到与进程关联的procmap )
> cat sample.c
#include<stdio.h>
int main()
{
char buffer[1000];
sprintf(buffer, "cat /proc/%d/maps\n", getpid());
int status = system(buffer);
return 1;
}
静态准备
> gcc -static -o sample sample.c
> file sample
sample: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=9bb9f33e867df8f2d56ffb4bfb5d348c544b1050, not stripped
执行二进制
> ./sample
00400000-004c0000 r-xp 00000000 08:01 12337398 /home/admin/sample
006bf000-006c2000 rw-p 000bf000 08:01 12337398 /home/admin/sample
006c2000-006c5000 rw-p 00000000 00:00 0
0107c000-0109f000 rw-p 00000000 00:00 0 [heap]
7ffdb3d78000-7ffdb3d99000 rw-p 00000000 00:00 0 [stack]
7ffdb3de7000-7ffdb3de9000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
我在谷歌上搜索了 vDSO ,但没有正确理解。维基百科说“这些是可以从用户空间访问内核例程的方式”。我的问题是为什么这些共享对象会出现在静态二进制文件的执行中?