第7章链接:编译器驱动程序

news2024/11/24 21:02:02

示例程序由两个源文件组成,main.cswap.c

main函数初始化一个两元素的整数数组,然后调用swap函数来交换这一对数。

  • main.c
void swap();

int buf[2] = {1, 2};

int main()
{
    swap();
    return 0;
}
  • swap.c
extern int buf[];

int *bufp0 = &buf[0];
int *bufp1;

void swap()
{
    int temp;
    bufp1 = &buf[1];
    temp = *bufp0;
    *bufp0 = *bufp1;
    *bufp1 = temp;
}

这是一种比较奇怪的交换两个数字的方式,但是它作为一个小的例子,来帮助说明关于链接是如何工作的一些重要知识点。

大多数编译系统提供 编译驱动程序(compiler driver),它代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。【常用编译器可见博文常用编译器】

比如,要用 GNU 编译系统构造示例程序,就要通过在 shell 中输入下列命令行来调用 GCC 驱动程序:

# 关于编译参数的含义,后文会提到
gcc -O2 -g -o p main.c swap.c

下图概括了驱动程序在将示例程序从 ASCII码源文件翻译成可执行目标文件时的行为。(若想看这些步骤,用 -v 选项来运行GCC)。
在这里插入图片描述

详解步骤:

1、驱动程序首先运行 C 预处理器(cpp),将 C 的源程序 main.c 翻译成一个 ASCII 码的中间文件 main.i

cpp [other arguments] main.c /tmp/main.i

2、接下来,驱动程序运行 C 编译器(cc1),它将 main.i 翻译成一个 ASCII 汇编语言文件为 main.s

cc1 /tmp/main.i main.c -O2 [other arguments] -o /tmp/main.s

3、然后,驱动程序运行汇编器(as),它将 main.s 翻译成一个 可重定位目标文件 main.o

as [other arguments] -o /tmp/main.o /tmp/main.s

驱动程序经过相同的过程生成 swap.o

4、最后,它运行链接器程序 ld,将 main.oswap.o 以及一些必要的系统目标文件组合起来,创建一个可执行的目标文件 p

ld -o p [system object files and args] /tmp/main.o /tmp/swap.o

5、要运行可执行文件,在Unix shel 的命令行上输入它的名字:

./p

shell 调用操作系统中一个叫做 加载器(loader)的函数,它拷贝可执行文件 p 中的代码和数据到存储器,然后将控制转移到这个程序的开头。

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

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

相关文章

【Java】Java中线程安全有哪些实现思路?

文章目录 1、使用 synchronized 关键字2、使用 ReentrantLock 类3、使用 ConcurrentHashMap 类4、使用 Atomic 类5、使用 ThreadLocal 类总结 在 Java 多线程编程中,线程安全是一个非常重要的概念。 线程安全通常指程序在多线程并发执行时,仍然能够保持正…

迄今为止,最强ChatGPT写论文技巧,总共6步,手把手告诉你

目录 第一步:现象确认 第三步:定位优质学术资源 第四步:对比分析 第五步:深挖启示 & 第六步:写论文 代写论文,不知道有多少朋友听说过,这是一门严格来说有点小众,但盈利空间…

常见问题解答:如何有效使用 Facebook 商务管理平台(BM)?

Facebook 商务管理平台(BM)是一个功能强大的工具,可帮助广告主在 Facebook 平台上管理和优化广告投放。然而,对于初次接触 BM 的用户来说,可能会遇到一些问题和困惑。本文将回答一些常见问题,帮助您更有效地…

如何使用分布式存储系统促进 AI 模型训练

在处理小型数据集和简单算法时,传统的机器学习模型可以存储在独立机器或本地硬盘驱动器上。然而,随着深度学习的发展,团队在处理更大的数据集和更复杂的算法时越来越多地遇到存储瓶颈。 这凸显了分布式存储在人工智能(AI&#xf…

半监督学习笔记

聚类假设 假设输入数据点形成簇,每个簇对应于一个输出类,那么如果点在同一个簇中,则它们可以认为属于同一类。聚类假设也可以被视为低密度分离假设,即:给定的决策边界位于低密度地区。两个假设之间的关系很容易看出。一…

C++ 智能指针的原理、分类、使用

1. 智能指针介绍 为解决裸指针可能导致的内存泄漏问题。如: a)忘记释放内存; b)程序提前退出导致资源释放代码未执行到。 就出现了智能指针,能够做到资源的自动释放。 2. 智能指针的原理和简单实现 2.1 智能指针的原…

讯飞星火 VS 文心一言:谁是中文大语言模型的TOP1?

在百度发布文心一言一个多月后,科大讯飞也发布了自己的大模型“讯飞星火大模型”。本篇博客就测评一下这两个在中文圈最受好评的大语言模型,顺便辅以ChatGPT为参考。大家一起来看看到底谁是中文大语言模型的TOP1? 目录 体验网址 1、旅游攻…

Class类文件的结构

1 class文件介绍 Class文件是一组以8个字节为基础单位的二进制流; 各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符; 采用一种类似C语言结构体的伪结构来存储数据,只要两种数据类型:“无符号数”和“表”…

execl函数总结以及扩展

为什么要用exec族函数,有什么作用? (1)一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的一一父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求…

移动机器人运动规划---基于图搜索的基础知识---图和图搜索算法的基本概念

移动机器人运动规划---基于图搜索的基础知识---图和图搜索算法的基本概念 图和图搜索算法的基本概念图的基础概念图搜索基本概念图搜索算法图搜索算法框架 图和图搜索算法的基本概念 图的基础概念 图是有节点和边的一种表达方式 各节点由边连起来 边可以是有向的,…

Java经典笔试题—day07

Java经典笔试题—day07 🔎选择题🔎编程题🥝Fibonacci数列🥝合法括号序列判断 🔎结尾 🔎选择题 (1)Java属于( ) A.操作系统 B.办公软件 C.数据库系统 D.计算机语言 D (2)类声明中&a…

大数据Doris(十八):Properties配置项和关于ENGINE

文章目录 Properties配置项和关于ENGINE 一、Properties配置项 二、关于ENGINE Properties配置项和关于ENGINE 一、Properties配置项 在创建表时,可以指定properties设置表属性,目前支持以下属性: replica

Kali-linux系统指纹识别

现在一些便携式计算机操作系统使用指纹识别来验证密码进行登录。指纹识别是识别系统的一个典型模式,包括指纹图像获取、处理、特征提取和对等模块。如果要做渗透测试,需要了解要渗透测试的操作系统的类型才可以。本节将介绍使用Nmap工具测试正在运行的主…

前端面试题汇总大全 -- 持续更新!

文章目录 一、html 系列 ⭐⭐⭐⭐⭐1、H5新增特性和css3新增特性?2、什么是HTML5,以及和HTML的区别是什么?3、说说你对 Dom 树的理解?4、跨域时怎么处理 cookie?5、说说你对 SSG 的理解?6、从输入url&#…

Azure API 管理缺陷突出了 API 开发中的服务器端请求伪造风险

微软最近修补了其 Azure API 管理服务中的三个漏洞,其中两个漏洞启用了服务器端请求伪造 (SSRF) 攻击,这些攻击可能允许黑客访问内部 Azure 资产。 概念验证漏洞用于突出开发人员在尝试为自己的 API 和服务实施基于黑名单的限制时可能犯的常见错误。 W…

JQuery 详细教程

文章目录 一、JQuery 对象1.1 安装和使用1.2 JQuery包装集对象 二、JQuery 选择器2.1 基础选择器2.2 层次选择器2.3 表单选择器 三、JQuery Dom 操作3.1 操作元素3.1.1 操作属性3.1.2 操作样式3.1.3 操作内容 3.2 添加元素3.3 删除元素3.4 遍历元素 四、JQuery 事件4.1 ready 加…

C/C++每日一练(20230513) 二叉树专场(7)

目录 1. 翻转二叉树 🌟 2. 二叉树的最小深度 🌟 3. 填充每个节点的下一个右侧节点指针 🌟🌟 附:二叉树的序列化与反序列化 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一…

消息队列中间件介绍

消息队列介绍 消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步消息、流量削峰、可靠投递、广播、流量控制、最终一致性等一系列功能,已经成为异步RPC的主要手段之一。 目前常见的消息中间件有Active…

知名高校博士:我改了这2个地方,一开始被秒拒的论文很快就成功发表了~

手稿被拒后,你会怎么做?是直接换期刊重投,还是先仔细修改下论文呢? 伊利诺伊大学博士Sara E. Skrabalak分享了自己在论文被秒拒后,修改了文章部分内容就成功发表的经验。我们来看看她到底做了哪些修改吧 ~ Sara E. Sk…

Java技术总结

Java技术总结 1.高并发1.什么是高并发2.如何提升系统的并发能力3.常见的互联网分层架构整个系统各层次的水平扩展,又分别是如何实施的呢?4.分层水平扩展架构实践5.总结 2.Java 线程的 5 种状态1.新建状态(New):2.就绪状态(Runnable):3.运行状态(Running)…