iOS 开发 Objective-C

iOS 逆向 day 18 GCC LLVM Clang

2020-08-13  本文已影响0人  望穿秋水小作坊

一、LLVM

1. 什么是 LLVM
2.创始人
3. 有些文章把 LLVM 当做 Low Level Virtual Machine (低级虚拟机)的缩写简称,官方开头描述如下

二、编译器架构

1. 传统编译器架构
传统编译器架构
2. LLVM 架构
LLVM 架构

三、Clang

1. 什么是 Clang?
2. 相比于 GCC,Clang 有如下优点
图解 Clang

四、OC 源文件编译的过程

编写如下 test.m 文件

int test(int a, int b) {
    int c = a + b + 3;
    return c;
}

1. 命令行查看编译过程:clang -ccc-print-phases test.m
carrot__lsp$ clang -ccc-print-phases test.m 
0: input, "test.m", objective-c
1: preprocessor, {0}, objective-c-cpp-output
2: compiler, {1}, ir
3: backend, {2}, assembler
4: assembler, {3}, object
5: linker, {4}, image
6: bind-arch, "x86_64", {5}, image
2. 词法分析,生成 Token:clang -fmodules -E -Xclang -dump-tokens test.m
carrot__lsp$ clang -fmodules -E -Xclang -dump-tokens test.m 
int 'int'    [StartOfLine]  Loc=<test.m:1:1>
identifier 'test'    [LeadingSpace] Loc=<test.m:1:5>
l_paren '('     Loc=<test.m:1:9>
int 'int'       Loc=<test.m:1:10>
identifier 'a'   [LeadingSpace] Loc=<test.m:1:14>
comma ','       Loc=<test.m:1:15>
int 'int'    [LeadingSpace] Loc=<test.m:1:17>
identifier 'b'   [LeadingSpace] Loc=<test.m:1:21>
r_paren ')'     Loc=<test.m:1:22>
l_brace '{'  [LeadingSpace] Loc=<test.m:1:24>
int 'int'    [StartOfLine] [LeadingSpace]   Loc=<test.m:2:5>
identifier 'c'   [LeadingSpace] Loc=<test.m:2:9>
equal '='    [LeadingSpace] Loc=<test.m:2:11>
identifier 'a'   [LeadingSpace] Loc=<test.m:2:13>
plus '+'     [LeadingSpace] Loc=<test.m:2:15>
identifier 'b'   [LeadingSpace] Loc=<test.m:2:17>
plus '+'     [LeadingSpace] Loc=<test.m:2:19>
numeric_constant '3'     [LeadingSpace] Loc=<test.m:2:21>
semi ';'        Loc=<test.m:2:22>
return 'return'  [StartOfLine] [LeadingSpace]   Loc=<test.m:3:5>
identifier 'c'   [LeadingSpace] Loc=<test.m:3:12>
semi ';'        Loc=<test.m:3:13>
r_brace '}'  [StartOfLine]  Loc=<test.m:4:1>
eof ''      Loc=<test.m:4:2>
3. 语法分析,生成语法树(AST,Abstract syntax Tree):carrot__lsp$ clang -fmodules -fsyntax-only -Xclang -ast-dump test.m
carrot__lsp$ clang -fmodules -fsyntax-only -Xclang -ast-dump test.m 
`-FunctionDecl 0x7fc0a8832ff8 <test.m:1:1, line:4:1> line:1:5 test 'int (int, int)'
  |-ParmVarDecl 0x7fc0a8832e70 <col:10, col:14> col:14 used a 'int'
  |-ParmVarDecl 0x7fc0a8832ee8 <col:17, col:21> col:21 used b 'int'
  `-CompoundStmt 0x7fc0a88332e8 <col:24, line:4:1>
    |-DeclStmt 0x7fc0a8833260 <line:2:5, col:22>
    | `-VarDecl 0x7fc0a8833110 <col:5, col:21> col:9 used c 'int' cinit
    |   `-BinaryOperator 0x7fc0a8833238 <col:13, col:21> 'int' '-'
    |     |-BinaryOperator 0x7fc0a88331f0 <col:13, col:17> 'int' '+'
    |     | |-ImplicitCastExpr 0x7fc0a88331c0 <col:13> 'int' <LValueToRValue>
    |     | | `-DeclRefExpr 0x7fc0a8833170 <col:13> 'int' lvalue ParmVar 0x7fc0a8832e70 'a' 'int'
    |     | `-ImplicitCastExpr 0x7fc0a88331d8 <col:17> 'int' <LValueToRValue>
    |     |   `-DeclRefExpr 0x7fc0a8833198 <col:17> 'int' lvalue ParmVar 0x7fc0a8832ee8 'b' 'int'
    |     `-IntegerLiteral 0x7fc0a8833218 <col:21> 'int' 3
    `-ReturnStmt 0x7fc0a88332d0 <line:3:5, col:12>
      `-ImplicitCastExpr 0x7fc0a88332b8 <col:12> 'int' <LValueToRValue>
        `-DeclRefExpr 0x7fc0a8833278 <col:12> 'int' lvalue Var 0x7fc0a8833110 'c' 'int'

上一篇 下一篇

猜你喜欢

热点阅读