微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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>

原文地址:https://www.jb51.cc/linux/393261.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐