由于____chkstk_darwin,在Catalina上使用部署10.10编译的MacOS应用程序在HighSierra版本<崩溃

MacOS App compiled with Deployment 10.10 on Catalina crashes on versions < HighSierra due to ____chkstk_darwin

本文关键字:应用程序 MacOS 崩溃 HighSierra 版本 lt 部署 darwin chkstk Catalina 由于      更新时间:2023-10-16

我们有一个多平台桌面应用程序,它使用用C++编写的通用组件。 该组件使用 OpenSSL 和 PocoProject - 两者都静态链接到库中。

在macOS上 - 我们有一个用Objective-C编写的小框架 - 它本质上是C++代码的单个h/cpp包装器。它使 macOS 开发人员能够轻松使用该组件(使用 Swift(。 框架的XCode项目以及应用程序的XCode项目将DeploymentTarget设置为10.10(Yosemite(。

这种设置多年来一直运行良好 - 但是在将开发环境升级到Catalina(XCode版本11.14.1 - Apple clang版本11.0.3(clang-1103.0.32.59((后,我们现在面临着重大麻烦。

我们的应用程序在HighSierra,Sierra,El Capitain,Yosemite上运行时会严重崩溃(在Catalina上构建之后 - 部署目标为10.10(。

Code Type:             X86-64 (Native)
Parent Process:        bash [345]
Responsible:           XXXCoreMacOSTestApp [845]
User ID:               501
Date/Time:             2020-05-18 21:45:43.354 +0200
OS Version:            Mac OS X 10.13.6 (17G66)
Report Version:        12
Anonymous UUID:        2FE97D01-7DEF-32CB-E57B-CDFB7A600D8F
Sleep/Wake UUID:       68646DF3-E40E-463D-A390-E90F56D5EA6E
Time Awake Since Boot: 3200 seconds
Time Since Wake:       1700 seconds
System Integrity Protection: enabled
Crashed Thread:        0  Dispatch queue: com.apple.main-thread
Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY
Termination Reason:    DYLD, [0x4] Symbol missing
Application Specific Information:
Performing @selector(Test:) from sender NSButton 0x7fcb724207a0
Dyld Error Message:
Symbol not found: ____chkstk_darwin
Referenced from: /Users/USER/Desktop/XXXCoreMacOSTestApp.app/Contents/MacOS/../Frameworks/XXXCoreMacOSWrapper.framework/Versions/A/XXXCoreMacOSWrapper
Expected in: /usr/lib/libSystem.B.dylib
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   dyld                           0x0000000114a2f24a __abort_with_payload + 10
1   dyld                           0x0000000114a2ebbc abort_with_payload_wrapper_internal + 89
2   dyld                           0x0000000114a2ebe9 abort_with_payload + 9
3   dyld                           0x0000000114a02482 dyld::halt(char const*) + 354
4   dyld                           0x0000000114a025a9 dyld::fastBindLazySymbol(ImageLoader**, unsigned long) + 170
5   libdyld.dylib                 0x00007fff7b8a3292 dyld_stub_binder + 282
6   ???                           0x0000000106a48000 0 + 4406411264
7   com.xxx.XXXCoreMacOSWrapper 0x00000001067af2e7 ssl3_write_bytes + 2871
8   com.xxx.XXXCoreMacOSWrapper 0x00000001067e52ad ssl3_do_write + 61
9   com.xxx.XXXCoreMacOSWrapper 0x00000001067dc057 state_machine + 1271
10  com.xxx.XXXCoreMacOSWrapper 0x000000010665cf58 Poco::Net::SecureSocketImpl::connectSSL(bool) + 328
11  com.xxx.XXXCoreMacOSWrapper 0x000000010665d29b Poco::Net::SecureSocketImpl::connect(Poco::Net::SocketAddress const&, Poco::Timespan const&, bool) + 203
12  com.xxx.XXXCoreMacOSWrapper 0x000000010666047c Poco::Net::SecureStreamSocketImpl::connect(Poco::Net::SocketAddress const&, Poco::Timespan const&) + 28
13  com.xxx.XXXCoreMacOSWrapper 0x00000001066aad06 Poco::Net::HTTPSession::connect(Poco::Net::SocketAddress const&) + 22

应用程序尝试动态加载/usr/lib/libSystem.B.dylib 并调用 chkstk (checkstack( 方法____chkstk_darwin。我想是编译器添加了这个检查?

我已经使用 oTool 检查了C++库 - 它们对共享库没有任何依赖。 我看到表单 oTool 它是添加此依赖项的 macOS 框架包装器。

我们的开发人员希望使用最新的 xcode/swift 版本 - 所以我们不想回到旧的 macOS/XCode 版本。

如何解决此问题?是否有任何编译器标志可以提供帮助?

问题在于OpenSSL和PocoProject的静态库是如何编译的。还需要在将部署目标设置为 10.10 的情况下编译它们。部署目标将阻止编译器插入对 chkstk 函数的调用。

更一般地说,必须使用设置的部署目标编译所有代码,以便成功部署到早于生成 OS 的操作系统版本。

直接调用编译器时,可以将-mmacosx-version-min=10.10作为编译器选项传递以设置部署目标。或者,您可以将环境变量MACOSX_DEPLOYMENT_TARGET设置为"10.10",以便编译器调用实现相同的目的。