深入理解计算机系统-链接篇

2023-11-06

    在linux系统下,很多开源C\C++程序的编译规则都是以makefile文件的形式给出。我刚开始学习makefile规则是看陈浩的《跟我一起学makefile》,后来看《深入理解计算机系统》这本书,对编译链接有了更加深入的了解。本文主要介绍程序编译的过程和原理,内容基于《深入理解计算机系统》这本书。

本文还未完成,持续更新中,目前进度为介绍一个简单gcc命令的的执行过程。

    在阅读C/C++相关书籍时,一般都会介绍在linux系统下使用gcc命令编译简单的小程序。例如,当我们在sum.c文件中实现加法操作的函数,并在main.c中调用sum.c中的函数,当代码写完后通过如下命令编译:

gcc -Og -o prog main.c sum.c

上述例子将main.c和sum.c编译为可执行文件prog,实际是经历了如下几步:

cpp [other arguments] main.c /tmp/main.i #将main.c翻译为一个ASCII码的中间文件
cc1 /tmp/main.i -Og [other arguments] -o /tmp/main.s   #将中间文件翻译为汇编文件
as [other arguments] -o /tmp/main.o /tmp/main.s  #将main.s 翻译为可重定位目标文件
... #相同程序生成sum.o
ld -o prog [system object files and args] /tmp/main.o /tmp/sum.o 
#运行链接程序ld,将main.o和sum.o以及一些必要的系统目标文件组合起来,创建可执行目标文件prog

一.静态链接

    ld命令以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的,可以加载和运行的可执行目标文件作为输出。其主要完成两个任务:

1.符号解析,将每个符号引用和一个符号定义关联。

2.重定位,生成从地址0开始的代码和数据节,通过把每一个符号定义与一个内存位置关联起来,从而重定位这些节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解计算机系统-链接篇 的相关文章

  • C++--封装

    目录 封装 封装的含义 封装的意义1 实例一 实例二 C 面对对象的三大特点 继承 封装 多态 封装 封装的含义 将对象的属性和行为作为一个整体 表现生活中的事物 将属性和行为加以权限控制 封装的意义1 设计一个类 将属性和行为写到一起 表
  • Struts简介

    一 Struts英文单词意思 支柱 支架 来源于建筑和旧式飞机使用的金属支架 二 定义 Struts是流行和成熟的基于MVC设计模式的Web应用程序框架 Struts在软件开发中 是一个非常优秀的框架 它先是Jakarta项目的一个子项目
  • 微服务常见解决方案和高并发常见解决方案、以上特殊解决方案

    我确实比较懒 有些东西总是会写到自己的笔记本上或者在线笔记中 一般很少总结写到博客中 闲来无事确实总结了一些 如果你需要 可以私信聊聊 不敢说有特别好特别完美的方案 但是从个人视角结合知识再结合经验还是有点可说的内容的 如果你需要请私信
  • Parameter ‘name‘ not found. Available parameters are [0, 1, param1, param2]] with root cause

    SpringBoot环境 测试查询数据库 第一次直接通过dao层的注解查询 全局查询没问题 加入参数就报错了 提示说传的参数找不到 打印出来都有值 最后查了一下 这是错误的接口方法 查询注解里的参数有问题 修改为
  • TinyKv流程梳理三

    split流程 处理协程启动 func bs Raftstore startWorkers peers peer ctx bs ctx workers bs workers router bs router bs wg Add 2 raft
  • RecycleView

    鸿洋 Android RecyclerView 使用完全解析 体验艺术般的控件 http blog csdn net lmj623565791 article details 45059587 Android RecycleView 实现滑
  • 虚拟机服务器之间文件拷贝与传输

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 scp scp定义 scp可以实现服务器与服务器之间的数据拷贝 from server1 to server2 二 rsync rsync主要用于备份和镜
  • 开漏输出、推挽输出的区别

    前言 background 测试相关设备引脚输出 使用示波器时发现部分引脚需外接上拉电阻至高电平才能在示波器观察到高阻态 为了深究其中原理 查阅了相关资料 发现知乎中有一篇对这两种输出描述得清晰易懂的文章 此时才真正了解信号高阻态和高电平输
  • SpringBoot--基础--04--拦截器

    SpringBoot 基础 04 拦截器 拦截器 实现HandlerInterceptor接口 注册拦截器 一 代码结构 MyMvcConfig 使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能 Conf
  • 同步方法及同步代码块

    synchronized方法和synchronized块 synchronized方法必须获得对象的锁才能执行 否则线程阻塞 方法一旦执行 就独占此锁 直到方法返回才释放锁 后面被阻塞的线程才能获得这个锁 继续执行 synchronized
  • 谷歌取消了2000多人的offer,特殊时期如何应对裁员?

    就在刚刚 CNBC报道 科技大厂谷歌有上千人饭碗保不住了 图片来自NBC 版权属于原作者 谷歌缩减招聘 据悉这部分人主要是谷歌的合同工和临时工 纽约时报 报道 谷歌取消了2000多人的工作录取 上个月 谷歌首席执行官劈柴君向员工承认 由于新

随机推荐

  • 字符串 字符串中的第一个唯一字符

    LC 字符串中的第一个唯一字符 给定一个字符串 s 找到 它的第一个不重复的字符 并返回它的索引 如果不存在 则返回 1 Swift 实现 func firstUniqChar s String gt Int 创建字符数组 var arra
  • [HTTP] 01一张思维导图带你领略HTTP发展史

    HTTP是什么 HTTP作为一个较常见的应用协议 在面试过程中经常会对其相关内容进行考察 其发展史亦是重点 HTTP是什么 HTTP为Hyper Text Transfer Protocol的简写 中译超文本传输协议 是在计算机网络里面点对
  • 网络原理:ISO/OSI参考模型

    1 ISO OSI参考模型 1 1 各层功能 1 物理层功能 物理层是OSI参考模型的最低层 它利用传输介质为数据链路层提供物理连接 保证二进制位流的透明传送 2 数据链路层 数据链路层是为网络层提供服务的 解决两个相邻结点之间的通信问题
  • C# 学习笔记--个人学习使用 <1>

    C 学习笔记 Chapter 1 C 比较软的基础部分 Section 1 类与命名空间 Part 1 命名空间 NameSpace Part 2 类 Class Section 2 基本元素 Section 3 数据类型 Part 1 什
  • 使用opencv rotate函数实现图片旋转

    使用rotate函数 旋转图片 rotate src dst ROTATE 90 CLOCKWISE 使用rotate 旋转图片 src是源图片的mat dts是目标图片的mat 第3个参数是旋转的角度 有以下4个选项 ROTATE 90
  • android app缓存机制会自动清除,深入理解Android缓存机制(一)缓存简介

    概述 说起缓存 大家可能很容易想到Http的缓存机制 LruCache 其实缓存最初是针对于网络而言的 也是狭义上的缓存 广义的缓存是指对数据的复用 我这里提到的也是广义的缓存 比较常见的是内存缓存以及磁盘缓存 不过要想进一步理解缓存体系
  • Python内置函数详解,进阶必备

    内置函数就是Python给你提供的 拿来直接用的函数 比如print input等 截止到python版本3 6 2 python一共提供了68个内置函数 具体如下 本文将这68个内置函数综合整理为12大类 正在学习Python基础的读者一
  • 关于SDC时钟约束的事

    1 quartus的SDC约束就跟xilinx的ucf约束文件一样 2 主要用途一般是 一从输入端口到寄存器 二寄存器到寄存器 通过设定时钟频率方式进行约束 三寄存器到输出 四创建时钟约束命令 五时钟延迟约束 六时钟抖动约束 七输入和输出延
  • Android实现简单的相册

    用手机浏览靓照也是件非常惬意的事了 然而如何实现这一功能呢 其实也并不难 下面是一个简单的例子 功能为 主屏幕上显示用户选择的靓照 屏幕下面滚动显示靓照集 点击即可浏览 如下图所示 实现代码为 这里图片没法提供了 可以设置自己喜欢的图片 R
  • MYSQL查询优化器

    MYSQL 逻辑结构 MySQL 使用典型的客户端 服务器 Client Server 结构 体系结构大体可以分为三层 客户端 服务器层以及存储引擎层 其中 服务器层又包括了连接管理 查询缓存 SQL 接口 解析器 优化器 缓冲与缓存以及各
  • Navicat连接Mysql遇到的错误

    在navicat链接mysql以后的版本时 会出现2059的错误 这个错误出现的原因是在mysql8之前的版本中加密规则为mysql native password 而在mysql8以后的加密规则为caching sha2 password
  • mysql内测试连通性命令_怎么使用ping命令进行连通性测试

    关于ping命令的作用 ping 命令有助于验证网络层的连通性 一般进行网络故障排除时 可以使用ping 命令向目标计算机或IP地址发送ICMP回显请求 目标计算机会返回回显应答 如果目标计算机不能返回回显应答 说明在源计算机和目标计算机之
  • python提取txt文件中的数据

    从存储在txt文件中的30000多条数据当中提取自己需要的信息 如下图示例的数据格式 需要提取出now后的数值并存储在另外一个txt文件当中 结果示例 code path r r new data1 txt with open path r
  • C++ 项目

    C 方向 10个企业级别项目 138个工作日 1 学生信息管理系统 C 基础 2 俄罗斯方块 控制台 C 基础
  • Arcgis server在solaris和linux上,用直连的方式连接sde的时的配置

    Arcgis server在solaris和linux上 用直连的方式连接sde的时候需要做一点配置才可以连上 1 在
  • 微信小程序从入坑到放弃二十:生成海报前使用wx.downloadFile或wx.getImageInfo时潜在的坑

    摘要 上周六下午16点左右 公司研发群中扔来一张bug截图 当天21点 群里又扔来bug截图 研发团队二话不说开始查找bug如何复现 22点20分左右 我终于复现了bug 随后就是看源码 搜索 跳坑 爬坑 周日同其他研发小伙伴一样 又是奉献
  • OpenCv案例(九): 基于OpenCvSharp图像分割提取目标区域和定位

    以下原图中 物体连靠在一起 目的是将其分割开 再提取轮廓和定位 原图 最终效果 麻烦的地方是 分割开右下角部分 两个连在一起的目标物体 下图所示 基本方法 BoxFilter滤波 二值化 轮廓提取 凸包检测 图像的矩 代码如下
  • Jar包反编译后修改源码再编译

    Jar包反编译后修改源码再编译 文章目录 Jar包反编译后修改源码再编译 1 场景 2 详细步骤 2 1 查看源码 2 2 生成源文件 2 3 构建项目 2 4 编译成jar包 3 参考链接 1 场景 需要对当前的jar包功能进行修改 但是
  • angularjs系列之轻松使用$q进行异步编程

    angularjs系列之轻松使用 q进行异步编程 来源 网络 编辑 admin 第一部分关于js中的异步编程 异步编程简单的说就是你写了一段代码 但他不会按照你书写代码的顺序立即执行 而是等到程序中发生了某个事件 如用户点击了某个按钮 某个
  • 深入理解计算机系统-链接篇

    在linux系统下 很多开源C C 程序的编译规则都是以makefile文件的形式给出 我刚开始学习makefile规则是看陈浩的 跟我一起学makefile 后来看 深入理解计算机系统 这本书 对编译链接有了更加深入的了解 本文主要介绍程