Как устранить ошибку REG_EIP undeclared (Первое использование в этой функции) на 32-битной машине Linux? - PullRequest
4 голосов
/ 15 апреля 2011

Я сталкивался с ошибками при компиляции моей программы обработки сигналов, написанной на языке C, с использованием gcc при отображении сброшенных значений регистров после возникновения ошибки сегментации.Когда я попытался получить к нему доступ с помощью кода:

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 << i)) fprintf(fd, "%s ", flags_str[i]);
        }
        size_type iopl = (flags & 0x3000) >> 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]);
                    }
                }

Я попытался код, добавив

                 #include<sys/ucontext.h> 

, а также

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

Но ошибкапоявляется:

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

и ошибка появляется для всех регистров

Я перепробовал много документов ... но не смог найти решение.Кто-нибудь может поделиться подробностями для устранения этой ошибки.

Заранее спасибо всем ответчикам

Ответы [ 4 ]

6 голосов
/ 15 апреля 2011

Я считаю, что вы должны либо иметь #define _GNU_SOURCE в качестве первой строки вашего исходного файла, либо лучше указать -D_GNU_SOURCE в вашем CFLAGS (в командной строке). Затем убедитесь, что вы включили <signal.h> и <ucontext.h>.

3 голосов
/ 15 апреля 2011

Попробуйте определить __USE_GNU до , включая <ucontext.h:

#define __USE_GNU
#include <ucontext.h>

Вам не нужно явно указывать <sys/ucontext.h>, <ucontext.h> сделает это.

0 голосов
/ 01 февраля 2014

Для меня это было решено с помощью: yum remove openssl-devel.x86_64 yum install openssl-devel.i686

в CentOS 6.4 (x86_64)

Надеюсь, это поможет.

0 голосов
/ 20 июля 2012

Попробуйте использовать 32 бита, так как это 32-битные значения режима. gcc -m32 должен решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...