在 strace 中捕获 vDSO

2024-04-10

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

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

最后,如果我编写一个程序来删除linux-vdso.so.1来自辅助向量的地址,然后execve我的程序?有人尝试过吗?


您可以捕获对通过 vDSO 实现的系统调用的调用,方法是使用ltrace代替strace。这是因为通过 vDSO 实现的系统调用的工作方式与“正常”系统调用和方法不同strace用于跟踪系统调用不适用于 vDSO 实现的系统调用。欲了解更多有关如何strace有效,查看我写的这篇关于 strace 的博文 http://blog.packagecloud.io/eng/2016/02/29/how-does-strace-work/。并且,要详细了解如何ltrace有效,查看我写的关于 ltrace 的另一篇博文 http://blog.packagecloud.io/eng/2016/03/14/how-does-ltrace-work/.

不,不加载就不可能执行二进制文件linux-vdso.so.1。至少,在我的 Ubuntu 上的 libc 版本上不是这样。当然,较新版本的 libc/eglibc/etc 可能已将其添加为一项功能,但这似乎不太可能。请参阅下一个答案了解原因。

如果您从辅助向量中删除该地址,您的二进制文件可能会崩溃。 libc 有一个一段代码 http://blog.packagecloud.io/eng/2016/04/05/the-definitive-guide-to-linux-system-calls/#vdso-in-glibc它将首先尝试遍历 vDSO ELF 对象,如果失败,将回退到硬编码的 vsyscall 地址。避免这种情况的唯一方法是在禁用 vDSO 的情况下编译 glibc。

不过,如果您真的不想使用 vDSO,还有另一种解决方法。您可以尝试使用glibc's syscall功能 http://blog.packagecloud.io/eng/2016/04/05/the-definitive-guide-to-linux-system-calls/#calling-a-syscall-semi-manually-with-syscall2并传入系统调用号gettimeofday。这将强制 glibc 调用gettimeofday通过内核而不是 vDSO。

我在下面提供了一个示例程序来说明这一点。您可以通过阅读我的文章来了解有关系统调用如何工作的更多信息系统调用博客文章 http://blog.packagecloud.io/eng/2016/04/05/the-definitive-guide-to-linux-system-calls/.

#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>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 strace 中捕获 vDSO 的相关文章

  • vm.dirty_ratio 和 vm.dirty_background_ratio 之间的区别?

    我目前正在试验中找到的内核参数 proc sys vm 尤其dirty ratio and dirty background ratio 内核文档对两者都有以下解释 脏背景比例 包含 以包含空闲页面的总可用内存的百分比表示 和可回收页 后台
  • 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    例如 常见设备模块的Makefile obj m jc o default MAKE C lib modules shell uname r build M shell pwd modules clean MAKE C lib module
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志
  • 树莓派的设备树驱动内核

    我想用设备树驱动的 Linux 内核启动树莓派 有什么特别的事情要做吗 谁能指出为树莓派设置基于设备树的内核启动需要什么 我可能需要有树莓派内核源代码 其中设备驱动程序应与设备树兼容 如果是这样 我在哪里可以找到 Raspberry Pi
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 使用sk_buff添加以太网帧头

    我有一个捕获传出互联网流量的内核模块 Netfilter hook LOCAL OUT 在此挂钩处 仍然没有以太网标头 我构建了以太网头并且可以使用了 但是如何将其连接到skb这样我就可以将整个 skb 结构发送到dev queue xmi
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • 在许多驱动程序文件夹中创建 build-in.o

    我正在用我的自定义驱动程序构建内核 成功构建后 我发现了许多 build in o 文件 任何人都可以详细说明这些文件是如何在这里结束的吗 我只能怀疑这些与更高级别的 makefile 有关 built in o 文件是未构建为模块的内核的
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 如何从外部模块导出符号?

    我在内核源代码树之外进行编码 有两个模块 第一个printt有一个功能printtty 将字符串打印到当前 tty 以及第二个模块hello这会调用printtty 在初始化期间 我已经添加了EXPORT SYMBOL printtty 在
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 为什么我的信号处理程序只执行一次?

    我正在 UNIX 和 C 中处理信号 并遇到了这个问题 我正在尝试编写一个计数到 10 的程序 每秒一个数字 当用户尝试使用 SIGINT 如 CTRL C 中断它时 它会打印一条消息 告诉它无论如何都会继续计数 到目前为止 我得到了这个
  • 真实设备中的 Android strace

    我有以下情况 我想监控Android手机上的系统调用 所以 我编写了一个脚本来做到这一点 使用 Android 模拟器可以完美地工作 将应用程序的痕迹写入我的 Ubuntu 上的特定文件中 问题是当我连接一个真实的手机来分析它时 它在结果文
  • Linux CFS 调度程序代码在哪里?

    我有3 13版本的完整linux源代码 我试图找到 CFS 调度程序的源代码 根据流行书籍 它应该驻留在 kernel sched c 中作为基本调度程序代码 而 kernel sched fair c 专门针对 CFS 代码 我刚刚在 3
  • 在内核中创建一个简单的只写过程条目

    include
  • linux新手关于嵌入式linux设备驱动的问题

    最近在研究linux驱动 正如我读过的那些文章所说 设备驱动程序模块很可能会根据内核的需要自动加载 因此我想知道内核如何确定为特定设备 声卡 I2C spi 设备 等 我也无法彻底想象内核如何在启动时检测每个硬件设备 与嵌入式linux相关
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组

随机推荐

  • C# 中的数组列表

    我们可以将 ArrayList 作为参数传递给 C 中的方法吗 绝对地 然而 你很少应该这样做 这些天你应该差不多always使用泛型类型 例如List
  • 动态 SQL 查询根据单元格中的空值忽略空值

    我有一个动态 SQL 查询 在运行时具有不同的列名和表 我希望让 SQL 查询根据行是否在任何单元格中包含 Null 值来忽略读取数据 SELECT rsv intension rsvt FROM resolve table kb wher
  • 使用复杂风味树更改 google-services.json 的搜索位置

    我知道已经有人问过这个问题 但是对于 4 2 0 以上的 com google gms google services 的任何版本 问题仍然存在 我的 google services json 文件的搜索位置不再考虑风味树状结构 它只写着
  • 使用 Angular JS 时如何加载 AMD 模块?

    由于某种奇怪的原因Angular JS 有自己的模块系统 既不是 AMD 也不是 CommonJS http docs angularjs org guide module 我有许多 AMD 格式的现有模块 我想在 Angular 应用程序
  • ADL 是否适用于全局命名空间?

    Examples https stackoverflow com a 5076640 321013 such as https groups google com forum original comp lang c moderated 1
  • 多个 Android 应用程序依赖于带有 gradle 的 android 库

    我仍在学习 gradle 但根据我所读到的内容 我想知道这是否可能 我有多个 Android 应用程序 app1 app2 app3 它们依赖于 android 库 L android 库 L 将依赖于 volley 等外部库 而应用程序将
  • 如何在android中的NumberPicker中自定义数字的值?

    我有一个数字选择器 用于设置以 MB 为单位的数据限制 现在 我有 numberPicker 包含按顺序排列的数值 如 1 2 3 2000 MB 但我想要一个应包含 100 200 300 2000MB 等数值的 numberPicker
  • PostgreSQL psycopg2 返回字符串元组而不是元组元组?

    我有一个奇怪的问题 在搜索 Google SO 没有发现类似的情况后 我不太确定如何解决它 当我尝试从光标获取查询结果时 它给了我一个元组的元组 除了元组是字符串 下面是代码 def queryFeeds db sql SELECT ngo
  • 如何在作业开始前清理 Jenkins 管道中的工作区

    我需要在构建开始之前清理工作区 我尝试使用cleanDir 分阶段进行 但在声明性管道中 检查首先发生 并且当阶段与cleadDir运行时 签出的代码也会被清除 这是不希望的 在声明式管道中签出之前 我们如何清除工作区 实际上 我必须根据管
  • 如何将本地 django 制作的站点移动到另一台机器上?

    我努力寻找我的查询的解决方案 但没有成功 我在本地机器上使用 django 制作了一个网站 现在我想在另一台机器上安装相同的 django 制作的网站 MySQL是我正在使用的数据库 如何将本地 django 制作的网站移动到另一台机器上
  • PHP - Postgresql 如果返回错误,如何回滚查询?

    我正在使用 php 和 postgres 进行 CRUD 我想知道如果出现错误是否有办法回滚事务 实际上 如果我在事务中遇到错误 id 主键 就会增加 然后我会丢失一个 id 以供将来使用 我该如何预防 我的意思是 如果插入查询失败 不要在
  • 套接字无法连接到端点

    var socket new Socket localhost 4000 socket connect Returns WebSocket connection to ws localhost 4000 ws failed Error du
  • 扩展 Backbone.Collection 原型

    继从这个问题 https stackoverflow com questions 10219182 retrieve element from backbone collection removen 我正在尝试使用一些自定义方法来增强 Ba
  • AWS lambda函数在超时错误后停止工作

    我有一个简单的 lambda 函数 它异步进行 API 调用 然后返回数据 99 的情况下这都非常有效 当 API 花费的时间超过 lambda 配置的超时时间时 它会按预期给出错误 现在的问题是 当我对 lambda 函数进行任何后续调用
  • Xcode 5 中的代码签名

    我在 Xcode 5 中验证我的应用程序时遇到问题 我在 2 周前提交了更新 Xcode 4 正常 我没有触及任何证书或配置文件 当我尝试验证时 我得到 当我尝试下载身份时 Xcode 崩溃了 我进入偏爱 gt accounts并刷新了我的
  • 如何删除iOS应用程序中呼叫某人时的弹出窗口? [复制]

    这个问题在这里已经有答案了 我想建议用户从应用程序拨打电话 并弹出一个带有特定文本的窗口 我首先向他展示弹出窗口 如果他同意 然后我运行代码从应用程序拨打电话 但与使用无关tel telprompt tel 对于链接 我总是从系统中弹出第二
  • 使用 Flask wtforms 验证器而不使用表单

    我正在从 iOS 应用程序接收用户注册数据 我想使用 wtforms 附带的验证器来确保电子邮件和密码可接受 但是 我没有使用 Flask 表单 因为用户是从 iOS 文本字段输入数据 是否可以使用 wtforms 验证器检查传入的 JSO
  • 如果 Aurelia 理解“导入”,为什么还要使用依赖注入?

    我不明白 如果我可以使用import在 Aurelia 中 为什么我必须将构造函数与 autoinject 还有这一切 我确信我错过了一些东西 但是 据我所知 我可以随时使用导入的模块 import something from whate
  • 是否可以拥有不可变的 JPA 实体?

    在我们的 Hibernate 项目中 实体是使用 Java bean 模式进行编码的 我们的代码中有很多地方有人忘记设置变异器 并且由于以下原因我们得到了异常NOT NULL约束 是否有人使用构建器来构建他们的实体或使它们不可变 我正在尝试
  • 在 strace 中捕获 vDSO

    我想知道是否有一种方法可以捕获 换句话说观察 vDSO 调用 例如gettimeofday in strace 另外 有没有一种方法可以在不加载的情况下执行二进制文件linux vdso so 1 标志或环境变量 最后 如果我编写一个程序来