linux - 为什么在执行静态二进制文件时会出现 vdso?

标签 linux linux-kernel linker elf vdso

<分区>

这是一个快速示例程序。 (这基本上会得到与进程关联的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 的信息,没有正确理解。维基百科说“这些是可以从用户空间访问内核例程的方法”。我的问题是为什么这些共享对象会出现在执行static 二进制文件中?

最佳答案

My question is why are these shared objects appearing in execution of static binaries?

它们出现是因为您的内核将它们“注入(inject)”到每个进程中。

阅读更多关于它们的信息 herehere .

关于linux - 为什么在执行静态二进制文件时会出现 vdso?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31208097/

相关文章:

从 Linux 内核模块中调用用户空间函数

visual-studio - 如何告诉链接器我希望在 Debug模式下构建的 dll 具有 d 后缀

linux - 什么是 Mac OS 和基于 linux 的操作系统上的 Windows 用户收藏夹目录?

c - 如何在 Linux 上通过 inode 访问文件

linux - 平台驱动有什么用?

c++ - 为什么 gcc 链接器选择旧版本的共享库?

C全局静态变量初始化是由链接器完成的?

linux - 我可以找出谁调用了 zsh 脚本吗?

Python - 我如何从终端获取所有打印和标准输出以便我可以制作日志?

linux - 如何让调试符号在 Docker 容器内的 linux perf 工具中工作?