应用程序在 macOS 10.13 上崩溃,尽管符号被包装在 @available 中,但“DYLD,[0x4] 符号缺失”(macOS 10.14.4, *)

App crashes on macOS 10.13 with "DYLD, [0x4] Symbol missing" despite symbol being wrapped in @available(macOS 10.14.4, *)

提问人:C. Ocoa 提问时间:10/19/2023 最后编辑:C. Ocoa 更新时间:10/20/2023 访问量:122

问:

在我的 Objective-C 项目中只出现了一个符号。它被一个块包围:kDADiskDescriptionMediaEncryptedKey@available

if (@available(macOS 10.14.4, *)) {
    CFStringRef x = kDADiskDescriptionMediaEncryptedKey;
}

然而,该程序在macOS 10.13上崩溃:

Date/Time:             2023-10-18 19:37:34.273 +0200
OS Version:            Mac OS X 10.13.6 (17G65)
Report Version:        12
Anonymous UUID:        C780E8BB-9F5C-A7EC-2846-AD51F8D2912C


Time Awake Since Boot: 2700 seconds

System Integrity Protection: enabled

Crashed Thread:        0

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Reason:    DYLD, [0x4] Symbol missing

Application Specific Information:
dyld: launch, loading dependent libraries

Dyld Error Message:
  Symbol not found: _kDADiskDescriptionMediaEncryptedKey
  Referenced from: /Users/USER/Desktop/AvailableCrash.app/Contents/MacOS/AvailableCrash
  Expected in: /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration
 in /Users/USER/Desktop/AvailableCrash.app/Contents/MacOS/AvailableCrash

我在 macOS 13.6 (22G120) 上运行 Xcode 15.0 (15A240d)。程序在此开发计算机上按预期运行。

我做错了什么?

Objective-C macOS

评论

0赞 Cy-4AH 10/19/2023
它是在应用程序启动时还是在某个时候崩溃?
0赞 C. Ocoa 10/19/2023
它在加载符号时在启动时崩溃。main() 永远不会达到。
1赞 Cy-4AH 10/19/2023
在你包围的块中提到,但系统正在争论kDADiskDescriptionMediaEncryptionDetailKeykDADiskDescriptionMediaEncryptedKey
0赞 C. Ocoa 10/20/2023
你有敏锐的眼睛!唉,这只是一个复制/粘贴错误。我已经修改了问题。非常感谢您指出这一点!
0赞 Marek H 11/8/2023
只需添加对此问题的引用 github.com/apple/swift/issues/68163#issuecomment-1728212881(应该已使用 xcode 15.1 解决)

答:

0赞 Marek H 10/19/2023 #1

您不需要引用该符号。在宏块中使用硬编码值,看看是否有帮助。DAMediaEncrypted

(lldb) po kDADiskDescriptionMediaEncryptionDetailKey
DAMediaEncryptionDetail
(lldb) po kDADiskDescriptionMediaEncryptedKey
DAMediaEncrypted

评论

0赞 C. Ocoa 10/19/2023
是的,这是真的。为了简洁起见,我选择了这个例子,以构建一个再现问题的最小例子。实际上我正在使用不同的功能。
2赞 Brendan Shanks 10/20/2023 #2

Xcode 15.0 有一些与弱链接相关的错误(即符号在应该弱链接时没有弱链接),这是我在 PyObjC 中发现的一个错误。

试试 Xcode15.1b1,如果这不能解决问题,请向 Apple 提交反馈。同时,继续使用 Xcode 14 构建您的运输应用程序。

评论

1赞 C. Ocoa 10/20/2023
非常感谢!Xcode 15.1beta (15C5028h) 修复了此问题。但是,弱链接还有其他问题。我已经提交了错误报告(FB13289462)。
1赞 Carl Lindberg 10/23/2023
有一个标志 -ld_classic(添加到OTHER_LDFLAGS),它可以强制在 Xcode 15 中使用旧链接器,这可能允许您使用 Xcode 15。如果回到 Xcode 14,不确定这是否有效;如果您需要在 Xcode 之间切换,您可以有条件地添加 SDK = iphoneos17* 或 sdk-iphonesimulator17*。-Wl,-ld_classic