【问题标题】:Illegal instruction - haskell非法指令 - haskell
【发布时间】:2019-04-18 08:24:36
【问题描述】:

我正在本地机器上使用常规的cabal build 构建,并且二进制文件工作正常。但是当我将二进制文件复制到另一台服务器进行测试时(据我所知,相同的架构:x86_64 和相同的 glic 等等)我在尝试运行它时收到了非法指令。

我应该将一些标志传递给 cabal 以使其编译更通用的二进制文件吗?

谢谢

【问题讨论】:

  • 能否提供完整的错误日志?
  • 非法指令是完整的错误日志,不是编译时错误
  • 看起来编译器使用了一些 CPU 指令,这些指令在您的第一台机器上可用,但在另一台机器上不可用。如果这些是 linux,您可以比较 cat /proc/cpuinfo 并观察一些标志是不同的,指向一些缺失的指令。还可以尝试file yourExecutable 以确认它确实是ELF 64-bit LSB executable, x86-64。但是,我不知道如何创建更通用的二进制文件。也许你需要一些 llvm 标志(如果 ghc 正在通过 llvm)。
  • 是的,我本地的 cpu 比服务器的要新得多。我确实检查了二进制文件是一个常规的 64 位可执行文件,它是,我只是不知道如何告诉 cabal build 基本上使用 -march=generic -mtune=generic,就像我在 C 中所做的那样
  • 您需要为目标环境构建 GHC 编译器和库。如果您搜索“交叉编译 Haskell”,就会有大量信息。

标签: haskell


【解决方案1】:

与 GCC 不同,GHC 编译器只有少数选项可用于调整指令集,并且默认情况下它们全部关闭。完整列表如下:

-msse -msse2 -msse3 -msse4 -msse4.2 -mbmi -mbmi2 -mavx -mavx2
-mavx512cd -mavx512er -mavx512f -mavx512pf

但是没有相应的-mno-sse 或类似的选项可以关闭它们,因为就像我说的那样,它们默认是关闭的。 (嗯,实际上,在 x86_64 架构上,-msse-msse2 标志在技术上是强制打开的,不能被禁用。)

所以,问题可能是其他问题,很可能是不兼容或损坏的库。在gdb 下运行以获取回溯并查看是否可以发现可疑库或其他明显原因可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 2021-02-01
    • 2020-12-20
    • 2013-04-05
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2018-03-20
    相关资源
    最近更新 更多