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

Posted

技术标签:

【中文标题】使用 arm-apple-darwin10-llvm-gcc-4.2 在 MacOS 上交叉编译问题【英文标题】:Cross Compile issues on MacOS with arm-apple-darwin10-llvm-gcc-4.2 【发布时间】:2012-08-22 03:30:58 【问题描述】:

我正在关注教科书中的一个基本“Hello World”示例,其目的是在 MacOS 上使用 Xcode 创建和交叉编译一个简单的命令行程序,然后在越狱的 iPad 上运行它.我在 MacOS 10.6.8 上使用 Xcode 4.2 安装的 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

好的。到现在为止还挺好。我应该可以将它复制到我的 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 with Xcode 4.2 and retina in iPad 3

使用平台、sdk 和 Sim 目录设置 iPhoneOS5.1.sdk

非常感谢任何指针。

【问题讨论】:

【参考方案1】:

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

首先,MacOS 上的字符串命令是一条红鲱鱼。我认为这告诉我二进制文件有问题。但我可以在上面使用 otools 和 nm。所以,忽略字符串。除非有人想回答这个难题,否则我不会担心。它仍然很好奇。

所以从根本上说,ldid 是 Patrick Toomey 解释的here 的问题。短篇小说,ldid 使用 codesign_allocate 似乎不支持 arm-apple 交叉编译器正在添加的加载命令。

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

详情: $ export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate $ codesign -fs "certname" 程序名

将其复制到 iPad 并 gasp 运行。

【讨论】:

【参考方案2】:

不要创建自己的证书,而是查看 ldid:http://iphonedevwiki.net/index.php/Theos/Getting_Started

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

【讨论】:

以上是关于使用 arm-apple-darwin10-llvm-gcc-4.2 在 MacOS 上交叉编译问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Intel 机器上构建 Apple Silicon 二进制文件

尝试执行“cc1”时出错:execvp:没有这样的文件或目录

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇