OS X非法指令:Travis-CI中的4个

时间:2018-01-19 02:36:21

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

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

我之前已成功完成此操作(使用相同的设备)。但是这一次,我在this line上看到了Illegal Instruction 4错误。我的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:我尝试关闭编译器优化标志,以查看优化是否发生了奇怪的事情。不过,即使编译器优化标志关闭,我仍然得到相同的结果......

1 个答案:

答案 0 :(得分:0)

我通过电子邮件发送了Travis-CI的工作人员,我收到了这个回复,我想这解释了问题:

  

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

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

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