我想知道是否有一种方法可以捕获(换句话说观察)像stratime中的gettimeofday这样的vDSO调用.
解决方法
@H_502_9@ 您可以使用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>