【C语言】编译和链接详解

hi,各位,让我们开启今日份博客~

小编个人主页点这里~

目录

  • 一、翻译环境和运行环境
    • 1、翻译环境
      • 1.1预处理(预编译)
      • 1.2编译
        • 1.2.1词法分析
        • 1.2.2语法分析
        • 1.2.3语义分析
      • 1.3汇编
      • 1.4链接
    • 2.运行环境

一、翻译环境和运行环境

在ANSI C(ANSI C 是美国国家标准协会创立的一套C标准,于1989年完成,这个版本的语言常被叫做C89.) 的任何一种实现中,存在两个不同的环境。
第一种是翻译环境,在这个环境中,源代码被转换成可执行的机器指令(二进制指令)。
第二种是运行环境,它用于实际执行代码。

在这里插入图片描述

1、翻译环境

翻译由编译链接两大部分组成,其中编译又分为预处理、编译、汇编三个过程。

在编译器中一个C语言的项目可能有多个.c文件一起构建,那多个.c文件如何生成可执行程序呢?

  • 首先多个.c文件单独经过编译器,编译处理成对应的目标文件(在Windows环境下的目标文件后缀是.obj,Linux环境下目标文件的后缀是.o)
  • 然后多个目标文件和编译库一起经过链接器处理生成最终的可执行程序(链接库是指运行时库【它是支持程序运行的基本函数集合】或者第三方库)。

如果我们再把编译器分成预处理、编译、汇编这三个过程,那就变成了以下过程:
在这里插入图片描述

1.1预处理(预编译)

在预处理阶段,源文件和头文件会被处理成.i为后缀的文件.
在gcc下观察对test.c文件预处理后的test.i文件,命令如下:

gcc test.c -E -o test.i

  • -E选项:提示编译器执行完当前命令后就停下来,后面的编译、汇编和链接暂不执行
  • -S选项:提示编译器执行完编译停下来,汇编、链接暂不执行
  • -c选项:提示编译器执行完汇编就停下来

预处理过程进行的操作
1、对#include 头文件进行包含
2、删除代码中的注释(使用空格替换)
3、#define 定义的符号进行替换,使用完后,符号删除

1.2编译

编译是将C语言程序转换成了汇编代码
在gcc下观察对test.i文件编译后的test.s文件,命令如下:

gcc test.i -S -o test.s

1.2.1词法分析

词法分析是使用一种叫做lex的程序实现词法扫描,它会按照用户之前描述好的词法规则将输入的字符串分割成一个个记号。产生的记号一般分为:关键字、标识符、字面量(包含数字、字符串等)和特殊符号(运算符、等号等),然后他们放到对应的表中。

我们以以下表达式为例进行词法分析:

array[index] = (index+4)*(2+6);

在这里插入图片描述

1.2.2语法分析

语法分析器根据用户给定的语法规则,将词法分析产生的记号序列进行解析,然后将它们构成一棵语法树。这些语法树是以表达式为节点的树,对于不同的语言,只是其语法规则不一样。

如下:
在这里插入图片描述

1.2.3语义分析

语义分析是由语义分析器来完成的,即对表达式的语法层⾯分析。编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段还会报告错误的语法信息。

如下:
在这里插入图片描述

1.3汇编

汇编过程是通过汇编器来完成的,汇编器将汇编代码转变成机器可执⾏的指令(2进制的指令),每⼀个汇编语句⼏乎都对应⼀条机器指令。它是根据汇编指令和机器指令的对照表一一 的进行翻译的,不做指令优化。
gcc下汇编命令如下:

gcc -c test.s -o test.o

1.4链接

链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。链接过程主要包括:地址和空间分配,符号决议和重定位等。

符号解析 目标文件中可能包含一些未定义的符号引用,如函数调用、全局变量引用等。链接器会在所有的目标文件和库文件中查找这些符号的定义,将符号引用与对应的符号定义进行匹配,确保每个符号都有正确的定义。
重定位编译生成的目标文件中的地址通常是相对地址或未确定的地址。链接器会根据最终可执行文件或库文件的布局,对目标文件中的代码和数据进行重定位,将相对地址转换为绝对地址,使程序在运行时能够正确地访问代码和数据。
合并段目标文件通常包含多个段,如代码段、数据段、只读数据段等。链接器会将各个目标文件中的相同类型的段进行合并,形成最终可执行文件或库文件中的相应段,并为每个段分配合适的内存地址。

在生成输出文件时,还会添加一些必要的头部信息,如程序入口点、段的属性等,以便操作系统能够正确的加载和执行程序。

2.运行环境

程序必须载入内存中,在有操作系统的环境中,一般由操作系统来完成,在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。程序载入内存之后,执行才能开始,开始后首先调用main函数,开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),储存函数的局部变量和返回的地址,程序同时也可以使用静态(static)内存,储存于静态内存中的变量在程序的整个执行过程一直保留他们的值,正常终止main函数时,程序终止,也有可能是意外终止。
在这里插入图片描述
如上图,我们双击以.exe结尾的可执行文件就会进入运行环境,此时程序已经被加载到内存中。

总结:

以上就是本期博客分享的全部内容啦!技术的探索永无止境。
道阻且长,行则将至!后续我会给大家带来更多博客内容,欢迎关注我的CSDN账号,我们一同成长!
(~ ̄▽ ̄)~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VIC模型率定验证

在气候变化问题日益严重的今天,水文模型在防洪规划,未来预测等方面发挥着不可替代的重要作用。目前,无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然,这些软件有各自的优点;但是&am…

【AWS入门】AWS云计算简介

【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算?云计算能干什么?我们如何利用云计算?云计算如何实现? 带着一系列问题,我将做一个普通布道者,引领广…

Flutter_学习记录_ ImagePicker拍照、录制视频、相册选择照片和视频、上传文件

插件地址&#xff1a;https://pub.dev/packages/image_picker 添加插件 添加配置 android无需配置开箱即用&#xff0c;ios还需要配置info.plist <key>NSPhotoLibraryUsageDescription</key> <string>应用需要访问相册读取文件</string> <key>N…

蓝桥与力扣刷题(蓝桥 星期计算)

题目&#xff1a;已知今天是星期六&#xff0c;请问 20^22 天后是星期几? 注意用数字 1 到 7 表示星期一到星期日。 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 解题思路&#xff0b;代码&#xff1a; 代码&#xff1…

向量数据库原理及选型

向量数据库 什么是向量什么是向量数据库原理应用场景 向量数据库的选型主流向量数据库介绍向量数据库对比主流向量数据库对比表 选型建议 什么是向量 向量是一组有序的数值&#xff0c;表示在多维空间中的位置或方向。向量通常用一个列或行的数字集合来表示&#xff0c;这些数…

以实现生产制造、科技研发、人居生活等一种或多种复合功能的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

小程序网络大文件缓存方案

分享一个小程序网络大图加载慢的解决方案 用到的相关api getSavedFileList 获取已保存的文件列表&#xff1b;getStorageSync 获取本地缓存&#xff1b;downloadFile 下载网络图片&#xff1b;saveFile 保存文件到本地&#xff1b;setStorage 将数据储存到小程序本地缓存&…

软考系统架构师 — 3 操作系统

目录 3.1 考点分析 3.1 操作系统概述 3.1.1 操作系统的功能 3.1.2 操作系统的分类 3.1.3 嵌入式操作系统主要特点 3.2 进程 3.2.1 进程的组成和状态 3.2.2 前趋图与进程资源图&#xff08;重点&#xff09; 3.2.3 进程同步与互斥 3.2.4 进程调度 3.2.5 死锁 3.3 线…

PE,ELF,COFF

本文来自 (1)腾讯元宝 (2)程序员的自我修养 PE&#xff08;Portable Executable&#xff09;是一种文件格式&#xff0c;主要用于Windows操作系统中的可执行文件&#xff08;如.exe、.dll、.sys等&#xff09;。PE格式是Windows操作系统中标准的可执行文件格式&#xff0c;由…

MySQL 在 CentOS 7 上安装的步骤指南

目录 1. 卸载不需要的环境 2. 获取 MySQL YUM 仓库 3. 安装 MySQL 4. 启动 MySQL 服务 5. 获取临时 Root 密码 6. 登录 MySQL 7. 更改 Root 密码 8. 设置 MySQL 开机自启动 9. 配置 MySQL 编码 10. 重启 MySQL 配置生效 11. 常见问题解决 1. 卸载不需要的环境 如果…

C++初阶——类和对象(三) 构造函数、析构函数

C初阶——类和对象&#xff08;三&#xff09; 上期内容&#xff0c;我们围绕类对象模型的大小计算&#xff0c;成员存储方式&#xff0c;this指针&#xff0c;以及C实现栈和C语言的比较&#xff0c;进一步认识了C的封装特性。本期内容&#xff0c;我们开始介绍类的默认成员函…

【NLP】 5. Word Analogy Task(词类比任务)与 Intrinsic Metric(内在度量)

Word Analogy Task&#xff08;词类比任务&#xff09; 定义&#xff1a;Word Analogy Task 是用于评估词向量质量的内在指标&#xff08;Intrinsic Metric&#xff09;。该任务基于这样的假设&#xff1a;如果词向量能够捕捉单词之间的语义关系&#xff0c;那么这些关系应该能…

矩阵幂(矩阵k次幂)

矩阵幂 #include<stdio.h> //矩阵乘法 void cf(int a[20][20],int b[20][20],int result[20][20],int n){for(int i0;i<n;i){for(int j0;j<n;j){result[i][j]0;for(int k0;k<n;k){result[i][j]a[i][k]*b[k][j];}}} }void print(int a[20][20],int n){for(int…

信火一体作战模式运用特点分析及对一体化防空反导能力建设的启示

文章目录 内容摘要1. 引言2. 信火一体作战模式在现代战争中的新内涵和特征2.1 充当火力和信息要素的作战单元种类更加丰富2.2 信息利用更加凸显异构平台间的数据共享和情报融合2.3 作战环节上更加强调指挥决策的敏捷性和智能化3. 增强防空反导能力的举措建议3.1 强化各类作战单…

样本是怎么估计总体的

样本是怎么估计总体的 flyfish 1. 什么是样本估计总体&#xff1f; 样本估计总体是指通过样本数据&#xff08;例如100人的身高&#xff09;推断总体参数&#xff08;例如全国人口的平均身高&#xff09;。核心方法包括&#xff1a; 点估计&#xff1a;用样本统计量直接估计…

自己动手打造AI Agent:基于DeepSeek-R1+websearch从零构建自己的Manus深度探索智能体AI-Research

第一章&#xff1a;AI Agent基础与DeepSeek-R1架构解析&#xff08;1/10&#xff09; 1.1 AI Agent技术演进与核心价值 人工智能代理&#xff08;AI Agent&#xff09;经历了从规则驱动到数据驱动的范式转移。早期基于专家系统的符号主义方法&#xff08;如MYCIN医疗诊断系统…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_13可展开行的固定表头表格

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_13可展开行的固…

Gemini Robotics:将人工智能带入物理世界

25年3月来自谷歌的技术报告“Gemini Robotics: Bringing AI into the Physical World”。 大型多模态模型的最新进展&#xff0c;已使数字领域出现卓越的通才能力&#xff0c;但将其转化为机器人等物理智体仍然是一项重大挑战。一般有用的机器人需要能够理解周围的物理世界&am…

关于离子滤波小记

粒子滤波&#xff08;Particle Filter, PF&#xff09; 粒子滤波是一种基于蒙特卡洛方法的贝叶斯滤波算法&#xff0c;主要用于解决非线性、非高斯的状态估计问题。它广泛应用于机器人定位、目标跟踪、金融建模等领域。 1. 粒子滤波的基本概念 粒子滤波的核心思想是用一组加权…