程序的编译链接【编译链接大概步骤】

news2024/11/14 23:28:54

全文目录

  • 😀 前言
  • 🙂 翻译环境和执行环境
  • 😶 编译和链接
    • 😵‍💫 预编译(预处理)
    • 😵‍💫 编译
    • 😵‍💫 汇编
    • 😵‍💫 链接
  • 🌈 总结

😀 前言

🙂 翻译环境和执行环境

翻译环境:

在这个环境中源代码被转换为可执行的机器指令(二进制的指令)。

执行环境:

它用于实际执行代码。

在这里插入图片描述

我们日常使用的VS2019就是一个集成开发环境,结合了编辑、编译、链接、调试等多种功能,其中编译使用的是 cl.exe, 链接使用的是 link.exe 文件中,不同的编辑器使用的可能不同。

😶 编译和链接

  • 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。
  • 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
  • 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人 的程序库,将其需要的函数也链接到程序中。

在这里插入图片描述

其中编译又分为:预编译、编译、汇编 三步操作

为了方便演示,接下来使用Linux下的gcc进行实验。

实验代码:

// test.c
#include <stdio.h>

extern Add(int a, int b);

// 测试注释和#define
#define Max 100

int main()
{
	int z = Max;
	int a = 10;
	int b = 20;
	int c = Add(a, b);
	printf("%d\n", c);
	
	return 0;
}
// add.c
int Add(int a, int b)
{
	return a + b;
}

😵‍💫 预编译(预处理)

我们可以使用下面的指令将程序编译停留在预编译后:

gcc test.c -E -o test.i
gcc add.c -E -o add.i

打开test.i 可以发现多了很多行,同时注释的代码和 #define 都不见了:

在这里插入图片描述

再从/usr/include 这个路径下打开stdio.h 这个文件可以发现 test.i 中多出来的就是stdio.h的内容

在这里插入图片描述

那么就可以确定预编译阶段进行了一下几个操作:

  1. 头文件的包含 (#include
  2. #define 定义符号的替换
  3. 注释的删除

以上三个都是属于文本操作

😵‍💫 编译

将程序停留在编译之后:

gcc test.i -S -o test.s
gcc add.i -S -o add.s

打开test.s 可以看到:

在这里插入图片描述

这些都是之前在VS 中看到的反汇编。也就是说编译将C语言代码翻译成了汇编代码。其过程相当复杂,主要是做了一下几个操作:

  1. 语法分析
  2. 词法分析
  3. 语义分析
  4. 符号汇总

符号汇总:将文件中的全局符号汇总出来(局部的符号不管), 基本上就是函数名

😵‍💫 汇编

将程序停留在编译之后:

gcc test.s -c -o test.o
gcc add.s -c -o add.o

生成的就是目标文件。在Windows下目标文件的后缀时.obj,Linux下的后缀时.o

打开test.o

在这里插入图片描述

发现全是乱码,也就是说汇编将汇编指令翻译成了二进制的指令。

但是这时候在编译阶段进行的符号汇总就派上用场了,这些符号在汇编阶段被制成了符号表。二进制文件我们时看不懂的,在Linux下可执行程序的格式是:elf ,所以我们可以借助readelf 来查阅可执行文件:

readelf -s test.o

在这里插入图片描述

readelf -s add.o

在这里插入图片描述

汇编就是对每个编译阶段汇总的符号赋予地址(如果在文件中找不到该符号的有效内容,赋予无效地址),即:

在这里插入图片描述

😵‍💫 链接

链接阶段做的就是:

  1. 合并段表
  2. 符号表的合并和重定位

合并段表就是将每个目标文件的各个段整合起来,符号表的合并就是将各个目标文件的符号表合并成一个表,并检查每个符号的地址:

在这里插入图片描述

🌈 总结

程序的编译和链接过程是很复杂的,能力有限,只能学习这些大概的概念。

Linux 指令汇总:

// 编译的各个阶段:
ESc  ——> iso

// 查看目标文件:
readelf -[options] filename

// 头文件路径:
/usr/include

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

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

相关文章

数值类特征

数值类特征 数值类特征是最常见的一种特征类型&#xff0c;数值可以直接喂给算法。 为了提升效果&#xff0c;我们需要对数值特征做一些处理&#xff0c;本文介绍了4种常见的处理方式&#xff1a;缺失值处理、二值化、分桶、缩放。 什么是数值类特征&#xff1f; 数值类特征就是…

腾讯云服务器地域和可用区详细介绍_选择攻略

腾讯云服务器地域有什么区别&#xff1f;怎么选择比较好&#xff1f;地域选择就近原则&#xff0c;距离地域越近网络延迟越低&#xff0c;速度越快。关于地域的选择还有很多因素&#xff0c;地域节点选择还要考虑到网络延迟速度方面、内网连接、是否需要备案、不同地域价格因素…

Redis数据类型全总结【超详细万字总结】

文章目录 前言一、String1、内部实现2、应用场景缓存对象常规计数分布式锁共享 Session 信息 3、常用指令 二、List1、内部实现2、应用场景消息队列List 作为消息队列有什么缺陷 3、常用指令 三、Hash1、内部实现2、应用场景缓存对象购物车 3、常用指令 四、Set1、内部实现2、应…

Linux学习之LNMP环境搭建

LNMP是Linux、Nginx、MySQL和PHP的简称。 Linux参数显示 cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810&#xff0c;uname -r看到内核版本是3.10.0-957.el7.x86_64。 nginx安装 可以参考《Linux学习之CentOS 7源码安装openresty》 安装mariadb数据…

最简单的电子宣传册制作软件

HI&#xff01;今天给大家分享一款操作起来最简单的制作电子宣传册的软件---FLBOOK&#xff0c;它可支持在线排版编辑、一键套用模板的方式&#xff0c;使新手也能制作出优秀的电子宣传册。 具体如何制作的呢&#xff1f; 1.打开FLBOOK&#xff0c;进入FLBOOK主页 2.打开模板专…

在Jupyter中使用AI写代码,如有神助,太惊艳了

昨晚看到一个可以在JupyterLab中使用的AI代码辅助工具jupyter-ai&#xff0c;它的交互确实非常棒&#xff0c;可以直接聊天&#xff0c;也可以就笔记中的代码提问&#xff0c;最出彩的是生成笔记功能&#xff0c;还是蛮惊艳的。 这里就极简介绍一下安装及用法 第一步是创建环…

学习笔记:Pytorch利用MNIST数据集训练生成对抗网络(GAN)

2023.8.27 在进行深度学习的进阶的时候&#xff0c;我发了生成对抗网络是一个很神奇的东西&#xff0c;为什么它可以“将一堆随机噪声经过生成器变成一张图片”&#xff0c;特此记录一下学习心得。 一、生成对抗网络百科 2014年&#xff0c;还在蒙特利尔读博士的Ian Goodfello…

学习笔记230827--vue项目中,子组件拿不到父组件异步获取数据的问题

问题描述 父组件的数据是请求后台所得&#xff0c;因为是异步数据&#xff0c;就会出现&#xff0c;父组件的值传递过去了&#xff0c;子组件加载不到&#xff0c;拿不到值的问题。 下面从同步数据传递和异步数据传递开始论述问题 1. 父组件传递的是同步数据 父组件 <…

【Spring】什么是 AOP(面向切面编程) ? 为什么要有 AOP ? 如何实现 Spring AOP ?

文章目录 前言一、什么是 AOP ?二、为什么要使用 AOP ?三、 AOP 的组成四、Spring AOP 的实现1, 添加依赖2, 定义切面3, 定义切点4, 定义通知5, 创建连接点 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法…

计算机视觉 – Computer Vision | CV

计算机视觉为什么重要&#xff1f; 人的大脑皮层&#xff0c; 有差不多 70% 都是在处理视觉信息。 是人类获取信息最主要的渠道&#xff0c;没有之一。 在网络世界&#xff0c;照片和视频&#xff08;图像的集合&#xff09;也正在发生爆炸式的增长&#xff01; 下图是网络上…

Linux操作系统--shell编程(helloworld初体验)

1.shell概述 shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统的内核,以完成所谓的功能指令。 Linux中常用的解析器 CentOS7使用的解析器是bash,这里的sh是指向bash 2.Shell脚本入门 下面我们开始学习编写shell脚本,我们从HelloWorld开始。

怎么找到真实可用的淘宝拼多多京东API?(商品数据订单数据销量价格接口)

要找到真实可用的淘宝、拼多多、京东API&#xff0c;可以采取以下步骤&#xff1a; 打开相应电商平台的开放平台网站&#xff0c;例如淘宝开放平台、拼多多开放平台、京东开放平台等。在网站中注册并登录&#xff0c;找到API文档或开发者文档等页面。在文档中搜索与所需功能相…

代码随想录算法训练营之JAVA|第三十八天|494. 目标和

今天是第38天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 494. 目标和https://leetcode.cn/problems/target-sum/ 第一想法 题目理解&#xff1a;题目给出一个数组&#xff0c;使用 或 - 算术符号&#xff0c;有多少种组合可以得到target的值。 拿…

URL中传递JSON字符串

今天遇见了一个需求&#xff0c;从post请求中在url里传递json字符串&#xff0c; 就是路径?参数11那种情况 最后怎么解决的呢&#xff1f; 需要使用前端方法&#xff0c;先用JSON.stringify格式化成字符串&#xff0c;再用encodeURIComponent把JSON里面的符号转转为url支持的…

1.2 Kali Linux的网络配置

前言 最新文章请见此处&#xff0c;持续更新&#xff0c;敬请订阅&#xff01;https://blog.csdn.net/algorithmyyds/category_12418682.html 网络在如今的社会已是十分重要的媒介&#xff0c;如果没有网络&#xff0c;很多事情将难以办成。渗透测试也是一样——毕竟在攻击机…

新生报到:无压力的数字自我介绍

&#x1f338; 新生报到&#xff1a;无压力的数字自我介绍 &#x1f338; 开学季又来临&#xff0c;每个学校、每个班级都迎来了一批新鲜面孔。作为新生&#xff0c;面对陌生的环境和同学&#xff0c;首次的自我介绍无疑是一个让许多人感到紧张和迷茫的挑战。你是否曾因为害羞…

理解底层— —Golang的log库,二开实现自定义Logger

理解底层— —Golang的log库&#xff0c;实现自定义Logger 1 分析实现思路 基于golang中自带的log库实现&#xff1a;对日志实现设置日志级别&#xff0c;每天生成一个文件&#xff0c;同时添加上前缀以及展示文件名等 日志级别&#xff0c;通过添加prefix&#xff1a;[INFO]、…

C 字符串处理

字符数组 输入输出 输入函数 scanf(%s, s)读入字符串&#xff0c;在第一个空白符( 、\n 、\t )处停止&#xff0c;不读入空白符&#xff0c;在串尾自动添加\0’ 。gets(s)读入一行字符&#xff0c;直到遇到\n &#xff0c;读入换行符并将其舍弃&#xff0c;在串尾自动添加\…

H5如何做性能测试?

说起H5性能测试&#xff0c;可能许多同学有所耳闻&#xff0c;但是不知道该如何去做性能测试&#xff0c;或者不知道H5应该关注哪些性能指标。今天我们就来看下。希望阅读本文后&#xff0c;能够有所了解。 常用指标 1、H5性能相关参数介绍 白屏时间&#xff1a;用户首次看到…

[LitCTF 2023]PHP是世界上最好的语言!!

进入环境看起来还是挺牛逼的&#xff0c;但是在右边输入框下有一个执行代码&#xff0c;有点牛 真的可以直接执行&#xff0c;那么 根据题目提示&#xff0c;我们得知flag&#xff0c;在根目录&#xff0c;所以我们可以直接利用 查看到flag位置 得到flag