user_regs_struct 中缺少 `gs`?

`gs` missing from user_regs_struct?

我有以下代码无法在 i386 上编译,缺少“gs”。 我查看了结构定义,它显然在那里。 知道我错了什么吗? 谢谢!

struct user_regs_struct regs_struct;
  struct iovec pt_iov = {
      .iov_base = &regs,
      .iov_len = sizeof(regs),
  };
  if (ptrace(PTRACE_GETREGSET, tid, NT_PRSTATUS, &pt_iov) == 0) {
#if defined(__x86_64__)
    return regs_struct.fs;
#elif defined(__i386__)
    return regs_struct.gs;  <<< Got an error about "gs" not being a field of user_regs_struct 
  }

P.S:我知道我应该制作一个小测试用例,但我做不到。它没有在独立应用程序上遇到此错误。 (不要介意我没有本地测试的硬件)。我所知道的是,当代码是远程构建的更大系统的一部分时,会弹出此错误。 这就是为什么我希望有人将此视为“已知问题”,或者对可能的问题有一些直觉。

看起来 user_regs_struct 的 i386 版本出于某种原因将其称为 xgs

sys/user.h中,有一个#ifdef __x86_64__#else /* These are the 32-bit x86 structures. */ 文件的一侧有这个内容:

struct user_regs_struct
{
  long int ebx;
  long int ecx;
  long int edx;
  long int esi;
  long int edi;
  long int ebp;
  long int eax;
  long int xds;
  long int xes;
  long int xfs;
  long int xgs;
  long int orig_eax;
  long int eip;
  long int xcs;
  long int eflags;
  long int esp;
  long int xss;
};

也许在某些 glibc 版本中发生了变化?这是在 x86-64 Arch GNU/Linux 上,所以那些是普通的 glibc headers(取自 Linux 内核)。

ack user_regs_struct /usr/include 立即找到了正确的文件。 (比如 grep -r)。

注意文件的顶部说:

/* The whole purpose of this file is for GDB and GDB only.  Don't read
   too much into it.  Don't use it for anything other than GDB unless
   you know what you are doing.  */

我不知道为什么会有如此严厉的警告,或者它们是否真的意味着 ptrace。如果不止于此,如果阅读 header 并检查结构成员名称对您来说并不明显,我会谨慎使用它。也许它很好,也许它不是,只是说如果没有更多的研究,我不会依赖你用它编写的代码来做任何重要的事情。