当前位置: 首页 > news >正文

C语言程序环境剖析——探究从.c到.exe之路

程序环境

    • 1.程序的翻译环境和执行环境
    • 2. 详解编译+ 链接
      • 2.1 翻译环境
      • 2.2 编译的三部分
        • 预编译
        • 编译
        • 汇编
      • 2.3链接
    • 3.运行环境

1.程序的翻译环境和执行环境

ANSI C的任何一种实现中,都存在两个不同的环境。

  1. 翻译环境,在这个环境中源代码被转换成可执行的机器指令。
    (例如:vs2022这个集成开发环境就包括翻译环境)
  2. 执行环境, 它用于实际执行代码

2. 详解编译+ 链接

一个.c文件想要编程一个可执行程序,需要经过编译链接两步, 而编译又可细分为预编译编译汇编三过程,如图:
在这里插入图片描述

2.1 翻译环境

一个项目可能是由很多个.c文件共同构成的,每个.c文件需要分别进行编译产生.obj后缀的目标文件(windows环境)

在linux环境下是.o为后缀

接着在链接器的作用下将所有目标文件结合在一起进行最后产生了可执行程序。
在这里插入图片描述

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

2.2 编译的三部分

下面,我们就以一个例子来为大家简单的解释一下每个步骤都在干什么。

注:以下例子只是用来演示c语言编译各个阶段的特点,无实际意义

test.c

#include<stdio.h>
#include "add.c"
//这是注释
#define M 100
extern int g_val;
extern int Add(int x, int y);
int main()
{//开始struct s k;int b = 10;int c = Add(M,b);printf("%d", c);return 0;//结束
}

add.c

int Add(int x, int y)
{return x + y;
}struct s
{int a;char c;
};int g_val = 100;

预编译

在预编译过程中,会进行的操作有#include头文件的包含以及#define 宏的替换(预处理指令)还有注释的删除,总的来说,就是对代码文本进行改进。

我们用gcc编译器来编译代码,通过指令使其停在预处理结束之后的阶段,由此来观看代码文本的变化。

在终端输入: gcc -E test.c -o test.i即可生成预处理之后的文件,然后我们看看文件中的内容,如图:
在这里插入图片描述

编译

编译过程主要将进行语法分析词法分析语义分析以及符号汇总四个内容,同样,我们可以通过命令的方式得到编译后的文件。

这里简单讲解一下符号汇总,其实就是把函数名和全局变量之类的汇总起来,便于下一步作用。

命令:gcc -S test.c,然后我们看一下文件内容。

在这里插入图片描述
我们可以看到,其实经过编译之后,就是把我们的c语言代码转换为汇编代码。

汇编

接下来就是编译的最后一步,汇编了,通过这一步之后,我们写的c程序就完全转换成了目标文件(object code),由于目标文件是由二进制指令构成,所以我们是没办法看懂的,但是依旧可以通过指令的方式得到汇编后生成的文件。
指令: gcc -C test.c
通过这一指令,将生成test.o的文件,其和我们用vs编译生成的.obj 后缀文件性质相同。
在这里插入图片描述
汇编过程的进行大致有以下两步:

  1. 形成符号表

在编译过程中进行了符号汇总,而形成符号表简单来说就是将这些符号与地址配对,符号表 = 符号+地址
例如上面那个例子,两个文件的符号表就可以如此表示:
(地址是博主随便设的(doge))
test.c的符号表

符号地址
g_val0x010
Add0x783
main0x666

add.c的符号表

符号地址
Add0x200
g_val0x300
  1. 汇编指令-> 二进制指令 ------->test.o和add.o

2.3链接

链接部分主要执行两个操作:

  1. 合并段表
  2. 符号表的合并和符号表的重定位

这里为了解释合并段表,我们进行一定的扩展:

在linux环境下,生成的test.o和可执行程序都是elf格式的文件,而elf格式的文件时分段式的结构,每个段放置不同功能的数据,如图:
在这里插入图片描述
也就是说,这里段表的合并就是把多个.o文件中相同功能的段合并在一起。

而符号表的合并和重定位就是将相同的符号合并,并且替换掉无效的地址。

就拿刚才的例子来说,test.c 中的g_val 和Add符号是用extern外部引入的,需要在其他的文件才能找到其定义,也就是说,此时test 文件的符号表中这两个的地址是无效的,真正有效的地址在add.c中,因此需要进行合并。

上诉代码合并之后的符号表如下:

符号地址
g_val0x300
Add0x200
main0x666

以上就是从.c文件到.exe 文件的大体过程啦,当然其实编译的过程还有很多细节,如果有机会,之后博主会继续补充的嘿嘿!


3.运行环境

程序的执行过程:

  1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序 的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  2. 程序的执行便开始。接着便调用main函数。
  3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回 地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
  4. 终止程序。正常终止main函数;也有可能是意外终止。

以上就是关于程序环境的相关内容了,如果觉得写的不错还请大家多多点赞啊哈哈!

在这里插入图片描述

相关文章:

C语言程序环境剖析——探究从.c到.exe之路

程序环境1.程序的翻译环境和执行环境2. 详解编译 链接2.1 翻译环境2.2 编译的三部分预编译编译汇编2.3链接3.运行环境1.程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;都存在两个不同的环境。 翻译环境&#xff0c;在这个环境中源代码被转换成可执行的机器指…...

【软件测试】8年资深测试总结出的测试学习经验,从入门到测试开发......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试圈子里有一句话…...

【博学谷学习记录】超强总结,用心分享|Spark的RDD算子分类

概念 RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象&#xff0c;代表一个不可变、可分区、里面的元素可并行计算的集合&#xff0c;它是一种抽象的数据模型&#xff0c;本身并不存储数据&#xff0c;仅…...

云原生系列之使用 prometheus监控远程主机实战

文章目录前言一. 实验环境二. 安装node_exporter2.1 node_exporter的介绍2.2 node_exporter的安装三. 在prometheus服务端配置监控远程主机3.1 在server端配置拉取node的信息3.2 重启prometheus3.3 通过浏览器查看prometheus总结前言 大家好&#xff0c;又见面了&#xff0c;我…...

2023年地方两会政府工作报告汇总(各省市23年重点工作)

新年伊始&#xff0c;全国各地两会密集召开&#xff0c;各省、市、自治区2023年政府工作报告相继出炉&#xff0c;各地经济增长预期目标均已明确。相较于2022年&#xff0c;多地经济增长目标放缓&#xff0c;经济不断向“高质量”发展优化转型。今年是二十大后的开局之年&#…...

第一章 企业管理概论

目录 一、企业及其形式 二、企业管理概述 三、企业管理理论与实践的产生与发展 四、网络时代的企业环境 五、网络时代企业管理的变革 一、企业及其形式 1、企业的概念 企业以市场为导向&#xff0c;以价值增值作为经济活动的目的&#xff1b; 企业是从事商品生产和流通的…...

独立图片服务器有什么突出之处

服务器是网络中非常重要的设施&#xff0c;承载着不同流量的访问&#xff0c;这就要求服务器具有快速的吞吐量、高稳定性和高可靠性。独立图片服务器作为独立服务器的衍生品&#xff0c;在数据利用方面的应用可以为企业在数据处理和分析方面带来一场革命。本文就将介绍独立图片…...

Linux驱动开发基础__mmap

目录 1 引入 2 内存映射现象与数据结构 3 ARM 架构内存映射简介 3.1 一级页表映射过程 3.2 二级页表映射过程 4 怎么给 APP 新建一块内存映射 4.1 mmap 调用过程 ​编辑4.2 cache 和 buffer 4.3 驱动程序要做的事 5 编程 5.1 app编程 5.2 hello_drv_test…...

若依框架---为什么把添加和更新分成两个接口

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…...

图论算法:Floyd算法

文章目录Floyd算法例题&#xff1a;灾后重建Floyd算法 Floyd算法用于求图中任意两点之间的最短路径&#xff0c;该算法主要运用了动态规划的思想。 思考&#xff1a; 给你几个点与边&#xff0c;可以组成一张图&#xff0c;那么如何求得任意两点之间的最短路径呢&#xff1f;…...

回顾 | .NET MAUI 跨平台应用开发 - 用 .NET MAUI 开发一个无人机应用(下)

点击蓝字关注我们编辑&#xff1a;Alan Wang排版&#xff1a;Rani Sun微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0c;将…...

部署有多个仓库的svn服务

centos7自带svn服务&#xff0c;现需要创建多个仓库&#xff0c;并实现用户读写功能 创建svn版本库 mkdir /home/svn mkdir /home/svn/confmkdir /home/svn/yk1 mkdir /home/svn/yk2 svnadmin create /home/svn/yk1 svnadmin create /home/svn/yk2 进入版本库yk1的配置文件路…...

Mapper文件注入问题

Mapper文件注入问题UserMapper that could not be found.原因分析解决方案程序正常运行&#xff0c;但是注入类爆红问题原因分析解决方法UserMapper’ that could not be found. 原因分析 撰写了mapper文件&#xff0c;但是没有注入spring容器 解决方案 添加mybatis.mapper-…...

基于微信小程序的国产动漫论坛小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…...

常用限流算法

简单时间窗口 算法逻辑&#xff1a;设置周期时间内的最大并发量问题&#xff1a;在周期尾端进去阈值并发后&#xff0c;进入下一周期时&#xff0c;又进入阈值并发量&#xff0c;则会出现瞬时并发量是阈值的2倍。 滑动时间窗口&#xff08;优化&#xff09; 算法逻辑&#xf…...

前端面经详解

目录 css 盒子充满屏幕 A.给div设置定位 B.设置html,body的宽高 C.相对当前屏幕高度&#xff08;强烈推荐&#xff09; 三列布局&#xff1a;左右固定&#xff0c;中间自适应 flex布局&#xff08;强烈推荐&#xff09; grid布局 magin负值法 自身浮动 绝对定位 圣…...

网页CAD开发快速入门

演示说明 提示:目前提供两种在网页中浏览编辑CAD图纸方案&#xff0c;详细说明见&#xff1a;MxDraw帮助 网页中打开CAD最简步骤&#xff1a; 第一步: 安装插件运行环境&#xff0c;下载安装(可能需要退杀毒软件)&#xff1a;https://demo.mxdraw3d.com:3562/MxDrawx86Setup…...

C#开发的OpenRA的mod.yaml文件

C#开发的OpenRA的mod.yaml文件 在OpenRA游戏里,会看到这样一段代码: Manifest LoadMod(string id, string path){IReadOnlyPackage package = null;try{if (!Directory.Exists(path)){Log.Write("debug", path + " is not a valid mod package");return …...

【ESP32+freeRTOS学习笔记-(七)中断管理】

目录1、概述2、在ISR中使用FreeRTOS中专用的API2.1 独立的用于ISR中的API2.2 关于xHigherPriorityTaskWoken 参数的初步理解3、延迟中断处理的方法-将中断中的处理推迟到任务中去4 方法一&#xff1a;用二进制信号量来同步ISR与”延时处理的任务“4.1 二进制信号量4.2 函数用法…...

【总结】1591- 从入门到精通:使用 TypeScript 开发超强的 CLI 工具

作为一名开发者&#xff0c;掌握 CLI 工具的开发能力是非常重要的。本文将指导你如何使用 TypeScript 和 CAC 库开发出功能强大的 CLI 工具。快速入门首先&#xff0c;需要先安装 Node.js 和 npm&#xff08;Node Package Manager&#xff09;&#xff0c;然后在项目目录中创建…...

避坑指南:cocotb+icarus环境搭建常见问题排查(含pytest缺失解决方案)

深度解析cocotbicarus环境搭建&#xff1a;从零避坑到高效验证 第一次接触cocotb进行硬件验证的开发者&#xff0c;往往会在环境配置阶段遇到各种"拦路虎"。本文将从实际工程角度出发&#xff0c;系统梳理cocotb与Icarus Verilog配合使用时的典型问题链&#xff0c;不…...

从零开始理解IEC104协议:电力系统通信的底层逻辑与报文解析

从零开始理解IEC104协议&#xff1a;电力系统通信的底层逻辑与报文解析 在数字化电力系统的架构中&#xff0c;通信协议如同神经网络般连接着各类自动化设备。当变电站的遥测数据需要实时上传&#xff0c;或调度中心发出远程控制指令时&#xff0c;IEC104协议便是确保这些关键信…...

GitHub中文化插件:打破语言障碍,让全球最大开发者社区说你的母语

GitHub中文化插件&#xff1a;打破语言障碍&#xff0c;让全球最大开发者社区说你的母语 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese …...

Vercel+Railway+Zeabur多平台部署Typecho动态博客实战指南(附避坑技巧)

1. 为什么选择VercelRailwayZeabur部署Typecho&#xff1f; Typecho作为轻量级博客系统&#xff0c;很多开发者都遇到过传统虚拟主机性能不足或云服务器配置复杂的问题。我最初用共享虚拟主机部署Typecho时&#xff0c;经常遇到502错误和数据库连接中断&#xff0c;直到尝试了S…...

DNN硬件加速器设计实战:从MIT课程到FPGA实现的完整指南

DNN硬件加速器设计实战&#xff1a;从MIT课程到FPGA实现的完整指南 深度神经网络&#xff08;DNN&#xff09;硬件加速器设计正成为AI芯片领域的热门方向。MIT等顶尖院校的课程为这一领域奠定了坚实的理论基础&#xff0c;但如何将这些学术成果转化为实际可用的FPGA实现&#x…...

等了整整一年,Midjourney V8今天终于开放!

今夕是何年&#xff0c;Midjourney终于更新了…… 说真的&#xff0c;等这个版本等得有点久了&#xff0c;就在今天&#xff0c;Midjourney正式放出 V8 Alpha&#xff0c;开放社区测试。 虽然还是Alpha版本&#xff0c;但这一次&#xff0c;感觉不一样了。 Midjourney一直是A…...

ControlNet-v1-1 FP16终极指南:从零到精通的完整解决方案

ControlNet-v1-1 FP16终极指南&#xff1a;从零到精通的完整解决方案 【免费下载链接】ControlNet-v1-1_fp16_safetensors 项目地址: https://ai.gitcode.com/hf_mirrors/comfyanonymous/ControlNet-v1-1_fp16_safetensors ControlNet-v1-1_fp16_safetensors是Stable D…...

高效掌握百度网盘命令行工具:终端文件管理全面指南

高效掌握百度网盘命令行工具&#xff1a;终端文件管理全面指南 【免费下载链接】BaiduPCS BaiduPCS - 一个用 C/C 编写的百度网盘命令行工具&#xff0c;支持多线程下载、断点续传、快速上传等功能。 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduPCS 百度网盘命令…...

GOM传奇引擎外网架设避坑指南:常见问题与解决方案

GOM传奇引擎外网架设避坑指南&#xff1a;常见问题与解决方案 1. 外网架设前的关键准备工作 很多开发者在开始GOM引擎外网架设时&#xff0c;常常因为基础环境配置不当导致后续问题频发。这里分享几个容易被忽视但至关重要的准备环节&#xff1a; 硬件与网络环境检查清单&#…...

清音听真技术解析:Qwen3-ASR-1.7B语义理解层如何提升长句逻辑连贯性

清音听真技术解析&#xff1a;Qwen3-ASR-1.7B语义理解层如何提升长句逻辑连贯性 1. 语音识别技术的演进挑战 语音识别技术从早期的简单指令识别发展到如今的复杂场景理解&#xff0c;经历了巨大的技术飞跃。在真实应用场景中&#xff0c;我们经常遇到这样的挑战&#xff1a;说…...