0

Xcode を使用して MacOS で単純なコマンド ラインプログラムを作成してクロスコンパイルし、ジェイルブレイクされた iPad で実行することを目的とした教科書の基本的な「Hello World」の例に従っています。Xcode 4.2 インストールから MacOS 10.6.8 で arm-apple-darwin10-llvm-gcc-4.2 クロス コンパイラを使用します。サンプルコードは次のとおりです。

#include <stdio.h>

main ( ) {
printf("Hello, World!");
}

私が試みているコンパイルはこれです:

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -o hello hello.c -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk

これにより、file コマンドで検査するとオブジェクトが生成され、次のように表示されます。

$ file hello
hello: Mach-O executable arm

Ok。ここまでは順調ですね。これを iPad にコピーして、ldid を使用できるはずです。

ただし、失敗します:

MyiPad: /Applications root# ldid -S hello
codesign_allocate: object: hello malformed object (unknown load command 8)
util/ldid.cpp(582): _assert(78:WEXITSTATUS(status) == 0)

さらに、MacOS で文字列を実行すると、同じエラーが表示されます。

$ strings hello
strings: object: hello malformed object (unknown load command 8)

私の考えでは、Xcode の構成またはセットアップに問題があると思います。または、まだ十分なコーヒーを飲んでいません。しかし、これは教科書的な例であるため、セットアップに何かが欠けていることは明らかです。また、Xcode 4.2 と iPad 3 の Retina を使用した iOS 5.1に従って、プラットフォーム、sdk、および Sim ディレクトリを使用して iPhoneOS5.1.sdk をセットアップしようとしました。

どんなポインタでも大歓迎です。

4

2 に答える 2

2

はい。私は自分の質問に答えることができます...または少なくともそのほとんど。

まず第一に、MacOS の文字列コマンドは厄介者です。バイナリに何か問題があることを教えてくれたと思いました。しかし、otoolsとnmを使用できました。したがって、文字列は無視してください。誰かがその難問に答えたがらない限り、私はそれについて心配しません。それはまだ興味があります。

ここで Patrick Toomeyが説明したように、基本的には ldid が問題でした。簡単に言うと、ldid は、arm-apple クロスコンパイラが追加している Load コマンドをサポートしていないように見える codesign_allocate を使用します。

私の解決策は、キーチェーン アクセスを使用して MacOS で独自の自己署名証明書を作成し、/usr/bin/codesign を使用してバイナリに署名することでした。

詳細: $ export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate $ codesign -fs "certname" プログラム名

それをiPadにコピーして、あえぎながら実行してください。

于 2012-08-22T18:05:37.717 に答える
0

独自の証明書を作成する代わりに、ldid を確認してください: http://iphonedevwiki.net/index.php/Theos/Getting_Started

ホスト マシンで実行ldid -S binaryするだけで (ソースからビルドするか、ドロップボックスからダウンロードした後)、ジェイルブレイクされた iOS 5.1 で実行されます。

于 2013-01-05T18:13:06.057 に答える