翻译环境(编译和链接)(简单讲解,理解图就行)

前言

        这是我们学习代码的最重要的一个知识点之一,因为我们要去运行一个代码并不是简单的去直接出结果,而是经过了很多我们看不到的步骤,我们在这里以C语言为例子在Linux的环境下讲解,大家没有学过Linux的不用担心,最后会有一个思维导图,直接看就行。

一、总体步骤

1. 翻译环境:在这个环境中,源代码会被翻译成机器可以读懂的二进制指令

2. 执行环境:实际执行代码

二、翻译环境

翻译环境从整体角度就是执行了下面的事情:

1. 源文件经过编译器生成对应的目标文件

2. 链接库和目标文件通过链接器生成对应的可执行程序

3. 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。

二、具体化的翻译环境

三、解读翻译环境

3.1 预处理阶段

如图所示,预处理主要是处理我们的头文件,注释和预处理指令;

我们可以使用下面的指令来观察现象:

 gcc -E test.c > test.i

预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。

下面就是操作之后的图:

预处理阶段的test.i
头文件被展开,展开后又700多行
注释被删除
预处理指令被替换

关于预处理指令可以看我的这篇博客:http://t.csdnimg.cn/Cl0OI

3.2 编译阶段

在编译阶段中我们也有相应的指令:

gcc -S test.c

编译完成之后就停下来,结果保存在test.s中。下面就是操作之后的图:

在这一步就是把C代码翻译成汇编指令,可以检查我们的语法,词法和语义。通常的编译错误就是我们的语法,词法或者语义出现了错误;

符号汇总就是将我们的全局变量,函数等汇总到一起。

3.3 汇编阶段

在汇编阶段的指令是:

gcc -c test.c

汇编完成之后就停下来,结果保存在test.o中。下面是操作之后的图:

因为在test.o文件里放的都是二进制指令,我们是没办法看懂的,但是里面有一个ELF我们是可以看懂的。

因为在test.o里是按照ELF格式存储的,所以我们输入如下指令可以翻译ELF文件:

readily -a test.o

翻译之后,在汇编这里是 形成了符号表,符号表就是将符号汇总的放在一个表里,如下:

​​​​​​​

3.4 链接阶段

这个就是在多文件的时候,可以将多文件的符号表给合并到一起,因为我们每个.c文件都会经过编译,所以在最后链接到时候,链接就像一捆绳子,将很多个.c文件整合在一起。

合并段表:将多文件合并

合并符号表:合并多文件里的函数的定义和声明,各个符号表放在一起。

在这里的错误通常是链接失败,原因就是你在多文件中,某个函数没有定义,符号表里没有这个函数

四、执行

执行没啥说的,编译链接通过了,执行就没啥讲的了;

给大家一个指令来执行c语言的文件吧

//编译
gcc test.c
//编译通过生成a.out文件,再执行
./a,out

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

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

相关文章

长安链可验证数据库,保证数据完整性的可信存证方案

近日,长安链发布“可验证数据库”实现了链上链下协同存储及数据完整性保证,显著提升长安链存储能力的可扩展性。 可信存证是联盟链最典型的应用场景,被广泛应用在司法、工业、农业、贸易等领域。联盟链的存证应用主要分为两个阶段&#xff1…

Spark算子

一、编写spark程序的准备工作(程序入口 SparkContext) 1.创建SparkConf val conf new SparkConf().setMaster("local[2]").setAppName("hello-app") 2.创建sparkContext val sc: SparkContext new SparkContext(conf) 二、基…

SpringMVC使用AOP监听方法推送数据

导入aop的maven依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.12</version> </dependency>创建一个spring的XML文件编写aop配置 <?xml version"1.0" …

Swift 常用类别整理

生成颜色&#xff0c;传入16进制数字生成对应颜色 个人不喜欢传字符串的写法&#xff0c;比如 "0x0080FF" 或者 "0080FF"&#xff0c;原因如下&#xff1a; 传了字符串最后还是要解析成数字参与颜色运算的&#xff0c;需要额外做字符串转数字的操作&…

C++套接字库sockpp介绍

sockpp是一个开源、简单、现代的C套接字库&#xff0c;地址为&#xff1a;https://github.com/fpagliughi/sockpp&#xff0c;最新发布版本为0.8.1&#xff0c;license为BSD-3-Clause。目前支持Linux、Windows、Mac上的IPv4、IPv6和Unix域套接字。其它*nix和POSIX系统只需很少的…

链表经典OJ题(链表回文结构,链表带环,链表的深拷贝)

目录 前言 1.反转一个单链表。 2. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。 3.链表的回文结构。 4.链表带环问题&#xff08;*****&#xff09; 4.1是否带环 4.2 入环的节点 5.随机链表的复制&#xff08;链表的深拷贝&#xff09; 前言…

Http状态码502常见原因及排错思路(实战)

Http状态码502常见原因及排错思路 502表示Bad Gateway。当Nginx返回502错误时&#xff0c;通常表示Nginx作为代理服务器无法从上游服务器&#xff08;如&#xff1a;我们的后端服务器地址&#xff09;获取有效的响应。导致这种情况的原因有很多&#xff1a; 后端服务器故障ngin…

「题解」反转链表 返回中间节点

文章目录 &#x1f349;题目1&#xff1a;反转链表&#x1f349;解析&#x1f34c;解法一&#xff1a;创建一个新链表&#x1f34c;解法二&#xff1a;直接操作原链表 &#x1f349;题目2&#xff1a;返回中间节点&#x1f34c;解法一&#xff1a;快慢指针&#x1f34c;解法二&…

【Linux】 reboot 命令使用

reboot 命令用于用来重新启动计算机。 语法 reboot [参数] 命令选项及作用 执行令 man --reboot 执行命令结果 参数 -n : 在重开机前不做将记忆体资料写回硬盘的动作-w : 并不会真的重开机&#xff0c;只是把记录写到 /var/log/wtmp 档案里-d : 不把记录写到 /var/log…

第25章_索引优化与查询优化

文章目录 1. 数据准备2.索引失效案例2.1全值匹配2.2最佳左前缀法则2.3主键插入顺序2.4 计算、函数导致索引失效2.5 类型转换导致索引失效2.6 范围条件右边的列索引失效2.7 不等于(! 或者<>)索引失效2.8 is null可以使用索引&#xff0c;is not null无法使用索引2.9 like以…

机器学习——奇异值分解案例(图片压缩-代码简洁版)

本想大迈步进入前馈神经网络 但是…唉…瞅了几眼&#xff0c;头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作&#xff0c;会有一种浮在云端的虚无感 但是如果要实际操作&#xff0c;我又不想直接调用库包 可是…如果不直接调包&#xff0c;感…

【Linux网络】系统调优之聚合链路bonding,可以实现高可用和负载均衡

一、什么是多网卡绑定 二、聚合链路的工作模式 三、实操创建bonding设备&#xff08;mode1&#xff09; 1、实验 2、配置文件解读 3、查看bonding状态,验证bonding的高可用效果 三、nmcli实现bonding 一、什么是多网卡绑定 将多块网卡绑定同一IP地址对外提供服务&#xf…