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

c语言编译和链接

文章目录

  • 翻译环境和运⾏环境
  • 编译
    • 预处理
    • 编译
      • 词法分析
      • 语法分析
      • 语义分析
    • 汇编
  • 链接
    • 地址和空间分配
    • 符号决议
    • 重定位

翻译环境和运⾏环境

在c语言标准(ANSI C)中的任何⼀种实现中,存在两个不同的环境。

  1. 翻译环境:在这个环境中将人写的文本代码翻译成机器“看得懂”的,可以直接执行的二进制代码
  2. 运行环境:机器执行代码的环境
    编译和链接就是翻译环境的两个大过程

一个或多个源文件单独通过经过编译后生成一个或多个目标文件,多个目标文件经过链接库【链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库】链接在一起生成可执行文件,可执行文件被机器直接指行的得出结果
在这里插入图片描述
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

编译

编译分为预处理(预编译),编译,汇编三个过程

预处理

预处理阶段主要是执行预处理指令,例如头文件的包含,替换#define定义的代码,宏等

具体的工作:

  • 将所有的 #define 删除,并展开所有的宏定义。
  • 处理所有的条件编译指令
  • 处理#include ,将包含的头⽂件的内容插⼊到该#include的位置
  • 删除所有的注释
  • 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等
  • 保留所有的#pragma的编译器指令,编译器后续会使⽤。

预处理后的代码还是文本代码

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

编译

编译过程就是将预处理后的⽂件进⾏词法分析、语法分析、语义分析及优化,⽣成相应的汇编代码⽂件。

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

词法分析

扫描器将代码拆分为一个个的特殊记号(关键字,标识符,特殊字符,运算符等),方便编译器解析

词法分析时还会将拆分后的符号汇总,方便链接的进行

a[i] = i * (2 + j);

该行代码会被扫描器分成11个记号,分别为:
a , [ , i, ] , = , * , ( , 2 , + , j , )
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

语法分析

语法分析器,将对扫描产⽣的记号进⾏语法分析,从⽽产⽣语法树
这些语法树是以表达式为节点的树

a[i] = i * (2 + j);

该代码拆分的词法形成的语法数为
在这里插入图片描述

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

语义分析

语义分析器来完成语义分析,即对表达式的语法层⾯分析。
编译器所能做的分析是语义的静态分析。
静态语义分析通常包括声明,类型的匹配,类型的转换等。

语义分析会报告错误的语法信息。

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

汇编

汇编器是将汇编代码转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。

汇编还会将编译的词法分析汇总的符号制成符号表【符号表就是多个符号+符号的地址所构成的表】,并将符号表传给链接库,方便链接

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

链接

链接的时候需要把⼀堆⽂件链接在⼀起⽣成可执⾏程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。
链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

地址和空间分配

C语言的链接过程中,地址和空间分配是一个重要的环节,它涉及到程序的内存布局,即程序在内存中如何分布及其各自的地址范围。

以下是链接过程中地址和空间分配的一些关键点:

  1. 文本段(Text Segment):

    • 文本段包含了程序的机器代码,即编译后的指令。
    • 在链接过程中,链接器会合并各个目标文件中的文本段,并确定唯一的入口点(通常是main函数)。
    • 文本段的地址通常是可以预测的,因为它包含了程序的指令,这些指令在程序每次运行时都会被加载到内存的相同位置。
  2. 数据段(Data Segment):

    • 数据段包含了程序中声明的静态变量和全局变量。
    • 在链接过程中,链接器会合并各个目标文件中的数据段,并为其分配连续的内存空间。
    • 数据段的地址在程序运行时是固定的,因为这些变量在程序开始执行时存在于内存中。
  3. 堆(Heap):

    • 堆是程序在运行时动态分配内存的区域。
    • 在C语言中,使用malloccallocrealloc等函数动态分配的内存都位于堆上。
      -堆的地址空间在程序运行时是连续的,但操作系统会跟踪这些内存块的使用情况,以便于后续的释放和再分配。
  4. 栈(Stack):

    • 栈是用于存储函数调用时的局部变量和返回地址等信息的区域。
    • 每个函数调用都会有自己的栈帧,用于存储局部变量和返回信息。
    • 栈的地址空间是向内生长的,新的栈帧会覆盖旧的栈帧。
  5. 重定位表(Relocation Table):

    • 重定位表记录了程序中需要重定位的符号和它们的新的地址。
    • 在链接过程中,链接器会生成重定位表,并在程序加载时由操作系统或加载器使用,以确保程序中的符号引用正确地指向其在内存中的位置。
  6. 动态内存分配(Dynamic Memory Allocation):

    • 如果程序使用了动态内存分配(如标准库中的malloc等函数),那么这些内存将在程序运行时由操作系统动态地分配和释放。
    • 动态分配的内存通常位于堆上,但具体的地址是在运行时确定的。

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

符号决议

符号决议是指链接器在将多个编译后的目标文件合并成一个可执行文件时
确定每个符号(如函数名、变量名等)所对应的具体地址的过程。

这个过程确保了程序在运行时能够正确地找到并调用所需的函数和访问变量。

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

重定位

在C语言程序链接过程中,重定位是一种重要的步骤,它涉及将不同的目标文件中的符号(函数或变量)的地址合并到一个单独的可执行文件中。
当多个目标文件需要访问同一符号时,编译器无法确定哪个文件中的符号地址应该被使用,因此需要进行重定位。

重定位是程序能够正确访问外部函数和变量的关键。

C语言链接过程中的重定位主要分为静态链接和动态链接两种方式。

  1. 静态链接重定位:

在静态链接过程中,链接器会在编译后的目标文件中将所有的符号(函数名、变量名等)和它们的地址进行绑定,并将这些地址填写到可执行文件中。
这个过程称为重定位。当可执行程序被操作系统加载到内存中时,由于所有的符号已经在链接过程中被重定位,因此程序可以直接使用这些符号,而不需要再进行地址绑定

静态链接的优点是运行效率高,因为它在编译和链接阶段就已经完成了所有的重定位工作。但是静态链接也有一些缺点,比如占用物理内存较多,且无法实现动态更新。

  1. 动态链接重定位:

与静态链接不同,动态链接在编译阶段不会将符号和地址进行绑定,而是仅仅在可执行文件或动态库中记录一些必要的信息。
这些信息包括符号名称、符号类型以及符号在动态链接器中的地址。当程序运行时,操作系统会首先加载可执行文件和动态链接器到内存中,然后通过动态链接器来完成符号的绑定和重定位工作。

动态链接的优点是可以节省物理内存,因为它不需要将所有的库函数都包含在可执行文件中。
此外,动态链接还可以实现动态更新,例如在程序运行过程中可以动态地加载或卸载库函数。
但是动态链接也有一个缺点,就是程序的运行效率相对较低,因为它需要在运行时进行符号绑定和重定位。

一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

以上就是全部内容了,如果对你有帮助的话可以点个赞,支持一下

相关文章:

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这个环境以后,进入到这个环境中&#xff…...

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&#xff…...

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】语音合成-男声

环境安装 系统&#xff1a;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-三角函数的定义

原作者视频&#xff1a;三角函数】4三角函数的定义&#xff08;易&#xff09;_哔哩哔哩_bilibili 初中&#xff1a; 高中&#xff1a;三角函数就是单位圆上的点的横纵坐标(x0,y0)。 示例1&#xff1a; 规则&#xff1a; 示例2&#xff1a; 示例3.1&#xff1a; 示例3.2 示例4…...

centOS/Linux系统安全加固方案手册

服务器系统:centos8.1版本 说明:该安全加固手册最适用版本为centos8.1版本,其他服务器系统版本可作为参考。 1.账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险。 操作步骤  使用命令 userdel <用户名> 删除不必要的账号。  使用命令 passwd…...

编程实例分享,眼镜店电脑系统软件,配件验光管理顾客信息记录查询系统软件教程

编程实例分享&#xff0c;眼镜店电脑系统软件&#xff0c;配件验光管理顾客信息记录查询系统软件教程 一、前言 以下教程以 佳易王眼镜店顾客档案管理系统软件V16.0为例说明 如上图&#xff0c; 点击顾客档案&#xff0c;在这里可以对顾客档案信息记录保存查询&#xff0c;…...

完整的 HTTP 请求所经历的步骤及分布式事务解决方案

1. 对分布式事务的了解 分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c; 特别是在微服务架构中&#xff0c;几乎可以说是无法避免。 首先要搞清楚&#xff1a;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_基本增删改查

一、前提概述 通过项目驱动来学习&#xff0c;以图书管理系统为例&#xff0c;编写接口来实现对图书信息的查询&#xff0c;图书的添加&#xff0c;图书的修改&#xff0c;图书的删除等功能。&#xff08;不包含多重信息的校验&#xff0c;只为了熟悉增删改查接口的实现流程&a…...

数仓治理-存储资源治理

目录 一、存储资源治理的背景 二、存储资源治理的流程及思路 三、治理前如何评估 3.1 无用数据表/临时数据表下线评估 3.2 表及分区的生命周期评估 3.3 存储及压缩格式评估 3.4 根据业务场景实现节省存储评估 四、治理后的成效如何评估 一、存储资源治理的背景 由于早…...

Linux系统安全:安全技术 和 防火墙

一、安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全决策依据,类 似于监控…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...