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

news2024/12/27 13:54:26

示例程序由两个源文件组成,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/507080.html

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

相关文章

Android系统日志3-trace

1、使用 主要追踪耗时,如上图所示,记录的是traceBegin和traceEnd之间的耗时,这些日志信息可以通过systrace查看 2、获取trace日志 https://developer.android.com/topic/performance/tracing/command-line?hlzh-cn https://developer.andr…

Linux之shell基础(六)

1、shell 简介 shell 介于内核与用户之间,负责命令的编辑,是人机交互的一个桥梁 shell 的种类 [rootyhm ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/ksh /bin/rksh /usr/bin/ksh /usr/bin/rksh种类说明/bin/shbash的一个…

学习HCIP的day.05

目录 十、ospf扩展配置&#xff1a; 1、认证 2、沉默接口 3、加快收敛 4、缺省路由 查看OSPF路由&#xff1b;显示本地发出和学习到的OSPF路由条目 <r10>display ospf routing 十、ospf扩展配置&#xff1a; 1、认证 直连的邻居或邻接之间&#xff0c;配置身…

【并发编程系列 — 线程基础】

Java并发是Java语言中非常重要的一个话题&#xff0c;也是面试和实际应用中最常接触到的。作为JAVA工程师&#xff0c;掌握并发编程知识是非常重要的。在多核CPU的环境下&#xff0c;使用多线程并发执行任务可以显著提高程序的执行效率&#xff0c;从而提高系统的性能。 目录 …

6.事件系统

事件 事件的传递 新建Widget项目myevent&#xff0c;类名WIdget不变 新建C类如下&#xff1a; 粘贴代码 1myevent运行结果&#xff1a; 输入任意字符时&#xff0c;qDebug显示如下&#xff0c;但框内无法显示输入的字符 //mylineedit.cpp中void MyLineEdit::keyPressEven…

[Docker]Docker命令

Docker常用命令 帮助命令 docker version #版本信息 docker info #详细信息 docker 命令 --help #万能命令镜像命令&#xff1a; docker images #展示所有镜像 docker search docker pull 下载镜像 docker rmi 删除镜像 &#xff08;remove images) 容器命令…

数据分析---Python科学计算库-Numpy学习(一)

一&#xff0c;简介 1.1什么是数据分析 数据分析是指通过使用各种统计学、计算机科学和数学技术&#xff0c;对收集来的数据进行处理、整理、解释和呈现&#xff0c;从而提取出数据中有用的信息和洞察&#xff0c;并帮助做出更明智的决策。数据分析可以应用于各种不同的领域和…

MapReduce源码解读-2

MapReduce源码解读-2 MapReduceInputFormat类getSplitsCreateRecordReader Mapper类OutputCollectorMapOutputBufferPartitioner 分区环形缓冲区 Circular buffer初始化 Spill、Sort溢写、排序Merge 合并combiner 规约 Reduce阶段ReduceTask第一层调用 ReduceTask.run -shuffle…

【力扣】刷题+剑指offer第二版

文章目录 题目收藏不含重复字符的最长子串最长公共子串 剑指 Offer剑指 Offer 05. 替换空格剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 09. 用两个栈实现队列剑指 Offer 07. 重建二叉树剑指 Offer 06. 从尾到头打印链表剑指 Offer 11. 旋转数组…

【大数据之Hadoop】二十八、生产调优-HDFS集群扩容及缩容

增加或缩减服务器&#xff0c;注意不允许白名单和黑名单同时出现同一个主机。 1 服役新服务器 原有数据节点不能满足数据存储需求时&#xff0c;需要在原有集群的基础上动态增加节点&#xff0c;即动态增加服务器&#xff0c;增加服务器的同时不需要重启集群。 hadoop完全分布…

JVM相关知识点

java内存区域 线程私有的&#xff1a; 程序计数器虚拟机栈本地方法栈 线程共享的&#xff1a; 堆方法区直接内存 程序计数器&#xff1a;记录当前线程执行的位置 当线程切换后能够知道该线程上次运行到哪了 java虚拟机栈&#xff1a; 方法调用的数据通过栈进行传递&#…

一篇文章带你重新回溯单链表的所有

&#x1f349;博客主页&#xff1a;阿博历练记 &#x1f4d7;文章专栏&#xff1a;数据结构与算法 &#x1f69a;代码仓库&#xff1a;阿博编程日记 &#x1f339;欢迎关注&#xff1a;欢迎友友们订阅收藏关注哦 文章目录 &#x1f34c;前言&#x1f4bb;无头单向非循环链表&am…

SSM(Spring、SpringMVC、MyBatis)整合、配置

SpringMVC是一个表述层(前台的页面和后台的servlet)框架&#xff0c;处理浏览器发送到服务器的请求&#xff0c;并且将一些数据响应到浏览器 MyBatis是一个持久层框架&#xff0c;帮助我们连接数据库&#xff0c;访问数据库&#xff0c;操作数据库中的数据 Spring是一个整合型框…

毕业论文相关

毕业论文参考文献和Word保存 一、Word中出现[7-9]多个文献的引用 在正文中选中参考文献角标&#xff0c;右击选择“切换域代码”&#xff0c;参考文献角标[7][8][9]变为{ REF _Ref98345319 \r \h * MERGEFORMAT }{ REF _Ref98345321 \r \h * MERGEFORMAT }{ REF _Ref99390603…

AQS独占锁之ReentrantLock源码调试(JDK8)

前言&#xff1a; 为什么需要学习ReentrantLock? 目前项目开发中使用到的几乎都是分布式锁&#xff0c;平时可能很少用到java自带的锁&#xff1b; 但实际在我们java的源码中&#xff0c;随处可见需要使用锁来保证线程安全&#xff0c;所以还是有必要学习下ReentrantLock。 1…

7.分区表和分桶表

1.创建分区表 create table dept_partition(deptno int,dname string,loc int ) partitioned by (dt string) // 分区字段(date) row format delimited fields terminated by \t; 2.增删改查操作 2.1 插入数据 1&#xff09;导入本地数据 -- 创建一个名字为dt2022-06-14的…

R语言 | 输入与输出

目录 一、认识文件夹 1.1 getwd()函数 1.2 setwd()函数 1.3 file.path()函数 1.4 dir()函数 1.5 list.files()函数 1.6 file.exists()函数 1.7 file.rename()函数 1.8 file.create()函数 1.9 file.copy()函数 ​1.10 file.remove()函数 二、数据输出&#xff1a;ca…

单片机c51中断 — 中断扫描法行列式键盘

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章&#xff0c;中断 在第4章中已介绍过行列式键盘的工作原理&#xff0c;并编写了相应的键盘扫描程序。但应注意的是&#xff0c;在单片机应用系统中&#xff0c;键盘扫描只是 CPU 工作的内容之一。CPU …

一文理清 TiDB 与 MySQL 中的常用字符集及排序规则

1. 字符集&#xff08;character set&#xff09; 1.1. 字符集与编码规则 字符集&#xff08;character set&#xff09;即为众多字符的集合。字符集为每个字符分配一个唯一的 ID&#xff0c;称为 “Code Point&#xff08;码点&#xff09;”。编码规则是将 Code Point 转换…

商户查询的缓存——缓存击穿问题

缓存击穿问题也叫热点key问题&#xff0c;就是一个被高并发访问并且缓存重建业务比较复杂的key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击 常见的解决方案有两种&#xff1a; 互斥锁&#xff08;高并发时性能较差&#xff09; 逻辑过期 基于互斥锁方…