【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.rhkb.cn/news/32976.html

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

相关文章

在Simulink中将Excel数据导入可变负载模块的方法介绍

文章目录 数据准备与格式要求Excel数据格式MATLAB预处理数据导入方法使用From Spreadsheet模块(直接导入Excel)通过MATLAB工作区中转(From Workspace模块)使用1-D Lookup Table模块(非线性负载映射)Signal Builder模块(变载工况导入)可变负载模块配置注意事项与调试在S…

Java 大视界 -- Java 大数据在智慧文旅虚拟导游与个性化推荐中的应用(130)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

【微知】tmux如何在一个会话的1个窗口中水平分割或者垂直分割窗口?(垂直 Ctrl + b, %; 切换Ctrl + b, 方向键; ctrl d关闭)

背景 除了直接创建窗口,还可以分割一个窗口。创建窗口参考兄弟篇:tmux如何在某个会话session中创建多个窗口?如何切换?(Ctrlb c创建;Ctrlb 数字 切换;Ctrlb &关闭) 命令 垂…

强化学习(赵世钰版)-学习笔记(7.时序差分学习)

本章是课程算法与方法中的第四章,介绍的时序差分学习算法是基于随机近似方法设计的强化学习方法,也是model-free的方法。 时序差分算法是一种近似估计策略状态值的算法,具体的形式如下: 本质上是在当前t时刻,被访问到的…

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战

文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课,而如何在Linux系统上高效地访…

深度学习与大模型-矩阵

矩阵其实在我们的生活中也有很多应用,只是我们没注意罢了。 1. 矩阵是什么? 简单来说,矩阵就是一个长方形的数字表格。比如你有一个2行3列的矩阵,可以写成这样: 这个矩阵有2行3列,每个数字都有一个位置&a…

【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.1AWS OpenSearch无服务器方案

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 8.2.1AWS OpenSearch 无服务器方案深度解析与实践指南1. Serverless架构的核心价值与行业趋势1.1 传统Elasticsearch集群的运维挑战1.2 Serverless技术演进路线技术特性对比…

使用 Arduino 和 ESP8266 Wi-Fi 模块发送电子邮件

使用 Arduino Uno 和 ESP8266 Wi-Fi 模块发送电子邮件 我们正在迈向物联网 (IoT) 世界。这项技术在电子和嵌入式系统中起着非常重要的作用。从任何微控制器或嵌入式系统发送电子邮件都是非常基本的事情,这在 IoT 中是必需的。因此,在本文中,我们将学习“如何使用 Wi-Fi 和…

jmeter-AES加密

AES(全称:Advanced Encryption Standard)对称加密算法,也就是加密和解密用到的密钥是相同的,这种加密方式加密速度非常快, 适合经常发送数据的场合,如:数据加密存储、网络通信加密等。 在进行接口测试或接…

四种 No-SQL

在一个常规的互联网服务中,读取与写入的比例大约是 100:1 到 1000:1。然而,从硬盘读取时,数据库连接操作耗时,99% 的时间花费在磁盘寻址上。 为了优化读取性能,非规范化的设计通过添加冗余数据或分组数据来引入。下述…

使用 Chrome Flags 设置(适用于 HTTP 站点开发)

使用 Chrome Flags 设置(适用于 HTTP 站点开发) 在 Chrome 地址栏输入:chrome://flags/在搜索框输入 “Insecure origins” 或 “Allow invalid certificates”。找到 “Insecure origins treated as secure” 选项(或者 #allow-…

openharmony体验

openharmony5 去年已经出来了 如果以前做过android开发的,学起来不难,关键 1:环境 DevEco Studio 5.0.3 Beta2 https://developer.huawei.com/consumer/cn/deveco-studio/ win10_64bit CPU amd64(不是arm的) 2:安装 执行EXE 安装就行&#x…

【微知】plantuml在泳道图中如何将多个泳道框起来分组并且设置颜色?(box “浏览器“ #LightGreen endbox)

泳道分组并且着色 分组用 box和endbox ,颜色用#xxx,标注用"xxx" box "浏览器" #LightGreen participant "浏览器1" as Browser participant "浏览器2" as Browser2 endboxparticipant "服务端" as …

EngineerCMS完整版支持OnlyOffice8.2文档协作

这次从OO5.3那个时代的接口,改到支持8.2接口,颇费周折。centos升级和docker升级 - Powered by MinDoc (itdos.net) 1. 首先是升级centos 手动升级centos7内核(版本自行选择,亲测内核下载链接有效)_centos内核下载-CS…

仿TikTok推荐系统开发与部署

目录 1、对H&M零售数据集的简要介绍 2、个性化推荐的核心范式 3、引入双塔嵌入模型 4、理解4阶段推荐架构 4.1 第一阶段 4.2 第二阶段 4.3 第三阶段 4.4 第四阶段 5、将4阶段架构应用于我们的H&M案例 6、特征/训练/推理(FTI)架构 7、…

<03.13>八股文补充知识

import java.lang.reflect.*; public class Main {public static void main(String[] args) throws Exception {// 获取 Class 对象//1. 通过类字面量Class<?> clazz Person.class;//2 通过对象实例化String str "Hello";Class<?> clazz_str str.ge…

windows系统,pycharm运行.sh文件

博主亲身试验过&#xff0c;流程简单&#xff0c;可用。 需要pycharm &#xff0c;git。 注意需要Git Bash.exe &#xff0c;也就是Git Bash的应用程序&#xff0c;而不是快捷方式。 需要把这个应用程序的路径复制一下。可以通过右键&#xff0c;复制文件地址的方式。 接着在…

新闻网页信息抽取

1. 网页信息抽取 问题定义&#xff1a;对新闻网页&#xff08;输入为HTML&#xff09;提取结构化信息&#xff0c;包括标题、发布时间、作者、正文、图片等。 动机&#xff1a;由于网页&#xff08;大多数为HTML格式&#xff09;通常带有很多标签、样式、脚本等信息&#xff0…

Attention又升级!Moonshot | 提出MoE注意力架构:MoBA,提升LLM长文本推理效率

源自: AINLPer&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2025-3-13 更多&#xff1a;>>>>大模型/AIGC、学术前沿的知识分享&#xff01; 引言 对于大模型来说&#xff0c;有效扩展上下文长度对于实现通用…

人工智能与我何干

思考一下&#xff0c; 如果打破这样的磁场&#xff0c;当我焦虑的时候&#xff0c;总是想要看一些负面的内容&#xff0c;这是错误的&#xff0c;不应该这样做&#xff0c;要坚定自己的信念&#xff0c;我为什么和人工智能去争抢呢&#xff0c;不能和人工智能争抢&#xff0c;这…