Comment résoudre l’erreur REG_EIP non déclarée (première utilisation dans cette fonction) sur une machine Linux 32 bits?

Des erreurs sont survenues lors de la compilation de mon programme de traitement de signal écrit en langage C avec gcc lors de l’affichage des valeurs du registre vidé après la survenue d’une erreur de segmentation. Quand j’ai essayé d’y accéder en utilisant le code:

void print_registers(FILE *fd, ucontext_t *ctx, bool fpu = false) { const char *flags_str[] = { "CF", 0, "PF", 0, "AF", 0, "ZF", "SF", "TP", "IF", "DF", "OF", 0, 0, "NT", 0, "RF", "VM", "AC", "VIF", "VIP", "ID" }; greg_t *regs = ctx->uc_mcontext.gregs; void *eip[1] = { (void*)regs[REG_EIP] }; char **symbol = backtrace_symbols(eip, 1); fprintf(fd, "Registers:\neip is at "); backtrace_symbols_fd(eip, 1, fd->_fileno); size_type flags = regs[REG_EFL]; fprintf(fd, "eflags: %x [ ", flags); for (size_type i = 0; i < sizeof(flags_str) / sizeof(flags_str[0]); ++i) { if (!flags_str[i]) continue; if (flags & (1 <> 12; fprintf(fd, "] iopl: %i\n" "eax: %08x\tebx: %08x\tecx: %08x\tedx: %08x\n" "esi: %08x\tedi: %08x\tebp: %08x\tesp: %08x\n" "cs: %04x\tgs: %04x\tfs: %04x\n" "ds: %04x\tes: %04x\tss: %04x\n", iopl, regs[REG_EAX], regs[REG_EBX], regs[REG_ECX], regs[REG_EDX], regs[REG_ESI], regs[REG_EDI], regs[REG_EBP], regs[REG_ESP], regs[REG_CS], regs[REG_GS], regs[REG_FS], regs[REG_DS], regs[REG_ES], regs[REG_SS]); } } 

J’ai essayé le code en ajoutant

  #include 

aussi bien que

  #define _GNU_SOURCE #ifndef REG_EIP #define REG_EIP 0x23b46F #endif 

Mais l’erreur apparaissant est:

  'REG_EIP' undeclared (first use in this function) (Each undeclared identifier is reported only once for each function it appears in.) 

et l’erreur apparaît pour tous les registres

J’ai essayé beaucoup de documents … mais je n’ai pas pu trouver la solution. Quelqu’un peut-il partager les détails pour résoudre cette erreur?

Avance grâce à tous les réplicateurs

Essayez de définir __USE_GNU avant d’ inclure :

 #define __USE_GNU #include  

Vous n'avez pas besoin d'inclure explicitement , fera.

Je pense que vous devriez soit avoir #define _GNU_SOURCE comme première ligne de votre fichier source, ou mieux mettre -D_GNU_SOURCE dans votre CFLAGS (sur la ligne de commande). Assurez-vous ensuite d’inclure et .

Essayez d’utiliser 32 bits car il s’agit de valeurs en mode 32 bits. gcc -m32 devrait résoudre ce problème.

Pour moi, cela a été résolu avec: yum remove openssl-devel.x86_64 yum installer openssl-devel.i686

sur CentOS 6.4 (x86_64)

J’espère que cela t’aides.