1

我正在开发一种包含内核扩展的产品,并且在我们的一台测试机器中发现了一个我找不到解决方案的奇怪问题。

在我的开发机器(OSX 10.8.3 和最新的 Xcode)中,我像这样对我们的 kext 进行代码设计:

$ codesign -s "Developer ID Application: Mycompany" my.kext
my.kext: signed bundle with Mach-O thin (x86_64) [com.mycompany.kext]

一切正常,修改了 my.kext/Contents/MacOS/mykext 二进制文件(添加了签名),并创建了一个文件夹 my.kext/Contents/_CodeSignature,其中包含一个文件 CodeResources。

在我们的一台测试机器(OSX 10.7.5 和 Xcode 3.2.6,Darwin Kernel 11.4.2 x86_64)上加载这个 kext 时,它拒绝这样做:

kxld[com.mycompany.kext]: The Mach-O file is malformed: Invalid segment type in MH_KEXT_BUNDLE kext: 29.
Can't load kext com.mycompany.kext - link failed.
Failed to load executable for kext com.mycompany.kext.
Kext com.mycompany.kext failed to load (0xdc008016).

如果我加载未签名的模块,则没有问题。还尝试从 Xcode 而不是从命令行对 kext 进行签名,结果相同。

我将签名证书移到那台麻烦的计算机上,并在那里签署了 kext。签名过程有所不同:

$ codesign -v -s "Developer ID Application: Mycompany" my.kext
my.kext: signed bundle with generic [com.mycompany.kext]

签名后,my.kext/Contents/MacOS/mykext 中的 kext 可执行文件未修改,文件夹 Contents/_CodeSignature 包含更多文件:CodeDirectory、CodeRequirements、CodeResources 和 CodeSignature。到目前为止,这个签名的 kext 似乎适用于所有设备。

所以问题是:

这是怎么回事?我在签名过程中做错了什么?如何在可在此“过时”机器上运行的更新设备中创建签名?我知道目标机器拒绝加载 kext,因为它不理解签名的二进制文件。从此设备进行签名会创建某种分离的签名,其中二进制文件未被触及。我无法让我的 codesign 做到这一点, -D 选项似乎没用,并且不会在包中创建 _CodeSignature 文件夹。

更新

从 XCode 4.6 开始,问题仍然存在。只有 i386 kext 以向后兼容的方式签名。某些 10.6 和 10.7 内核无法加载 x64 和混合的 arch kext,因为它们不了解嵌入到二进制文件中的签名。

用于此目的的codesign命令行工具有一个未记录的--no-macho标志,但似乎未实现。

更新 2

从 Xcode 4.6.2 4.6.3开始,问题仍然存在

4

2 回答 2

3

序言:解释发生了什么

较旧的内核链接器/加载器无法处理 kext 的 Mach-O 目标代码中的某些类型的加载命令,包括该LC_CODE_SIGNATURE部分。这也导致了使用 Xcode 4.5.x 构建的混合 32 位/64 位 kexts 的问题,其中工具链添加了 Lion 和 Snow Leopard 内核链接器未预料到的各种其他部分。(此错误已在 4.6.x 中修复)

Apple 没有发布任何关于我能找到的代码设计 kext 的具体信息。如果您查看他们自己的 kext,有些已签名,有些未签名。(据我所知,开源的似乎是未签名的)如果您查看二进制文件中的 Mach-O 部分的签名kexts (otool -l使用签名现在是默认值。即使是与 Mountain Lion 一起发布的 kext 也是如此。LC_CODE_SIGNATURE.app

因此,支持旧版本的解决方案是将签名放在单独的文件中,而不是让 codesign 将签名部分插入二进制文件。

解决方案

在 codesign 源代码中--no-macho找到了未记录的标志,这似乎可以解决问题。没有部分,签名以.LC_CODE_SIGNATURE_CodeSignature/CodeSignature

于 2013-03-27T19:51:14.600 回答
1

我相信可以在 What's New in OS X 文档中 OS X v10.9 Mavericks 页面底部的 BSD 和内核功能部分找到该解决方案。不幸的是,我不确定我是否可以在这里披露这些信息,因为它属于预发布类别。但是,对于那些拥有付费 Mac Dev 帐户的人,这里是 URL:

https://developer.apple.com/library/prerelease/mac/releasenotes/MacOSX/WhatsNewInOSX/Articles/MacOSX10_9.html#//apple_ref/doc/uid/TP40013207-CH100

于 2013-08-27T18:51:59.073 回答