C语言-程序预处理、编译、链接详解(一)

简介: C语言-程序预处理、编译、链接详解
+关注继续查看

程序的翻译环境

在ANSI C的实现中,存在两个不同的环境:翻译环境和执行环境。

翻译环境中源代码被转换为可执行的机器指令,执行环境用于实际执行代码。

翻译环境:

image

链接库:调用某一个函数时,会把和该函数相关的几个库一起链接进去。

组成一个程序的每个源文件通过编译过程分别转换成目标代码,每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序,链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。


编译阶段

在CentOS上写如下test.c程序:

image

(1)预处理阶段:

执行gcc test.c -E>test.i

image

 执行vim test.i查看.i文件,滚动到底部可以看到红色框内的代码,前面都是预处理时替换的内容,MAX(a,b)也被替换为((100)>(200)?(100):(200)),且注释不见了。

image

  以蓝色框内flockfile、ftrylockfile、funlockfile函数为例查看预处理时是如何替换库函数的:查看/usr/include/下的头文件

image

 vim 查看stdio.h文件,滚动到底部,可以看到flockfile、ftrylockfile、funlockfile函数,预处理使用stdio.h的内容将#include<stdio.h>替换了

image

 这说明执行gcc test.c -E>test.i做了3件事:1.完成头文件的包含,2#define定义的宏的替换,3.删除注释。

(2)编译阶段

 执行gcc test.i -S

image

 vim test.s,可以看到里面都是汇编代码

image

 编译阶段主要把C语言代码转化成汇编代码,包括语法分析、词法分析、语义分析、符号汇总。

(3)汇编阶段

执行gcc test.s -c,生成test.o文件

image

 test.o文件时elf格式的,使用readelf工具查看,执行readelf test.o -s查看test.o文件,生成的符号名有g_val、Add、main、printf分别对应源文件的全局变量和函数。

 汇编阶段把汇编代码转换成机器指令(二进制指令)生成目标文件,形成符号表。


链接阶段

将test.c中Add函数的执行放在add.c文件中:

test.c

image

 add.c

image

 编译成目标文件,查看目标文件:

test.o

image

image

 add.o

image

image

 可以看到test.o和add.o中的符号表都包含Add,但是test.o中的Add函数没有意义,只是声明而已。在链接阶段会合并段表,并进行符号表的合并和重定位。

编译链接阶段的执行过程:image


相关文章
|
2天前
|
Unix 编译器 C语言
Hello World!—— 属于我们的第一个C语言程序
C语言最早是由贝尔实验室的Dennis Ritchie为了UNIX的辅助开发而编写的,它是在B语言的基础上开发出来的。尽管C语言不是专门针对UNIX操作系统或机器编写的,但它与UNIX系统的关系十分紧密。由于它的硬件无关性和可移植性,使C语言逐渐成为世界上使用最广泛计算机语言。 为了进一步规范C语言的硬件无关性,1987年,美国国家标准协会(ANSI)根据C语言问世以来各种版本对C语言的发展和扩充,制定了新的标准,称为ANSI C。ANSI C语言比原来的标准C语言有了很大的发展。目前流行的C语言编译系统都是以它为基础的。
18 0
Hello World!—— 属于我们的第一个C语言程序
|
18天前
|
Linux 编译器 C语言
C语言进阶-程序环境和预处理(2)
C语言进阶-程序环境和预处理
31 1
|
20天前
|
编译器 C语言
C语言编程陷阱:链接陷阱
每一个外部变量只在一个地方声明,这个声明的地方一般就在一个头文件中,需要用到该外部的所有模块都应该包括这个头文件。 推荐一个零声学院免费教程,个人觉得老师讲得不错, 服务器课程
15 1
|
21天前
|
存储 自然语言处理 程序员
C语言 程序环境 编译和链接
C语言 程序环境 编译和链接
|
2月前
|
存储 自然语言处理 编译器
C语言的编译与链接
C语言的编译与链接
14 0
|
5月前
|
存储 自然语言处理 编译器
C语言进阶---程序的编译(预处理操作+链接)
本章主要介绍C语言的程序的编译,主要内容有:程序的翻译环境和执行环境、编译、链接细节剖析、运行环境、预处理详解。并且将一道百度面试题---模拟实现offsetof宏的功能。
C语言进阶---程序的编译(预处理操作+链接)
|
6月前
|
存储 自然语言处理 编译器
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
|
6月前
|
存储 编译器 C语言
【C】程序的编译/链接/预处理详解(C语言内功,精炼,基础)
【C】程序的编译/链接/预处理详解(C语言内功,精炼,基础)
|
7月前
|
C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
|
7月前
|
编译器 C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
相关产品
云迁移中心
推荐文章
更多