C语言编译过程中*.i *.s *.o *.out 等文件是什么?

您所在的位置:网站首页 c语言文件路径么改 C语言编译过程中*.i *.s *.o *.out 等文件是什么?

C语言编译过程中*.i *.s *.o *.out 等文件是什么?

2023-08-28 00:53| 来源: 网络整理| 查看: 265

 

大家好我是大石斑Grouper,今天查资料时候看到一段鸡汤,喂大家喝一口。

皮格马利翁效应(Pygmalion Effect),又称罗森塔尔效应,即对人们的期望值越高,他们的表现就越好。

对个人而言也是如此,你越自信,你越有可能做好某件事,如果你不自信,觉得自己做不好,心理上就会自我设障碍;如大多数人都有过的经历:这道题我不会,知识点这么多我记不住,这个Bug我解不了,那原本基于你想象的阻力就会真实发生,你越深入执行,你内心的压力就越大,越觉得做不好;但如果有前辈指导你,给你信心上的支持,你会发现原来也没想象中难。

一句话概括,自信点,干就完了,别想太多。

 

进入正题,了解编译过程各个步骤和生成的文件,对面试和提升基础有帮助。

 

 

一个C语言代码源文件需要经过如图四个步骤,才能变成可以被计算机执行的文件。

 

hello.c 编译过程

 

预处理(preprocessing)指令:gcc -E hello.c -o hello.i

hello.i 文件:

预处理后文件,预处理器执行宏替换、条件编译以及包含指定的文件。

 

编译(compilation)指令:gcc -S hello.c -o hello.s

hello.s 文件: 汇编文件,由预处理得到的源代码文件,进行机器翻译产出。我们的老程序员前辈们以前大多都会学习汇编语言,但汇编语言写的源程序一般为大写的 .S 文件后缀,而且还会进行预处理、汇编等操作,而小写 .s文件后期阶段不再进行预处理操作,所以不能在内写预处理语句。以前我做单片机开发时候,厂家提供的库中通常都会有一个 *.s 文件 如startup_stm32f10x_cl.s。

 

汇编(assembly)指令:gcc -c hello.s -o hello.o

hello.o 文件:可重定位目标文件(机器码文件),由汇编文件经过汇编操作生成,该文件不可直接执行。

 

链接(assembly)指令:gcc -o hello.o -o hello

hello(.out) 文件:二进制可执行目标文件(也是一个目标文件),由机器码文件进一步链接生成。这一步中,各种符号引用和符号定义转换成为可执行文件中的合适信息,通常是虚拟地址。

如:hello程序调用了printf()函数。printf函数存在于printf.o的可重定向目标文件中。链接器(ld)会把这个文件并入到hello.o程序中,得到可执行文件,最后可执行文件加载到储存器后由系统负责执行。其中还有函数库概念,函数库一般分为静态库(*.a)和动态库(*.so)两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,生成的文件比较大,但在运行时就不再需要库文件。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由动态链接文件加载库。

 

以上4个步骤也可直接一步生成:

一气呵成指令:gcc hello.c -o hello

 

还有其他一些常见的文件格式概念。

*.elf 文件:Executable and Linkable Format,可执行连接格式。在Unix和X86-64 Linux上目标文件也被称为ELF文件,即上文中提到的可重定向目标文件、可执行目标文件、共享目标文件(库文件)都可以被称为ELF文件。

 

 

今天先聊到这里,我是大石斑,我们下次再见。

 

欢迎扫描二维码,阅读更多文章

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3