在Mac / Windows上为iPhone编译ARM .s

时间:2012-09-04 08:07:58

标签: ios assembly arm

我是新手,这就是我想做的事情 -

  1. 使用ARMv7程序集创建简单程序 - 循环,计数器等
  2. 我希望能够在Mac / Win / Linux上编译它们以便在iPhone上运行
  3. 我有一个越狱的iPhone,所以我可以上传文件,用ldid签名并运行它
  4. 有人可以指出我如何使用免费提供的工具做到这一点?

    谢谢!

1 个答案:

答案 0 :(得分:1)

我想知道你在这里想要实现什么 - 是否要学习ARM汇编程序的开发?你想写iOS应用程序吗?

这些天没有理智的人在汇编程序中编写完整的应用程序 - 他们使用高级语言 - 并且在一些限制情况下优化汇编程序。这是一项非常专业和有用的技能。

使用完整的C程序作为代理主机是一个好的开始方式。在C中创建一个简单的Hello world程序,它调用一个(几乎)空函数。

您可以(大部分)使用XCode使其工作(您需要安装可选的命令行工具)。除了ARM的最终链接阶段之外,所有工作都使用clang。这显然只是MacOSX。

这种实验的一个更好的选择是ARM Linux系统,你不会在iOS的锁定环境中作战。 Raspberry Pi非常适合这项工作。你需要一个针对ARMv7的交叉编译工具链 - 其中有很多。如果使用Ubuntu,可以使用预先构建的软件包。

Main.c

#include<stdio.h>

extern void func();

int main()
{
    printf("Hello World\n");
    func();
}

func.c

#include <stdio.h>

void func()
{
    printf("In func()\n");
}

为您的主机环境编译并运行它以查看它的工作原理:

gcc main.c func.c `./a.out'

现在为您的目标环境进行编译。交叉编译工具的确切名称取决于您安装的内容(我的arm-angstrom-linux-gnueabi-gcc

arm-angstrom-linux-gnueabi-gcc main.c func.c

复制到您的目标,并证明它有效。

现在你可以开始编写一些汇编程序了。获取gcc为受害者文件func.c生成ARM汇编程序 - 这会生成文件func.s

arm-angstrom-linux-gnueabi-gcc func.c -s

    .cpu arm7tdmi-s
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 18, 4
.file   "func.c"
.section    .rodata
.align  2
.LC0:
.ascii  "In func()\000"
.text
.align  2
.global func
.type   func, %function
func:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
stmfd   sp!, {fp, lr}
add fp, sp, #4
ldr r0, .L2
bl  puts
sub sp, fp, #4
ldmfd   sp!, {fp, lr}
bx  lr
.L3:
.align  2
.L2:
.word   .LC0
.size   func, .-func 
.ident  "GCC: (GNU) 4.5.4 20120305 (prerelease)"
    .section    .note.GNU-stack,"",%progbits

您可以在此处看到标签func:.L3之间是func()的业务结束 - 而且它几乎都是功能序言和结语。您需要查看ARM Procedure Call Standard以了解这些内容以及有关使用哪些寄存器的指导。

完成编辑后,使用GCC再次编译整个内容

arm-angstrom-linux-gnueabi-gcc main.c func.s

...并测试它。