从.c文件到可执行文件的四个阶段
2016-07-06 23:10
232 查看
预处理:gcc -E test.c -o test.i
①头文件的展开(加载);
②宏替换
③处理条件编译
总结:处理以“#”开头的语句
注:预处理不做语法检查
编译:gcc -c test.i -o test.o
①语法检查
②词法分析
汇编:gcc -s test.o -o test.s
①将c语言转化为汇编码
链接:
链接程序的主要工作是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够让操作系统装入执行的同一整体。
展开头文件,调用标准库里面定义的函数(这些函数可执行,但看不见源代码)有些函数书静态的调用,就是直接把函数写到源文件中,但有些事动态链接的,就是在链接阶段只判断这个函数的存在性,分配一个地址,在执行时再来替换函数。
连接处理可以分为两种:
①静态链接:在这种链接方式下,函数的代码将从其所在的静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。
②动态链接:在这种链接方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所做的只是在最终的可执行程序中记录下共享对象的名字以及其他少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。
预处理:gcc -E test.c -o test.i
①头文件的展开(加载);
②宏替换
③处理条件编译
总结:处理以“#”开头的语句
注:预处理不做语法检查
编译:gcc -c test.i -o test.o
①语法检查
②词法分析
汇编:gcc -s test.o -o test.s
①将c语言转化为汇编码
链接:
链接程序的主要工作是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够让操作系统装入执行的同一整体。
展开头文件,调用标准库里面定义的函数(这些函数可执行,但看不见源代码)有些函数书静态的调用,就是直接把函数写到源文件中,但有些事动态链接的,就是在链接阶段只判断这个函数的存在性,分配一个地址,在执行时再来替换函数。
连接处理可以分为两种:
①静态链接:在这种链接方式下,函数的代码将从其所在的静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。
②动态链接:在这种链接方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所做的只是在最终的可执行程序中记录下共享对象的名字以及其他少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- 在Windows平台下使用安装GCC(图)
- Aut2Exe编译au3脚本为可执行文件
- CentOS 6.3下编译安装Ruby 2.0笔记
- 把Lua编译进nginx步骤方法
- Lua和C语言的交互详解
- Lua中编译执行代码相关的函数详解
- Chrome Visual Studio 2005下的编译过程
- Windows下使用Cygwin编译MySQL客户端
- android的编译和运行过程深入分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例