linux-kernel – 在strace中捕获vDSO

前端之家收集整理的这篇文章主要介绍了linux-kernel – 在strace中捕获vDSO前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道是否有一种方法可以捕获(换句话说观察)像stratime中的gettimeofday这样的vDSO调用.

还有,有没有办法在不加载linux-vdso.so.1(一个标志或env变量)的情况下执行二进制文件

最后,如果我编写一个从辅助向量中删除linux-vdso.so.1地址然后执行我的程序的程序呢?有人试过吗?

解决方法

您可以使用ltrace而不是strace来捕获已通过vDSO实现的系统调用调用.这是因为通过vDSO实现的对系统调用调用与“普通”系统调用的工作方式不同,并且strace用于跟踪系统调用方法不适用于vDSO实现的系统调用.要了解有关strace如何工作的更多信息,请查看 this blog post I wrote about strace.并且,要了解有关ltrace如何工作的更多信息,请查看 this other blog post I wrote about ltrace.

不,如果不加载linux-vdso.so.1,就不可能执行二进制文件.至少,不是我在Ubuntu上的libc版本精确.当然,较新版本的libc / eglibc / etc已将此作为功能添加,但似乎不太可能.请参阅下一个答案.

如果从辅助向量中删除地址,您的二进制文件可能会崩溃. libc有一个piece of code,它将首先尝试遍历vDSO ELF对象,如果失败,将返回到硬编码的vsyscall地址.避免这种情况的唯一方法是,如果你已经禁用vDSO编译了glibc.

但是,还有另一种解决方法,如果你真的,真的不想使用vDSO.您可以尝试使用glibc’s syscall function并传入gettimeofday的系统调用号.这将强制glibc通过内核而不是vDSO调用gettimeofday.

我在下面列出了一个示例程序来说明这一点.您可以通过阅读我的syscall blog post了解有关系统调用如何工作的更多信息.

#include <sys/time.h>
#include <stdio.h>

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>

int
main(int argc,char *argv[]) {
    struct timeval tv;
    syscall(SYS_gettimeofday,&tv);

    return 0;
}

使用gcc -o test test.c编译并使用strace -ttTf ./test 2>& 1 |进行编译. grep gettimeofday:

09:57:32.651876 gettimeofday({1467305852,651888},{420,140735905220705})= 0< 0.000006>

猜你在找的Linux相关文章