源文件的编译过程
【摘要】 源文件的编译过程
Clang系列一:源文件的编译过程
打印源码的编译阶段执行步骤
clang -ccc-print-phases main.c
- input, “main.c”, c
- preprocessor, {0}, cpp-output:比如宏展开、头文件的导入、去除注释等
- compiler, {1}, ir:词法分析、语法分析
- backend, {2}, assembler:
- assembler, {3}, object
- linker, {4}, image:链接器
- 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)