源文件的编译过程

举报
SamDong 发表于 2023/11/05 15:30:22 2023/11/05
【摘要】 源文件的编译过程

Clang系列一:源文件的编译过程

打印源码的编译阶段执行步骤

clang -ccc-print-phases main.c

  1. input, “main.c”, c
  2. preprocessor, {0}, cpp-output:比如宏展开、头文件的导入、去除注释等
  3. compiler, {1}, ir:词法分析、语法分析
  4. backend, {2}, assembler:
  5. assembler, {3}, object
  6. linker, {4}, image:链接器
  7. bind-arch, “x86_64”, {5}, image

示例代码:

#include <stdio.h>

int main()
{
   printf("Hello World");
   return 0;
}
文件 备注
.c/.cpp 源码文件
.i 预处理后的c文件
.ii 预处理后的cpp文件
.S/.s 汇编文件
.o 二进制目标代码

预处理阶段

预处理阶段会进行头文件的引入,宏替换,注释处理(删除掉),条件编译(#ifdef)等操作

查看预处理结果:

clang -E main.c

#include "stdio.h"就是告诉预处理器将这一行替换成头文件stdio.h中的内容 —— 可递归的,stdio.h也有可能包含其头文件。

编译阶段

词法分析

打印词法:

clang -fmodules -fsyntax-only -Xclang -dump-tokens main.c

语法分析

生成AST语法树:

clang -fmodules -fsyntax-only -Xclang -ast-dump main.c

生成BitCode(IR)

  • 生成.ll文本文件
clang -S -fobjc-arc -emit-llvm main.c
  • 基于.ll文本文件生成.bc文件
clang -S -emit-llvm -c main.ll -o main.bc

把所有的操作都从对内存的操作变成了对寄存器的操作

汇编代码

clang -S -fobjc-arc main.bc -o main.s 

clang -S -fobjc-arc main.ll -o main.s

目标文件

clang -fmodules -c main.m -o main.o

生成可执行文件

汇编器以汇编代码作为输入,将汇编代码转换为机器代码,最后输出目标文件(object file)

clang main.o -o main
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。