【问题标题】:How to resolve REG_EIP undeclared (First use in this function ) error on Linux 32 bit machine?如何解决 Linux 32 位机器上的 REG_EIP undeclared (First use in this function ) 错误?
【发布时间】:2011-08-06 11:04:30
【问题描述】:

我在用 gcc 编译用 C 语言编写的信号处理程序时遇到错误,在发生分段错误后显示转储的寄存器值。当我尝试使用代码访问它时:

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.)

所有寄存器都出现错误

我尝试了许多文档...但无法找到解决方案。 任何人都可以分享解决此错误的详细信息。

感谢所有回复者

【问题讨论】:

    标签: c linux gcc signal-handling


    【解决方案1】:

    我相信您应该将#define _GNU_SOURCE 作为源文件的第一行,或者最好将-D_GNU_SOURCE 放在CFLAGS 中(在命令行上)。然后确保包含&lt;signal.h&gt;&lt;ucontext.h&gt;

    【讨论】:

      【解决方案2】:

      尝试定义__USE_GNU之前包括&lt;ucontext.h

      #define __USE_GNU
      #include <ucontext.h>
      

      您无需明确包含&lt;sys/ucontext.h&gt;&lt;ucontext.h&gt; 会这样做。

      【讨论】:

        【解决方案3】:

        尝试使用 32 位,因为这些是 32 位模式值。 gcc -m32 应该可以解决这个问题。

        【讨论】:

          【解决方案4】:

          对我来说,这是通过以下方式解决的: yum 删除 openssl-devel.x86_64 百胜安装 openssl-devel.i686

          在 CentOS 6.4 (x86_64) 上

          希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2016-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-22
            • 2021-01-17
            相关资源
            最近更新 更多