当前位置: 首页 > 知识库问答 >
问题:

OSX中的协同设计和内核扩展(Kext):不会加载

南宫海超
2023-03-14

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

在我的开发机器(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内核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、Code要求、CodeResources和CodeSignature。到目前为止,这个签名的kext似乎适用于所有设备。

所以问题是:

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

使现代化

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

codesign命令行工具有一个未记录的——没有用于此目的的男子气概标志,但似乎没有实现。

更新2

到Xcode时,这个问题仍然存在

共有2个答案

宿衡虑
2023-03-14

我相信可以在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

郤望
2023-03-14

序言:对发生的事情的解释

旧的内核链接器/加载程序无法处理kext的Mach-O对象代码中的某些类型的加载命令,包括LC_code_签名部分。这也导致使用Xcode 4.5构建的32位/64位混合KEXT出现问题。x、 工具链添加了Lion和Snow Leopard内核链接器没有预料到的各种其他部分。(该错误在4.6.x中已修复)

据我所知,Apple还没有发布任何关于共同设计kexts的具体信息。如果你看看他们自己的kexts,有些是签名的,有些不是。(据我所知,开源的似乎是未签名的)如果你查看二进制文件中的Mach-O部分以查找他们的签名kexts(使用otool-l),你会注意到LC_CODE_SIGNATURE不存在,不像. app捆绑二进制文件,其中这个内联签名现在是默认的。即使是Mountain Lion附带的kexts也是如此。

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

解决方案

我在codesign源代码中找到了未记录的——无男子气概的标记,这似乎起到了作用。没有LC\u code\u签名部分,签名最后出现在\u code签名/code签名中。

 类似资料:
  • 协议和扩展 你可以扩展一个已经存在的类型来采纳和遵循一个新协议, 就算是你无法访问现有类型的源代码也行. 扩展可以添加新的属性、方法和下标到已经存在的类型, 并且因此允许你添加协议需要的任何需要. protocol TextRepresentable { var textualDescription: String { get } } // 此处并无Dice这个类, 以及其sides属性

  • 这个文档描述了Mac OS X上的进程沙箱机制。 背景 沙箱将进程视为一种恶劣的环境,因为进程任何时候都可能被一个恶意攻击者借由缓冲区溢出或者其他这样的攻击方式所影响。一旦进程被影响,我们的目标就变成了,让这个有问题的进程能访问的用户机器的资源越少越好,并尽量避免在标准文件系统访问控制以外,以及内核执行的用户/组进程控制相关的行为。 查看概述文档了解目标与整体架构图表。 实现 在Mac OS X上

  • 扩展说明 RPC 协议扩展,封装远程调用细节。 契约: 当用户调用 refer() 所返回的 Invoker 对象的 invoke() 方法时,协议需相应执行同 URL 远端 export() 传入的 Invoker 对象的 invoke() 方法。 其中,refer() 返回的 Invoker 由协议实现,协议通常需要在此 Invoker 中发送远程请求,export() 传入的 Invoker

  • 虽然用了书名号,但它是我的一个业余项目而已,它以Sara Golemon在2005年著作的《Extending and Embedding PHP》一书为蓝本翻译修改而来。这里先对Sara女士表示感谢,为我们奉献了这么优秀的一本技术图书。截止到目前(2011年),这几年以来,PHP的应用在中国突飞猛进,已经渗透到了互联网的各个方面,现在每个公司里都不可能一点没有PHP的影子了。有关PHP语言自身的

  • 根据netty文件,默认Reactor。内蒂。ioWorkerCount计数是最大值(4,核心数),这在本地环境中似乎是正确的。我有一台6核笔记本电脑,Reactorhttp io线程数为6。 但在kuberenetes中部署docker image时,我们发现reactor http epoll(linux)线程数为36。我们的CPU配置是:请求4,限制6。 ROCKY在Spring WebFl

  • 最初的WSDL 2.0语言规范(2007年发布在 http://www.w3.org/TR/wsdl20/ )分为两部分:核心和附件 - 核心 - 由URI表示为:http://www.w3.org/ns/wsdl - 定义核心语言,该语言可用于基于服务提供的抽象模型来描述Web服务。 SOAP附件 - 为这些区域定义扩展语言: 消息交换模式 - 定义操作中列出的抽象消息的序列和基数。 预定义模式