【问题标题】:Where is ptrace in linux kernel?linux内核中的ptrace在哪里?
【发布时间】:2019-09-24 14:50:10
【问题描述】:

我在带有global ptrace 的内核源代码中找不到它,kernel/ptrace.c 中没有定义,就像手册页中所说的那样.....我可以看到 kernel/ptrace.c 并包含/ linux/ptrace.h 但是什么都没有

【问题讨论】:

  • 如果你的意思是系统调用,很确定它已经定义了:elixir.bootlin.com/linux/v5.3.1/source/kernel/ptrace.c#L1237
  • 我应该如何找到这种类型的声明,除了阅读代码和寻找类似SYSCALL_DEFINE4(ptrace...?如果我只输入global ptrace
  • @MichaelFoukarakis:OP 要求提供ptrace()。调用 ptrace syscall 的是 libc。
  • @M.Kalter 我不知道global 的局限性。其他 IDE 或交叉引用工具当然可以,而且内核声明系统调用的约定也很完善,但这些不是问题的主题。
  • @ArkadiuszDrabczyk 我认为这个问题非常清楚。

标签: c linux-kernel ptrace


【解决方案1】:

您需要在您的 libc 源代码中查找它,例如 glibcmusl。并注意它在说什么 man ptraceNOTES 部分:

虽然 ptrace() 的参数是根据 给定原型,glibc 当前将 ptrace() 声明为可变参数 只有请求参数固定的函数。建议 始终提供四个参数,即使请求的操作没有 使用它们,将未使用/忽略的参数设置为 0L 或 (void *) 0。

glibc 例如ptrace() 定义在 sysdeps/unix/sysv/linux/ptrace.c:

long int
ptrace (enum __ptrace_request request, ...)
{
  long int res, ret;
  va_list ap;
  pid_t pid;
  void *addr, *data;

  va_start (ap, request);
  pid = va_arg (ap, pid_t);
  addr = va_arg (ap, void *);
  data = va_arg (ap, void *);
  va_end (ap);

  if (request > 0 && request < 4)
    data = &ret;

  res = INLINE_SYSCALL (ptrace, 4, request, pid, addr, data);
  if (res >= 0 && request > 0 && request < 4)
    {
      __set_errno (0);
      return ret;
    }

  return res;
}

【讨论】:

  • 你怎么看到它实际上是 libc 的一部分?... ptrace wiki 页面没有提到它;在我看来,我错过了一些重要的东西
  • 手册页通常(我不想说总是,因为我永远无法确定)描述 libc 接口,并且通常特别关注 GLIBC。目的是程序员不必使用内核和体系结构特定的代码,而是使用统一的 libc 接口。 GLIBC 被移植到多种架构和系统,但用户态程序的代码不必更改。
猜你喜欢
  • 2015-05-05
  • 2016-11-29
  • 2020-07-19
  • 2021-01-13
  • 2015-01-19
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多