c语言编译和链接
文章目录
- 翻译环境和运⾏环境
- 编译
- 预处理
- 编译
- 词法分析
- 语法分析
- 语义分析
- 汇编
- 链接
- 地址和空间分配
- 符号决议
- 重定位
翻译环境和运⾏环境
在c语言标准(ANSI C)中的任何⼀种实现中,存在两个不同的环境。
- 翻译环境:在这个环境中将人写的文本代码翻译成机器“看得懂”的,可以直接执行的二进制代码
- 运行环境:机器执行代码的环境
编译和链接就是翻译环境的两个大过程
一个或多个源文件单独通过经过编译后生成一个或多个目标文件,多个目标文件经过链接库【链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库】链接在一起生成可执行文件,可执行文件被机器直接指行的得出结果

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
编译
编译分为预处理(预编译),编译,汇编三个过程
预处理
预处理阶段主要是执行预处理指令,例如头文件的包含,替换#define定义的代码,宏等
具体的工作:
- 将所有的 #define 删除,并展开所有的宏定义。
- 处理所有的条件编译指令
- 处理#include ,将包含的头⽂件的内容插⼊到该#include的位置
- 删除所有的注释
- 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等
- 保留所有的#pragma的编译器指令,编译器后续会使⽤。
预处理后的代码还是文本代码
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
编译
编译过程就是将预处理后的⽂件进⾏词法分析、语法分析、语义分析及优化,⽣成相应的汇编代码⽂件。
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
词法分析
扫描器将代码拆分为一个个的特殊记号(关键字,标识符,特殊字符,运算符等),方便编译器解析
词法分析时还会将拆分后的符号汇总,方便链接的进行
例
a[i] = i * (2 + j);
该行代码会被扫描器分成11个记号,分别为:
a , [ , i, ] , = , * , ( , 2 , + , j , )
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
语法分析
语法分析器,将对扫描产⽣的记号进⾏语法分析,从⽽产⽣语法树
这些语法树是以表达式为节点的树
例
a[i] = i * (2 + j);
该代码拆分的词法形成的语法数为

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
语义分析
语义分析器来完成语义分析,即对表达式的语法层⾯分析。
编译器所能做的分析是语义的静态分析。
静态语义分析通常包括声明,类型的匹配,类型的转换等。
语义分析会报告错误的语法信息。
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
汇编
汇编器是将汇编代码转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。
汇编还会将编译的词法分析汇总的符号制成符号表【符号表就是多个符号+符号的地址所构成的表】,并将符号表传给链接库,方便链接
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
链接
链接的时候需要把⼀堆⽂件链接在⼀起⽣成可执⾏程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。
链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
地址和空间分配
C语言的链接过程中,地址和空间分配是一个重要的环节,它涉及到程序的内存布局,即程序在内存中如何分布及其各自的地址范围。
以下是链接过程中地址和空间分配的一些关键点:
-
文本段(Text Segment):
- 文本段包含了程序的机器代码,即编译后的指令。
- 在链接过程中,链接器会合并各个目标文件中的文本段,并确定唯一的入口点(通常是
main函数)。 - 文本段的地址通常是可以预测的,因为它包含了程序的指令,这些指令在程序每次运行时都会被加载到内存的相同位置。
-
数据段(Data Segment):
- 数据段包含了程序中声明的静态变量和全局变量。
- 在链接过程中,链接器会合并各个目标文件中的数据段,并为其分配连续的内存空间。
- 数据段的地址在程序运行时是固定的,因为这些变量在程序开始执行时存在于内存中。
-
堆(Heap):
- 堆是程序在运行时动态分配内存的区域。
- 在C语言中,使用
malloc、calloc、realloc等函数动态分配的内存都位于堆上。
-堆的地址空间在程序运行时是连续的,但操作系统会跟踪这些内存块的使用情况,以便于后续的释放和再分配。
-
栈(Stack):
- 栈是用于存储函数调用时的局部变量和返回地址等信息的区域。
- 每个函数调用都会有自己的栈帧,用于存储局部变量和返回信息。
- 栈的地址空间是向内生长的,新的栈帧会覆盖旧的栈帧。
-
重定位表(Relocation Table):
- 重定位表记录了程序中需要重定位的符号和它们的新的地址。
- 在链接过程中,链接器会生成重定位表,并在程序加载时由操作系统或加载器使用,以确保程序中的符号引用正确地指向其在内存中的位置。
-
动态内存分配(Dynamic Memory Allocation):
- 如果程序使用了动态内存分配(如标准库中的
malloc等函数),那么这些内存将在程序运行时由操作系统动态地分配和释放。 - 动态分配的内存通常位于堆上,但具体的地址是在运行时确定的。
- 如果程序使用了动态内存分配(如标准库中的
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
符号决议
符号决议是指链接器在将多个编译后的目标文件合并成一个可执行文件时,
确定每个符号(如函数名、变量名等)所对应的具体地址的过程。
这个过程确保了程序在运行时能够正确地找到并调用所需的函数和访问变量。
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
重定位
在C语言程序链接过程中,重定位是一种重要的步骤,它涉及将不同的目标文件中的符号(函数或变量)的地址合并到一个单独的可执行文件中。
当多个目标文件需要访问同一符号时,编译器无法确定哪个文件中的符号地址应该被使用,因此需要进行重定位。
重定位是程序能够正确访问外部函数和变量的关键。
C语言链接过程中的重定位主要分为静态链接和动态链接两种方式。
- 静态链接重定位:
在静态链接过程中,链接器会在编译后的目标文件中将所有的符号(函数名、变量名等)和它们的地址进行绑定,并将这些地址填写到可执行文件中。
这个过程称为重定位。当可执行程序被操作系统加载到内存中时,由于所有的符号已经在链接过程中被重定位,因此程序可以直接使用这些符号,而不需要再进行地址绑定
静态链接的优点是运行效率高,因为它在编译和链接阶段就已经完成了所有的重定位工作。但是静态链接也有一些缺点,比如占用物理内存较多,且无法实现动态更新。
- 动态链接重定位:
与静态链接不同,动态链接在编译阶段不会将符号和地址进行绑定,而是仅仅在可执行文件或动态库中记录一些必要的信息。
这些信息包括符号名称、符号类型以及符号在动态链接器中的地址。当程序运行时,操作系统会首先加载可执行文件和动态链接器到内存中,然后通过动态链接器来完成符号的绑定和重定位工作。
动态链接的优点是可以节省物理内存,因为它不需要将所有的库函数都包含在可执行文件中。
此外,动态链接还可以实现动态更新,例如在程序运行过程中可以动态地加载或卸载库函数。
但是动态链接也有一个缺点,就是程序的运行效率相对较低,因为它需要在运行时进行符号绑定和重定位。
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
以上就是全部内容了,如果对你有帮助的话可以点个赞,支持一下
相关文章:
c语言编译和链接
文章目录 翻译环境和运⾏环境编译预处理编译词法分析语法分析语义分析 汇编 链接地址和空间分配符号决议重定位 翻译环境和运⾏环境 在c语言标准(ANSI C)中的任何⼀种实现中,存在两个不同的环境。 翻译环境:在这个环境中将人写的…...
C++ printf解释
在C中,printf 是一个用于格式化输出的函数。它是C语言中标准库函数的一部分,被继承到了C中。 printf函数的基本语法如下: int printf(const char* format, ...); 其中,format 参数是一个格式化字符串,用于指定输出的…...
paddle环境安装
一、paddle环境安装 如pytorch环境安装一样,首先在base环境下创建一个新的环境来安装paddlepaddle框架。首先创建一个新的环境名叫paddle。执行如下命令。 conda create -n paddle python3.8创建好了名叫paddle这个环境以后,进入到这个环境中ÿ…...
kingbase配置SSL双向认证
SSL简介: SSL属于传输加密,在服务器端和客户端建立加密通信渠道来保证数据安全,防止数据在网络传输过程中被篡改和拦截。SSL加密可以使用第三方证书机构颁发的数字证书,也可以使用自签名证书。这里我们使用自签名证书。 背景&am…...
Android Studio 使用小记2 Flutter提交SVN时需要忽略哪些文件
今天上午发了一篇使用SVN的小记,在解决问题的过程中,发现不少同学在使用Android Studio进行Flutter应用开发时,对需要忽略哪些文件(不提交到SVN协同)不是很明确,对于这个问题,Flutter官方有明确…...
搜索引擎评价指标及指标间的关系
目录 二分类模型的评价指标准确率(Accuracy,ACC)精确率(Precision,P)——预测为正的样本召回率(Recall,R)——正样本注意事项 P和R的关系——成反比F值F1值F值和F1值的关系 ROC(Receiver Operating Characteristic)——衡量分类器性能的工具AUCÿ…...
armbian修改docker目录到硬盘
玩客云自带内存8G,根目录很快就满了,这里调整docker的目录到硬盘上/sda1。 docker info|grep "Docker Root Dir:" Docker Root Dir:/var/lib/docker 查看docker 默认目录在哪里 Docker 版本 > v17.05.0 docker -v Docker version 25.0.…...
cip、ethernet/ip开源协议栈:开发源代码
EtherNet/IP是一个工业以太网协议,它结合标准协议TCP和UDP,在以太网上基础上的通用工业协议(CIP)。 该协议由ODVA维护。ODVA还管理其他CIP实现,如DeviceNet。 协议栈和源代码下载 www.jngbus.com 在开发Ethernet/Ip…...
网络原理TCP/IP(2)
文章目录 TCP协议确认应答超时重传连接管理断开连接 TCP协议 TCP全称为"传输控制协议(Transmission Control Protocol").⼈如其名,要对数据的传输进⾏⼀个详细 的控制; TCP协议段格式 • 源/目的端口号:表⽰数据是从哪个进程来,到哪个进程去; • 32位序号/32位确认…...
Echars3D 饼图开发
关于vue echart3D 饼图开发 首先要先下载 "echarts-gl", 放在main.js npm install echarts-gl --save <template><div class"cointan"><!-- 3d环形图 --><div class"chart" id"cityGreenLand-charts"><…...
【PaddleSpeech】语音合成-男声
环境安装 系统:Ubuntu > 16.04 源码下载 使用apt安装 build-essential sudo apt install build-essential 克隆 PaddleSpeech 仓库 # github下载 git clone https://github.com/PaddlePaddle/PaddleSpeech.git # 也可以从gitee下载 git clone https://gite…...
AI-数学-高中-17-三角函数的定义
原作者视频:三角函数】4三角函数的定义(易)_哔哩哔哩_bilibili 初中: 高中:三角函数就是单位圆上的点的横纵坐标(x0,y0)。 示例1: 规则: 示例2: 示例3.1: 示例3.2 示例4…...
centOS/Linux系统安全加固方案手册
服务器系统:centos8.1版本 说明:该安全加固手册最适用版本为centos8.1版本,其他服务器系统版本可作为参考。 1.账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险。 操作步骤 使用命令 userdel <用户名> 删除不必要的账号。 使用命令 passwd…...
编程实例分享,眼镜店电脑系统软件,配件验光管理顾客信息记录查询系统软件教程
编程实例分享,眼镜店电脑系统软件,配件验光管理顾客信息记录查询系统软件教程 一、前言 以下教程以 佳易王眼镜店顾客档案管理系统软件V16.0为例说明 如上图, 点击顾客档案,在这里可以对顾客档案信息记录保存查询,…...
完整的 HTTP 请求所经历的步骤及分布式事务解决方案
1. 对分布式事务的了解 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西, 特别是在微服务架构中,几乎可以说是无法避免。 首先要搞清楚:ACID、CAP、BASE理论。 ACID 指数据库事务正确执行…...
SpringMVC请求和响应
文章目录 1、请求映射路径2、请求参数3、五种类型参数传递3.1、普通参数3.2、POJO类型参数3.3、嵌套POJO类型参数3.4、数组类型参数3.5、集合类型参数 4、json数据传递4.1、传递json对象4.2、传递json对象数组 5、日期类型参数传递6、响应6.1、响应页面6.2、文本数据6.3、json数…...
AIGC实战——深度学习 (Deep Learning, DL)
AIGC实战——深度学习 0. 前言1. 深度学习基本概念1.1 基本定义1.2 非结构化数据 2. 深度神经网络2.1 神经网络2.2 学习高级特征 3. TensorFlow 和 Keras4. 多层感知器 (MLP)4.1 准备数据4.2 构建模型4.3 检查模型4.4 编译模型4.5 训练模型4.6 评估模型 小结系列链接 0. 前言 …...
Django_基本增删改查
一、前提概述 通过项目驱动来学习,以图书管理系统为例,编写接口来实现对图书信息的查询,图书的添加,图书的修改,图书的删除等功能。(不包含多重信息的校验,只为了熟悉增删改查接口的实现流程&a…...
数仓治理-存储资源治理
目录 一、存储资源治理的背景 二、存储资源治理的流程及思路 三、治理前如何评估 3.1 无用数据表/临时数据表下线评估 3.2 表及分区的生命周期评估 3.3 存储及压缩格式评估 3.4 根据业务场景实现节省存储评估 四、治理后的成效如何评估 一、存储资源治理的背景 由于早…...
Linux系统安全:安全技术 和 防火墙
一、安全技术 入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决策依据,类 似于监控…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
