1

カーネル拡張機能を含む製品を開発していますが、テスト マシンの 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 が含まれます。

この kext をテスト マシン (Xcode 3.2.6 を搭載した OSX 10.7.5、Darwin Kernel 11.4.2 x86_64) の 1 つにロードすると、ロードが拒否されます。

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 のロードを拒否していることを理解しています。このデバイスから署名すると、バイナリが変更されていない、ある種の切り離された署名が作成されます。-D オプションは役に立たないようで、バンドル内に _CodeSignature フォルダーを作成しません。

アップデート

XCode 4.6 の時点でも、問題は解決していません。下位互換性のある方法で署名されているのは、i386 kext のみです。一部の 10.6 および 10.7 カーネルでは、バイナリに埋め込まれた署名を理解できないため、x64 および混合アーキテクチャ kext をロードできません。

codesignコマンドライン ツールには、この目的のために文書化されていない--no-machoフラグがありますが、実装されていないようです。

更新 2

Xcode 4.6.2 4.6.3の時点でも問題は解決していません

4

2 に答える 2

3

前文: 何が起こっているかの説明

LC_CODE_SIGNATURE古いカーネル リンカー/ローダーは、セクションを含む kext の Mach-O オブジェクト コード内の特定のタイプのロード コマンドを処理できません。これは、たとえば、Xcode 4.5.x を使用してビルドされた 32 ビット/64 ビット混合の kext で問題が発生しました。ツールチェーンは、Lion および Snow Leopard カーネル リンカが予期していなかったさまざまな他のセクションを追加しました。(このバグは 4.6.x で修正されています)

Apple は、私が見つけた kext のコード署名に関する特定の情報を公開していません。独自の kext を見ると、署名されているものと署名されていないものがあります。(私が知る限り、オープンソースのものは署名されていないようです)署名された kext のバイナリの Mach-O セクションを ( を使用してotool -l) 見ると、バンドル バイナリLC_CODE_SIGNATUREとは異なり、Mach-O セクションが存在しないことがわかります。 .appsignature がデフォルトになりました。これは、Mountain Lion に同梱されている kext にも当てはまります。

したがって、古いバージョンをサポートするための解決策は、codesign で署名セクションをバイナリに挿入するのではなく、署名を別のファイルに配置することです。

解決

コードサインのソースコードで--no-macho文書化されていないフラグを見つけましたが、それでうまくいくようです。セクションがなく、署名は.LC_CODE_SIGNATURE_CodeSignature/CodeSignature

于 2013-03-27T19:51:14.600 に答える
1

解決策は、OS X の新機能ドキュメントの OS X v10.9 Mavericks ページの下部にある BSD and Kernel Features セクションで見つけることができると思います。残念ながら、プレリリースのカテゴリに該当するため、ここで情報を開示できるかどうかはわかりません。ただし、有料の 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 に答える