本篇我们的目标是在iPhone上运行arm64,C语言,C++和OC程序!
Clang 对于iOS开发者来说,Clang编译器一点也不陌生,Clang是一个C语言、C++、Objective-C、C++语言的轻量级编译器。源代码发布于BSD协议下,是基于LLVM的,也是Xcode 第一的编译器。交叉编译 指在一个平台上生成另一个平台上的可执行代码。现在我们就在Mac上写代码,在iPhone上运行,想想都刺激!设备环境 使用的是Mac和越狱iOS13.2.2的iPhoneX
Arm64
新建一个hello.txt文本把下面代码复制进去,保存退出
.extern _printf
.align 4
.text
.global _main
_main:
stp x29, x30, [sp,#-0x10]! ;保存 x29 和 x30 寄存器到栈,!用来控制基址变址寻址的最终新地址是否进行回写操作
mov x29, sp ;将 sp 寄存器放入 x29 寄存器
sub sp,sp,#0x20 ;分配栈空间
adr x0,msg ;第一个参数
bl _printf
add sp,sp,#0x20 ;释放栈空间
mov sp,x29 ;将 x29 给 sp
ldp x29,x30,[sp],0x10 ;出栈给 x29 和 x30
ret ;返回
msg:
.asciz "Hello,world!\n" ; data段有一个标号msg,代表字符串"Hello,world!\n"的首地址,类型为.asciz的字符串
改文本后缀,改为hello.asm文件打开终端,使开始编译
1、查看sdk安装路径
$xcrun --sdk iphoneos --show-sdk-path
2、clang编译
clang -arch arm64 -isysroot "sdk" -o hello hello.asm
// "-arch arm64" 指定框架
// " -isysroot" 指定sdk
// "-o" 输出目标文件
签名,在iOS系统中运行程序需要代码签名,所以要增加一个签名步骤。 a.新建ent.plist b.把下面代码复制进去,保存在hello.asm同一目录下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>platform-application</key>
<true/>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>run-unsigned-code</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
</dict>
</plist>
对hello文件进行签名
codesign -s - --entitlements ent.plist -f hello
把签名后的hello文件拷进iPhone的/usr/bin/目录下,好像很多目录下都可以的
scp hello root@192.168.0.170:/usr/bin
运行hello文件,完美!
----------------------华丽的分割线------------------------
c语言
新建1.txt复制代码保存,文件改为1.c
#include <stdio.h>
int main()
{
printf("C:Hello, World! \n");
return 0;
}
编译签名
拷贝到iPhone上,运行, 完美!
----------------------华丽的分割线------------------------
Object-C
新建2.txt复制代码保存,文件改为2.m
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"OC:Hello World!");
}
return 0;
}
编译签名 oc的编译有点不一样,因为导入了foundation框架,在Clang编译的时候需要指定一下
clang -arch arm64 -framework Foundation -isysroot "sdk" 2.m -o 2
拷贝到iPhone上,运行, 完美!
----------------------华丽的分割线------------------------
C++
新建3.txt复制代码保存,文件改为3.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "C++:Hello, world!" << endl;
return 0;
}
编译签名 因为clang完美兼容g++,gcc,所以一些命令可以完美继承!
拷贝到iPhone上,运行, 完美!
----------------------华丽的分割线------------------------
好了,今天的代码就敲到这里了,更多Clang的用法可以去看看文档。 文档:http://clang.llvm.org/docs/UsersManual.html