美文网首页
Android逆向(003) 编译和链接

Android逆向(003) 编译和链接

作者: 笑容_235a | 来源:发表于2019-02-17 09:48 被阅读0次

    四大步骤

    上一篇文章中的ndk-build,一条命令就把源代码编译成了可以运行的文件,但这里面包含了非常复杂的过程。这个过程分成四个大的步骤:预处理(Prepressing),编译(Compilation),汇编(Assembly),链接(Linking)。
    1.预处理
    预处理,主要处理那些以#开头的的预编译指令,比如#include,#define等。
    2.编译
    把预处理过的文件,进行词法分析,语法分析,语义分析,以及优化,这个过程是最复杂的一个步骤。
    3.汇编
    汇编就是把汇编代码,一条一条的对应着转变成二进制文件。
    4.链接
    这个过程是最关键的一个步骤,不仅仅涉及到源码代码文件,而且涉及到编译器,以及操作系统,各种库文件。

    编译六个小步骤

    1.词法分析

    扫描器扫描源代码,生成各种词语:关键字,标识符,字面量,运算符(+-*/等)

    2.语法分析

    语法分析器,就是生成各种以表达式为节点的语法树。

    3.语义分析

    经过语义分析后的语法树节点,都被赋予了类型。

    4.中间代码生成

    直接在语法树上做优化,比较困难,所以一般先生成一种中间代码。比较常见的中间代码有三地址码,P代码。

    5.目标代码生成

    代码生成器生成目标代码,这个过程依赖具体的机器。不同的机器有不同的字长,寄存器,整数类型,浮点数类型。

    6.目标代码优化

    优化方法很多,比如选择合适的寻址方式,使用位移代替乘法运算,删除多余的指令等。

    经过上面六个步骤,大部分问题都解决了,就剩下一个问题:就是互相引用模块里面的变量及函数的地址的确定。这个问题是正是链接需要解决的问题。

    链接

    所谓的链接技术,就是多个模块互相访问时,怎么找到对方的地址,实际上早在纸带机时代,我们就用到了链接技术,因为多条纸带机之间也需要互相调用访问。

    解决这个问题的方法也很简单,就是用符号代替直接的地址。

    链接过程主要包括了:
    -地址和空间分配
    -符号决议
    -重定位

    经过这么多步骤,我们终于生成了可执行文件,这个可执行文件里面有什么呢?下一篇文章里面我们一起去探究。

    相关文章

      网友评论

          本文标题:Android逆向(003) 编译和链接

          本文链接:https://www.haomeiwen.com/subject/udgweqtx.html