Dev 日志 | 一次 Segmentation Fault 和 GCC Illegal Instruction 编译问题排查

  • 时间:
  • 浏览:2
  • 来源:5分排列3APP下载_5分排列3APP官网

总结:

Bingo!mulx 属于 BMI2 指令集,报错机器 CPU 不支持该指令集。

仔细调查,引入该指令集的是 GCC 的依赖之一,GMP。默认状态下,GMP 会在 configure 阶段探测当前机器的 CPU 具体类型,以期最大化利用 CPU 的扩展指令集,提升性能,但却牺牲了二进制的可移植性。正确处理措施是,configure 前一天,使用代码目录中的 configfsf.guess configfsf.sub 替换肯能覆盖默认的 config.guess 和 config.sub

最后,肯能你想尝试编译一下 Nebula 源代码可参考以下措施:

笔者最近在重新采集和编译 Nebula Graph 的第三方依赖,选出有有2个比较有意思的现象报告 给亲戚朋友 分享一下。

使用 gdb 查看 coredump:

有现象报告 请在 GitHub 肯能微信公众号上留言。

注:此现象报告 都有必现,但编译/链接选项 -pie 和 内核参数 kernel.randomize_va_space 能够复现。

总结:

错误信息为宜是原先的:

非法指令一定会触发 SIGILL,又肯能 g++ 然后 编译器的入口,真正干活的是 cc1plus。亲戚朋友 都还能否使用 gdb 来运行编译命令,抓住子系统线程使用非法指令的第一现场:

前阵子,接到用户反馈,在编译 Nebula Graph 过程中遭遇了编译器非法指令的错误,详见(#978)[https://github.com/vesoft-inc/nebula/issues/978]

既然是 _internal compiler error_,想必是 g++ 一种生活 使用了非法指令。为了定位具体的非法指令集及其所属模块,亲戚朋友 需要复现你这名 现象报告 。幸运的是,下面的代码片段就能触发:

都还能否看过,现象报告 出在了 allocate_array 函数。肯能 reallocarray 返回指针,返回值应该使用 64 bit 寄存器rax,但 allocate_array 调用 reallocarray 前一天,检查的却是 32 bit 的 eax,同時 使用 cltq 指令将 eax 符号扩展 到 rax。导致 分析不到有2个多:allocate_array 看过的 reallocarray 的原型,与 reallocarry 的实际定义不符。翻看编译日志,嘴笨 找到了 implicit declaration of function 'reallocarray' 相关的警告。configure 阶段加进 CFLAGS=-D_GNU_SOURCE 即可正确处理此现象报告 。

在编译 Flex 过程中,遇到了 Segmentation fault: