c语言实现从源文件从文本到可执行文件经历的过程

 更新时间:2022年07月25日 08:46:43   作者:CW96  
这篇文章主要介绍了c语言实现从源文件从文本到可执行文件经历的过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

源文件从文本到可执行文件经历的过程

从 .c文件到 .exe文件

gcc hello.c -o hello.exe

源文件( -E)  预处理文件 (-S) 汇编文件 (-c) 目标文件 ( 无)可执行文件

hello.c--预处理--hello.i--编译--hello.s---汇编--hello.o--链接--hello.exe

预处理

gcc -E hello.c -o hello.i

1.头文件展开 —不检查语法错误,可以展开任意文件

2.宏定义—将宏名替换为宏值,不检查语法错误

3.替换注释—变成空行

4.展开条件编译—根据条件来展开指令

编译

gcc -S hello.i -o hello.s

1.将c程序翻译为汇编指令

2.逐行检查语法错误–整个编译4步中最耗时间的过程

汇编

gcc -c hello.s -o hello.o

1.将汇编指令翻译成对应的二进制编码

链接

gcc hello.o -o hello.exe

1.数据段合并

2.数据地址回填

3.库引入

在这里插入图片描述

寄存器、缓存、内存三者关系

cpu计算时,先预先把要用的数据从硬盘督导内存,然后再把即将要用的数据读到寄存器中。缓存能够提高数据的读取速度。

集成开发环境 IDE

用于提供程序开发的应用程序,一般包括编辑器、编译器、调试器和用户界面工具。

源程序如何到可执行程序

源程序(源代码)是指按照一定的程序设计语言规范编写的未经过编译的文本文件,是具有可读性的计算机语言指令。可以比作自己手写的程序代码。

可执行程序(Executable Program,EXE file)是可以在操作系统存储空间中浮动定位的二进制可执行程序。一般软件安装后会生成可执行文件,可以直接加载到内存中,并又操作系统加载并执行。

以 C 语言为例,自己编写的源代码文件扩展名为 c,这个 c 文件就是源文件。

从源文件到可执行文件一般需要经过几个步骤:预处理->编译->汇编->链接这四个过程。

  • 预处理:预处理相当于根据预处理命令将源代码转换为新的 c 程序,不过通常以 i 为扩展名。
  • 编译:将得到的 i 文件翻译成汇编代码,通常以 s 为扩展名。
  • 汇编:将汇编文件翻译为机器指令,并打包成可重定位目标程序的 o 文件。
  • 链接:将引用的其它 o 文件加到汇编后的 o 文件中,处理后得到最终的可执行文件。

这里首先在 linux 操作系统中编写源代码,并命名为 hello.c,内容如下:

#include <stdio.h>
int main()
{
    printf("Hello world!\n");
    return 0;
}

一个很简单的源代码,但是这样的源代码如果不是在集成开发环境(Integrated Development Environment,IDE)中是不能够直接点击执行的,需要经过一系列的操作,具体为:

# 预处理
gcc -E hello.c -o hello.i
# 编译
gcc -S hello.i -o hello.s
# 汇编
gcc -c hello.s -o hello.o
# 链接
gcc hello.o -o hello

经过以下操作后,就能够发现在 hello.c 文件同级目录中出现了文件 hello.i,hello.s,hello.o,hello。可知文件 hello 即为可执行程序,我们在终端中输入下方的指令,就能够看到最后的输出结果。

./hello

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++ STL priority_queue自定义排序实现方法详解

    C++ STL priority_queue自定义排序实现方法详解

    这篇文章主要介绍了C++ STL priority_queue自定义排序实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C++中不得不说的map容器

    C++中不得不说的map容器

    大家好,本篇文章主要讲的是C++中不得不说的map容器,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言中的结构体的入门学习教程

    C语言中的结构体的入门学习教程

    这篇文章主要介绍了C语言中的结构体的入门学习教程,以struct语句定义的结构体是C语言编程中的重要基础,需要的朋友可以参考下
    2015-12-12
  • C语言中的常量详解

    C语言中的常量详解

    本文主要讲解C语言 常量,这里整理了 C语言常量的基础知识,并附代码示例和示例详细讲解,希望能帮助开始学习C 语言的同学
    2021-09-09
  • C语言中双链表的基本操作

    C语言中双链表的基本操作

    这篇文章主要介绍了C语言中双链表的基本操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • c++ 调用python传输图片实例

    c++ 调用python传输图片实例

    今天小编就为大家分享一篇c++ 调用python传输图片实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C语言结构体指针引用详解

    C语言结构体指针引用详解

    C语言中结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。本文将详细为大家介绍一下这两种结构体指针如何引用,需要的小伙伴可以参考一下
    2021-12-12
  • C语言实现扫雷小游戏(扩展版可选择游戏难度)

    C语言实现扫雷小游戏(扩展版可选择游戏难度)

    游戏目标是找出所有没有地雷的方格,完成游戏;要是按了有地雷的方格,游戏失败;玩家可标记雷的位置,游戏以完成时间来评高低,并且用户可以选择游戏难度
    2019-10-10
  • 给ActiveX签名的实现方法详解

    给ActiveX签名的实现方法详解

    本篇文章是对给ActiveX签名的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 一文解密C++中的多态机制

    一文解密C++中的多态机制

    众所周知C++语言的三大特性:封装、多态、继承,其中多态就是去完成某个行为,但是会根据不同的对象产生不同的状态,下面小编就来带大家深入了解一下C++的多态机制吧
    2023-07-07

最新评论