【问题标题】:OS X Illegal Instruction: 4 in Travis-CIOS X 非法指令:Travis-CI 中的 4
【发布时间】:2018-06-28 05:40:52
【问题描述】:

我有一台 Mac Mini(运行 OS X 版本 10.11.6),我一直在尝试编译一个我想在 Travis-CI OS X 服务器上运行的二进制文件。

我之前已经成功地做到了这一点(使用相同的设备)。但是这一次,我收到了Illegal Instruction 4 错误,您可以在this line 上看到。我的 Mac Mini 上不会出现此错误。程序运行良好。它只发生在 Travis-CI 上。

对该错误的快速堆栈溢出搜索给了我this question,这表明可以通过使用-mmacosx-version-min=10.x 标志编译二进制文件来修复该错误。嗯,我试过没有用。更具体地说,我使用带有-mmacosx-version-min=10.9 标志的二进制文件进行编译,考虑到 Travis-CI OS X 版本是10.11,我认为应该没问题(这让我想知道为什么我首先会收到这个错误因为我在 OS X 10.11 上构建了二进制文件)。

我尝试运行的二进制文件可以找到here,如果我在上面运行otool -l,我会看到这个部分:

Load command 9
cmd LC_VERSION_MIN_MACOSX
cmdsize 16
version 10.9
sdk 10.11

看起来不错。我在 OS X 10.9 的兼容模式下编译并链接它,然后在 OS X 10.11 机器上编译它。动态依赖似乎也不错:

Mac-mini:~ patrick$ otool -L ./osx64-genXrdPattern 
./osx64-genXrdPattern:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

这是我用来构建二进制文件的 g++ 版本:

Mac-mini:~ patrick$ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

所以我花了很多时间试图弄清楚:为什么我的二进制文件不能在 Travis-CI 上运行?为什么我不断收到Illegal Instruction: 4?该二进制文件似乎在我的 Mac Mini 上运行良好。如果有人知道问题是什么或对解决问题有任何建议,将不胜感激。谢谢!

编辑:顺便说一下,这个二进制文件的代码可以在here 找到,我将它链接到objcryst 库。

Edit2:我尝试关闭编译器优化标志,看看优化是否发生了奇怪的事情。不过,即使关闭了编译器优化标志,我仍然得到相同的结果......

【问题讨论】:

    标签: c++ travis-ci osx-elcapitan


    【解决方案1】:

    我给 Travis-CI 的工作人员发了电子邮件,我收到了这个回复,我认为这可以解释问题:

    我看了看,我相信这会发生,因为我们混合使用了旧的 Apple Xserve(从 2004 年开始)和新的 Mac Pro。我们有其他客户出于同样的原因写信,而且他们经常需要更新的硬件才能成功。因此,我的预感是,当您的构建在 Xserve 机器上运行时,您会收到此错误。

    尽管 Travis-CI 运行的是 OS X 10.11,但我猜测旧的 Apple Xserve 硬件无法执行更新的 AppleClang 可以生成的所有指令。

    我对这个问题的解决方法是在 Travis-CI Xserve 机器本身上实际编译和链接程序。我认为这有助于确保不会产生非法指令。该程序现在可以在 Travis-CI 上成功运行。

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 2012-04-27
      • 1970-01-01
      • 2017-09-03
      • 2016-02-18
      • 2021-06-14
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      相关资源
      最近更新 更多