编译链接概论

  • 预编译
  • 编译
  • 汇编
  • 链接

预编译

  • 处理以#开头的预编译指令
    • gcc -E hello.c -o hello.i /g++ hello.c > hello.i
    • 删除#define, 展开宏定义
    • 处理条件预编译 #if。。。。
    • 递归处理#include,
    • 删除注释
    • 添加行号和文件名
    • 保留所有的#pragma, 编译器要使用

编译

  • gcc -S hello.i -o hello.s //生成汇编
  • 词法分析
  • 语法分析
  • 语义分析
    • 分析静态语义,动态语义运行时才能确定
  • 中间语言生成
    • 源代码级别的优化 比如 1 + 2 直接标识成3
  • 目标代码生成与优化
    • 代码生成器:中间语言转换为目标机器代码,生成汇编代码,依赖机器属性
    • 优化汇编

汇编

  • gcc -c hello.s -o hello.o
  • 生成二进制机器语言

链接

  • 地址和空间分配, 符号决议,符号重定位
  • 静态链接过程
    • main引用其他模块的函数符号,链接器根据符号名(函数签名)自动去相应模块找该函数地址,然后重新修正main函数中该函数的地址;

posted on 2019-04-24 22:00  slowlyChange  阅读(99)  评论(0编辑  收藏  举报

导航