程序编译和链接

编译过程

hello.cpp 编译过程:预处理编译汇编链接

Prepressing
Prepressing
Compilation
Assembly
Linking
Linking
Source Code hello.cpp
Prepressed hello.i
Header Files stdio.h
Assembly hello.s
Object File hello.o
Executable File a.out
Static Library libc.a

预编译(Prepressing)

源代码文件 hello.cpp 和相关的头文件,如 stdio.h 等被预编译器 cpp 预编译成一个 .i 文件。

gcc –E hello.cpp –o hello.i

预编译过程主要处理预编译指令:

  • 删除 #define,并且展开所有的宏定义。
  • 处理条件预编译指令(#if, #ifdef, #elif, #else, #endif)。
  • 处理 #include 预编译指令。
  • 删除所有的注释。
  • 添加行号和文件名标识。
  • 保留所有的 #pragma 编译器指令。

可以查看预编译后的文件来判断宏定义是否正确或头文件是否正确包含。

编译(Compilation)

预处理完的文件进行一系列处理:扫描词法分析语法分析语义分析源代码优化汇编代码生成优化汇编代码

gcc –S hello.i –o hello.s

现在版本的 GCC 把预编译和编译两个步骤合并成一个步骤,使用一个叫 做 cc1 的程序来完成这两个步骤。

/usr/lib/gcc/i486-linux-gnu/4.1/cc1 hello.cpp

汇编(Assembly)

汇编代码转变成机器可以执行的指令。

gcc –c hello.cpp –o hello.o

程序 as 根据汇编指令和机器指令的对照表翻译。

as hello.s –o hello.o

链接(Linking)

程序 ld 产生一个能够正常运行 的 HelloWorld 程序:

ld -static -o HelloWorld /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.1.3/crtbeginT.o hello.o -L/usr/lib/gcc/i486-linux-gnu/4.1.3 -L/usr/lib -L/lib --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/i486-linux-gnu/4.1.3/crtend.o /usr/lib/crtn.o

参考文献

《程序员的自我修养》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值