1.6 简明编译原理
Last updated
Was this helpful?
Last updated
Was this helpful?
预处理:处理以 # 开头的预处理命令;
编译阶段:翻译成汇编语言;
汇编阶段:将汇编语言翻译成可重定位目标文件;
链接阶段:将可重定位目标文件和单独预编译好的目标文件合并,最终得到可执行的目标文件。
输入:可重定位目标文件;
输出:可执行的目标文件。
主要完成两个任务:
符号解析:每个符号对应于一个函数、全局变量或者静态变量,将每个符号引用与一个符号定义关联起来,即符号引用->符号定义;
重定位:符号定义->内存位置,之后符号引用->内存位置。
可执行目标文件:可以直接在内存中执行;
可重定位目标文件:可与其他可以重定位目标文件在链接阶段合并,创建一个可执行目标文件;
共享目标文件:特殊的可重定位目标文件,可以在运行时被动态加载进内存。
静态链接的问题:
当静态库更新的时候整个程序都要重新链接;
对于printf等标准函数库,如果每个程度都要静态链接,浪费资源。
共享库可以解决这个问题,在Linux系统中通常用.so,Windows中DLL:
给定的文件系统中一个库只有一个文件,所有引用该库的可执行目标文件都共享这个文件;
在内存中,共享库的.text字节的一个副本可以被不同的正在运行的进程共享。