在新的Apple笔记本电脑上构建然后在更旧的Apple笔记本电脑上启动时,我的应用程序崩溃了。

当使用llvm 6.1和C++ 11时,该应用程序是在OSX 10.9和10.10上使用Xcode 6.4构建的。 SDK为10.10,目标OSX为10.7。优化已关闭。

当C运行时加载应用程序二进制文件并初始化模块时,崩溃非常早。

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   com.MyCompany.MyApplication     0x000000010cd10e7a _GLOBAL__I_a + 10
1   dyld                            0x00007fff61fd3ceb ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 265
2   dyld                            0x00007fff61fd3e78 ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 40
3   dyld                            0x00007fff61fd0871 ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int,

这是在我的任何应用程序代码之前。在构建机器(i7 CPU)上不会发生崩溃。在i5和Core 2 Duo机器上发生崩溃。我怀疑扩展指令(特定于CPU)正在导致加载时崩溃。

当我使用相同的Xcode,相同的llvm等在Core 2 Duo机器上构建应用程序时,没有崩溃。

我也在使用自制软件:libmtp,libusb,libusb-compat,cryptopp,curl(带有c-ares,openssl,nghttp2),boost。我在必要时指定了C++ 11,并指定了--build-bottle。我静态链接到这些库。

我试图在所有库,最终二进制文件等上使用otool -tV来查找SSE指令。

我试图将Xcode LLVM构 build 置设置为“平台”和“SSE3”设置为“启用附加 vector 扩展”,但无济于事。这可能是因为自制程序没有将--universal标志从curl传递到openssl及其cryptlib的构建。

我从较旧的机器上获取了静态库libcurl.a(CURL),libssl.a(OpenSSL),libcrypto.a(OpenSSL),libz.a(zlib),并将它们添加到了我的存储库中。使用Xcode将它们链接到我的应用程序可以解决此问题。

我还可以使用其他工具来缩小违规指令的范围吗?
还有其他关于飞机坠毁的解释吗?

附录:
除了在较旧的机器上构建库之外,我还创建了概念证明,最小的即时崩溃程序,该程序报告了稍有不同的崩溃位置,但演示了该问题:

在i7(具有新Intel CPU的新Apple计算机)上,使用自制软件安装:
brew install curl --with-c-ares --with-openssl

然后将此源复制到文件sse.cpp中:
#define CURL_STATICLIB
#include <curl/curl.h>
int main(int argc, const char * argv[]) {
    curl_global_init(CURL_GLOBAL_ALL);
    return 0;
}

编译:
clang++ sse.cpp -c -arch x86_64 -I/usr/local/opt/curl/include
clang++ -o a.out sse.o /usr/local/opt/openssl/lib/libssl.a /usr/local/opt/openssl/lib/libcrypto.a /usr/local/opt/zlib/lib/libz.a /usr/local/opt/curl/lib/libcurl.a /usr/local/opt/c-ares/lib/libcares.a -stdlib=libc++ -framework LDAP

现在移至具有旧版Intel CPU的旧版Apple计算机,并使其崩溃:
./a.out

崩溃报告(压缩):
Process:               a.out [569]
...
Code Type:             X86-64 (Native)
Parent Process:        bash [448]
Responsible:           Terminal [339]
...
OS Version:            Mac OS X 10.10.5 (14F27)
...
Crashed Thread:        0  Dispatch queue: com.apple.main-thread
Exception Type:        EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes:       0x0000000000000001, 0x0000000000000000
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   a.out                           0x000000010dbdce3f ENGINE_new + 36
1   a.out                           0x000000010dbe05e3 ENGINE_load_dynamic + 11
2   a.out                           0x000000010dbdf04a ENGINE_load_builtin_engines + 24
3   a.out                           0x000000010dc76b36 Curl_ossl_init + 14
4   a.out                           0x000000010dc5c2a5 curl_global_init + 114
5   a.out                           0x000000010db51d95 main + 37
6   libdyld.dylib                   0x00007fff88b735c9 start + 1

最佳答案

禁用编译器优化时,代码是否有效?如果没有,那么尝试旧版本的Xcode怎么样?它可能只是一个编译器错误,尽管我希望不会!如果可以找到可用的编译器或一组编译器选项进行检查,则可以使用LLVM的bugpoint工具来隔离哪个文件被错误编译。

10-07 19:16
查看更多