编译过程
- 预处理阶段: 符号化,宏定义展开,头文件展开
- 语法和语义分析阶段: 将符号化后的内容转化为一棵解析树、解析树做语义分析 输出一棵抽象语法树
- 生成代码和优化阶段:将 AST 转换为更低级的中间码 (LLVM IR)、对生成的中间码做优化、生成特定目标代码、输出汇编代码
- 汇编器阶段:将汇编代码转换为目标对象文件。
- 链接器:将多个目标对象文件合并为一个可执行文件 (或者一个动态库)
- 链接1
- 链接2
预处理
# 1. 预处理 ,
cc -E Person.m -o Person.i
cc -E main.c -o main.i
# 2 词法分析
# 语法分析 会解析生成抽象语法树
clang -Xclang -ast-dump -fsyntax-only main.c # 生成文件生成树
clang -Xclang -dump-tokens main.c # 这里会把代码切成一个个 Token,比如大小括号,等于号还有字符串等
# 3 生成代码和优化阶段
clang -emit-llvm main.c -c -o main.bc
# 接着用另一个命令来查看刚刚生成的二进制文件:
llvm-dis < main.bc | less
# 输出汇编代码
clang -S main.c -o main.s
#生成目标文件 c
clang -fmodules -c main.c -o main.o
# 生成可执行文件 Mach-O 二进制文件
# 链接器:将多个目标对象文件合并为一个可执行文件
clang main.c -o main.out
clang main.o -o main
clang[cc] 命令参数
- -x 编译语言比如objective-c
- -arch 编译的架构,比如arm7
- -f 以-f开头的。
- -W 以-W开头的,可以通过这些定制编译警告
- -D 以-D开头的,指的是预编译宏,通过这些宏可以实现条件编译
- -iPhoneSimulator11.1.sdk 编译采用的iOS SDK版本; 可以通过
xcrun
选定SDK xcrun -sdk iphoneos
- -I 把编译信息写入指定的辅助文件
- -F 需要的Framework
- -c 标识符指明需要运行预处理器,语法分析,类型检查,LLVM生成优化以及汇编代码生成.o文件
- -o 编译结果
xcrun -sdk iphoneos clang -arch armv7 -F Foundation -fobjc-arc -c main.m -o main.o
xcrun -sdk iphoneos clang main.o -arch armv7 -fobjc-arc -framework Foundation -o main
# 转汇编
xcrun --sdk iphoneos clang -S -arch arm64 main.c -o main.s
oc转c++/c,
看oc转c后类的结构
# arm64下 isa的指址 因为优化 会有偏移 [self class]。。 加了 objc_debug_isa_class_mask 会和[self class]一样
# x86下可以直接获取
p/x self->isa的地址 & (long)objc_debug_isa_class_mask
# 直接 cc OCClass.m -o OCClass 就是可执行文件
cc OCClass.m -o OCClass
# oc转c
xcrun --sdk iphoneos clang -rewrite-objc -F Foundation -arch arm64 OCClass.m