`gs` отсутствует в user_regs_struct? - PullRequest
0 голосов
/ 07 августа 2020

У меня есть следующий фрагмент кода, который не удалось скомпилировать на 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 
  }

PS: Я знаю, что мне нужно создать небольшой тестовый пример, но я не смог. Это не привело к этой ошибке в отдельном приложении. (неважно, что у меня нет оборудования, чтобы протестировать его локально). Все, что я знал, это то, что эта ошибка выскакивала, когда код был частью более крупной системы, создаваемой удаленно. Вот почему я надеялся, что, может быть, кто-то распознал это как «известную проблему» или имел некоторую интуицию относительно того, в чем может быть проблема.

1 Ответ

1 голос
/ 07 августа 2020

Похоже, что версия 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;
};

Возможно, это изменилось в какой-то версии glib c? Это на x86-64 Arch GNU / Linux, так что это обычные заголовки vanilla glib c (взяты из ядра 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 в целом. Если это больше, я бы с осторожностью использовал его вслепую, если чтение заголовка и проверка имен членов структуры не были для вас очевидны. Может быть, все в порядке, а может и нет, просто говорю, что я бы не стал полагаться на код, который вы пишете с его использованием, для чего-то важного без дополнительных исследований.

...