gpt4 book ai didi

linux-kernel - 在strace中捕获vDSO

转载 作者:行者123 更新时间:2023-12-04 04:53:25 26 4
gpt4 key购买 nike

我想知道是否有一种方法可以捕获(换句话说,观察)vDSO调用,例如gettimeofday中的strace

另外,有没有一种方法可以在不加载linux-vdso.so.1(标志或环境变量)的情况下执行二进制文件?

最后,如果我编写一个程序从辅助向量中删除linux-vdso.so.1地址,然后再将我的程序execve删除,该怎么办?有没有人尝试过?

最佳答案

您可以使用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 strace编译:
09:57:32.651876 gettimeofday({1467305852, 651888}, {420, 140735905220705}) = 0 <0.000006>

关于linux-kernel - 在strace中捕获vDSO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38103583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com