编译低版本Gcc (<gcc3.4.6),报错error: unrecognizable insn:

来源:互联网 发布:内涵段子引流脚本源码 编辑:程序博客网 时间:2024/06/06 08:47

说在前面

这个问题发生在我使用Mac源码方式编译gcc3.4.1时发生的(Windows 上使用Cygwin安装也会有相同报错~),完整的报错为:

../../gcc/config/darwin-crt2.c: In function `__darwin_gcc3_preregister_frame_info':../../gcc/config/darwin-crt2.c:156: error: unrecognizable insn:(insn 11 9 12 0 (set (reg/f:SI 58)        (plus:SI (reg:SI 3 bx)            (const:SI (minus:SI (symbol_ref:SI ("&L___keymgr_global$non_lazy_ptr"))                    (symbol_ref:SI ("<pic base>")))))) -1 (nil)    (nil))../../gcc-3.4.1/gcc/config/darwin-crt2.c:151: internal compiler error: in extract_insn, at recog.c:2083Please submit a full bug report,with preprocessed source if appropriate.See <URL:http://gcc.gnu.org/bugs.html> for instructions.make[2]: *** [crt2.o] Error 1make[1]: *** [stage1_build] Error 2make: *** [bootstrap] Error 2

出现这个的过程是我执行了

../configure --prefix=$PREFIX  --with-gmp=$(brew-path gmp) --with-mpfr=$(brew-path mpfr) --with-mpc=$(brew-path libmpc) --program-suffix=-$VERSION  --enable-languages=$LANGUAGES --with-system-zlib --enable-stage1-checking --enable-plugin --enable-lto  --disable-multilibmake bootstrapmake install

另:关于Mac如何使用源码方式编译Gcc 请参照Mac安装GCC (使用时 发现wget并不好用,所以直接下载了压缩包,本地解锁使用的。效用相同)

如需转载,请注明出自喵喵丸的Blog

解决方案

已经是10多年前的解决贴了(此处不禁在想我到底找了什么陈年的东西来编译),下面两个网址是gnu.org上面找到的解决方法,亲测可用。
问题的引入
问题的解决

这里我来做一个简单的流程引导。
① 请将 make 之前的行为都做完(即是 执行完 ./configure xxxxxxxx之后)
② 找到入下图所示的 i386.c文件
目录示意
③ 修改该文件内容
首先找到下面的代码段

      /* Offsets of TLS symbols are never valid.     Discourage CSE from creating them.  */      if (GET_CODE (inner) == PLUS      && tls_symbolic_operand (XEXP (inner, 0), Pmode))    return false;

在之后添加

    /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O.  */ if (TARGET_MACHO && GET_CODE (inner) == MINUS)   {     if (GET_CODE (XEXP (inner, 0)) == LABEL_REF   || GET_CODE (XEXP (inner, 0)) == SYMBOL_REF)       if (GET_CODE (XEXP (inner, 1)) == SYMBOL_REF)          {             const char *sym_name = XSTR (XEXP (inner, 1), 0);             if (! strcmp (sym_name, "<pic base>"))               return 1;        }   }

这里写图片描述

④ 执行 make
⑤ 执行 make install

其他

感谢10年前 Andrew Pinski 帮我解决这么奇葩的问题 Q A Q

0 0