使用arm-apple-darwin10-llvm-gcc-4.2的MacOS上的交叉编译问题



我正在学习一本教科书中的基本"Hello World"示例,该示例的目的是在带有Xcode的MacOS上创建并交叉编译一个简单的命令行程序,然后在越狱的iPad上运行它。我在MacOS 10.6.8上使用了arm-apple-darwin10-llvm-gcc-4.2交叉编译器,该编译器来自Xcode 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 hello
hello: Mach-O executable arm

好的。到目前为止还不错。我应该可以把这个复制到我的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的配置或设置有问题。或者我还没有喝足够的咖啡。但这是一个教科书式的例子,很明显我在设置中遗漏了一些东西。我还尝试过根据iOS 5.1在iPad 3 中使用Xcode 4.2和retina设置带有平台、sdk和Sim目录的iPhone OS5.1.sdk

非常感谢任何指点。

是。我可以回答我自己的问题。。。或者至少大部分。

首先,MacOS上的字符串命令只是转移注意力。我想这告诉我二进制有问题。但我可以在上面使用otools和nm。所以,忽略字符串。除非有人想回答这个难题,否则我不会担心。它仍然很奇怪。

从根本上讲,正如Patrick Toomey在这里解释的那样,ldid就是问题所在。简而言之,ldid使用的codesign_allocate似乎不支持arm apple交叉编译器正在添加的Load命令。

我的解决方案是使用密钥链访问在MacOS上创建自己的自签名证书,并使用/usr/bin/codsign对二进制文件进行签名。

详细信息:$export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/design_ALLOCATE$codesign-fs"certname"程序名

将其复制到iPad上,并运行喘息

与其创建自己的证书,不如签出ldid:http://iphonedevwiki.net/index.php/Theos/Getting_Started

只需在主机上运行ldid -S binary(从源代码构建或下载Dropbox后),它就会在越狱的iOS 5.1上运行。

最新更新