“程序员自我修养”学习笔记---编译链接
2012-07-03 16:14
295 查看
假设我们写了一个最简单的c程序,文件名为hello.c。
然后我们执行:gcc hello.c -o hello
然后我们就可以得到一个可执行程序:hello
整个过程如下图所示。
这个过程看似简单,其实后面是由许多细节值得我们去学习的。
程序的整个编译过程其实包括以下几个步骤:预处理,编译,汇编,链接。
一. 预处理
预处理命令:gcc -E hello.c -o hello.i
预处理需要完成的任务包括以下几个:
(1)删除所有的“#define”,并展开所有的宏定义。
(2)处理所有的条件预编译指令,比如“#if”,“#ifdef”
(3)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。
(4)删除所有的注释
(5)添加行号和文件标识
(6)保留所有的#pragma编译指令
二. 编译
编译命令:gcc -S hello.c -o hello.s
编译过程主要完成的任务是:把预处理后的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件。这个过程是最核心和复杂的。
三. 汇编
汇编命令:gcc -c hello.s -o hello.o 或者as hello.s -o hello.o
汇编过程主要完成的任务是:将汇编代码转变成机器可执行的指令。
四. 链接
链接命令:ld -static /usr/lib/ctr1.o /usr/lib/crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2......
链接过程完成的主要任务是:进程代码指令的重定位等。
#include<stdio.h> int main(void) { printf("Hello World!\n");//打印字符串 }
然后我们执行:gcc hello.c -o hello
然后我们就可以得到一个可执行程序:hello
整个过程如下图所示。
这个过程看似简单,其实后面是由许多细节值得我们去学习的。
程序的整个编译过程其实包括以下几个步骤:预处理,编译,汇编,链接。
一. 预处理
预处理命令:gcc -E hello.c -o hello.i
预处理需要完成的任务包括以下几个:
(1)删除所有的“#define”,并展开所有的宏定义。
(2)处理所有的条件预编译指令,比如“#if”,“#ifdef”
(3)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。
(4)删除所有的注释
(5)添加行号和文件标识
(6)保留所有的#pragma编译指令
二. 编译
编译命令:gcc -S hello.c -o hello.s
编译过程主要完成的任务是:把预处理后的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件。这个过程是最核心和复杂的。
三. 汇编
汇编命令:gcc -c hello.s -o hello.o 或者as hello.s -o hello.o
汇编过程主要完成的任务是:将汇编代码转变成机器可执行的指令。
四. 链接
链接命令:ld -static /usr/lib/ctr1.o /usr/lib/crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2......
链接过程完成的主要任务是:进程代码指令的重定位等。
相关文章推荐
- 链接、装载与库学习笔记(一、编译)
- C和指针 学习笔记-1.编译与链接
- 学习笔记之编译和链接
- (编译-链接)-C语言学习笔记1
- 编译、链接学习笔记(五)动态链接
- linux下使用eclipse编译、链接、动态库的学习笔记
- 菜鸟C++精髓学习笔记--C++程序内部执行过程(预处理、编译、链接过程的作用)
- TQ2440 学习笔记—— 29、移植U-Boot【U-Boot 的编译、链接过程】
- 程序员的自我修养-编译,链接和库--学习笔记
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- linux学习笔记一, c语言程序的编译链接
- 编译、链接学习笔记(三)静态链接
- 编译、链接学习笔记(四)进程装载
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- 大地SEO教程学习笔记之二:链接的结构
- 【转】Ant学习笔记——自己构建Ant编译环境
- 【TINY4412】LINUX学习笔记:(2)内核模块编译、安装、加载、卸载
- [笔记二]探究编译与链接之目标文件
- 【学习笔记】【C语言】条件编译