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

目录
  • 源文件从文本到可执行文件经历的过程
    • 从 .c文件到 .exe文件
  • 源程序如何到可执行程序

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

从 .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

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

(0)

相关推荐

  • 一起来学习C语言的程序环境与预处理

    目录 1.程序的翻译环境和执行环境 2.gcc C语言编译器来演示编译过程 2.1编译 2.2编译: 2.3运行环境 3详解预处理 3.1预定义符号 3.2#define 3.2.1#define定义标识符 3.2.2 #define定义宏 3.2.3 #define替换规则 3.2.4 #和## 3.2.5带副作用的宏参数 3.2.6宏和函数对比 3.2.7 命名的约定 3.3 undef 3.4命令行定义 3.5 条件编译 常见的条件编译指令: 3.6文件包含 3.6.1头文件被包含的方式

  • C语言从编译到运行过程详解

    目录 C语言从编译到运行 一.前言 二.C程序编译过程 三.阶段过程 1.预处理阶段 2.编译阶段 3.汇编阶段 4.链接阶段 C语言从编译到运行 一.前言 最近在看CSAPP(深入理解计算机系统)然后以前也学过C语言,但是从来没有深究写好的C代码是怎么编译再到执行的. 所以现在自己学习,然后记录下来. 以最常用的hello world!程序为例 程序名: main.c #include <stdio.h> int main() { printf("Hello world!\n&qu

  • C语言关于文件的操作方法总结

    目录 什么是文件 程序文件 数据文件 文件名 为什么要使用文件 文件的操作 文件缓冲区 文件指针(FILE) 文件的打开和关闭 fopen fclose 文件的打开方式 流的相关概念 文件的顺序读写 fputc fgets 什么是文件 程序文件 其实从文件的功能的角度来说:我们的文件可以分为两种类型的文件:程序文件和数据文件. 就拿我们C语言的程序为例子,包括了程序文件,即后缀为.c的文件:目标文件,即在windows环境下后缀为.obj的文件:可执行程序文件,即后缀为.exe的文件. 数据文件

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

    目录 源文件从文本到可执行文件经历的过程 从 .c文件到 .exe文件 源程序如何到可执行程序 源文件从文本到可执行文件经历的过程 从 .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.头文

  • C语言每日练习之统计文本单词数及高频词

    作业1:统计出txt文本里面的单词数,并找出频率出现最高的单词是哪个? 运行结果: 上代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //文件打开 //string file = System.IO.Fi

  • 易语言调用JS制作统计文本字数的代码

    调用统计字数js此功能由精易网页调试助手生成代码,配合精易模块使用. 常量数据表 .版本 2 .常量 字数统计js, "<文本长度: 269>" 统计文本字数的代码 .版本 2 .支持库 spec .程序集 窗口程序集_启动窗口 .子程序 文本_字数统计, 整数型, 公开, 用word方式计算正文字数,返回文本字数,汉字算一个,单词算一个,换行符和空格不算. .参数 文本, 文本型, , 需要统计的文本 .局部变量 c, 整数型 .局部变量 n, 整数型 .局部变量 z,

  • 易语言设置下次使用输出文本数据时的位置

    置写出位置方法 英文命令:SetWritePos 操作系统支持:Windows    所属对象:画板 设置下次使用"写文本行"或"写出"命令输出数据时的位置. 语法:  无返回值  画板.置写出位置 ([横向写出位置],[纵向写出位置]) 例程 说明 通过"置写出位置"命令设置使用"写文本行"命令写出文本的位置. 注: 在"置写出位置"之前已写出的文本无效. 运行结果: 总结 以上就是这篇文章的全部内容了,

  • 易语言修改组合框项目文本的方法

    置项目文本方法 英文命令:SetItemtext 所属对象:组合框 设置指定项目的文本.成功返回真,失败返回假. 语法:  逻辑型  组合框.置项目文本 (项目索引,欲置入的项目文本) 例程: 说明: 修改组合框项目文本. 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如果你想了解更多相关内容请查看下面相关链接

  • Java 添加文本框到PPT幻灯片过程解析

    本文将介绍图和通过Java程序添加文本框到PPT幻灯片的方法.包括设置文本框边框样式.填充效果.阴影效果.文本框旋转.文字样式等. 使用工具:Free Spire.Presentation for Java (免费版) Jar文件获取及导入: 方法1:通过E-iceblue官网下载jar文件包.下载后,解压文件,并将lib文件夹下的Spire.Presentation.jar文件导入到java程序.参考如下导入效果: 方法2:可通过maven仓库安装导入.可参考导入方法. Java代码示例(供参

  • Java程序与C语言的区别浅析

    Java和C语言虽有相同性,但两者也有一定的不同.Java程序是面向对象的一种简单.分布式 .解释.健壮.安全.结构中立.可移植.高效能.多线程.动态的语言它是面向对象而C语言是面向过程的,这是最大的不同,对于学过C语言的我们来说,Java可以说是比较简单的编程语言. 在Java语言中,所有的变量必须要首先声明,然后才能使用. Java中可以有若干类但有且只有一个public,一个类中至少含有一个main方法,否则程序不能运行.而一个C语言由若干函数构成,其中必须且只有一个main的主函数,程序

  • 一步一步跟我学易语言之什么是编程

    大家好,今天我们来学习一下什么是编程,如何较好地输入程序代码,还将解答一些初学者的一些常见问题. 什么是编程? 什么是编程呢?简单的说,编程就是为了借助于计算机来达到某一目的或解决某个问题,而使用程序设计语言编写程序代码,并最终得到结果的过程.下面通过分析第一个易程序,来了解什么是编程. 首先我们先来了解一下"_启动窗口"的作用吧,"_启动窗口"的作用是非常重要的,当程序启动后自动调入本窗口. 在属性表中可以看到"名称"一栏的内容为:"

  • 易语言编写侠盗猎车作弊器教程

    用易语言注册热键,模拟文本输出,编译作弊器 1.首先弄一个自己喜欢的界面,界面随意,必须要标签1个 2.添加一个"外挂海模块"自行百度搜索下载 3.窗口程序集里写变量 代码如下: .版本 2 .程序集 窗口程序集1 .程序集变量 IO, winio类 .程序集变量 F1键 4.写注册热键.文件输入代码 代码如下: .版本 2 .支持库 shellEx IO.开启winio () F1键 = 注册热键 (_启动窗口.取窗口句柄 (), 标签1.取窗口句柄 (), 0, #F1键) .子程

  • 易语言制作欢乐斗牛单机版游戏源码

    DLL命令表 .版本 2 .DLL命令 复制内存_复制位图信息头到字节集, , , "RtlMoveMemory" .参数 Dest, 字节型, 传址 .参数 Src, BITMAPINFOHEADER .参数 len, 整数型 .DLL命令 复制内存_复制位图文件头到字节集, , , "RtlMoveMemory" .参数 Dest, 字节型, 传址 .参数 Src, 文件头信息_ .参数 len, 整数型 .DLL命令 复制内存_字节集到字节集, , , &qu

随机推荐