当前位置: 首页 > news >正文

【CSAPP】深入理解计算机系统 第九章 虚拟内存 动态链接 printf 17/26

在这里插入图片描述在这里插入图片描述

静态链接
在我们的实际开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如一个源文件可能要调用另一个源文件中定义的函数,但是每个源文件都是独立编译的,即每个.c
文件会形成一个.o
文件,为了满足前面说的依赖关系,则需要将这些源文件产生的目标文件进行链接,从而形成一个可以执行的程序。这个链接的过程就是静态链接。

动态链接 动态链接出现的原因就是为了解决静态链接中提到的两个问题,一方面是空间浪费,另外一方面是更新困难。

静态链接与动态链接的区别

  1. 在静态链接中,外部库文件中定义的函数和变量在可执行文件中链接。这意味着在编译 / 链接时,代码实际上与您的代码相关联。**使用动态链接,您在软件中使用的外部函数不会与可执行文件链接。**相反,它们驻留在外部库文件中,这些文件仅由您的软件引用。即:
    编译器 / 链接器指示软件在哪里找到使用的函数。动态链接生成的可执行文件要比静态链接生成的文件要小一些。

  2. 静态链接在” 编译时” 由称为链接器的工具完成。动态链接在运行时由操作系统完成。

更高明

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里有一个小问题,就是从上面的图中可以看到静态运行库里面的一个目标文件只包含一个函数,如libc.a里面的printf.o只有printf()函数,strlen.o里面只有strlen()函数。
我们知道,链接器在链接静态链接库的时候是以目标文件为单位的。比如我们引用了静态库中的printf()函数,那么链接器就会把库中包含printf()函数的那个目标文件链接进来,如果很多函数都放在一个目标文件中,很可能很多没用的函数都被一起链接进了输出结果中。由于运行库有成百上千个函数,数量非常庞大,每个函数独立地放在一个目标文件中可以尽量减少空间的浪费,那些没有被用到的目标文件就不要链接到最终的输出文件中。

C printf() 详解之终极无惑

在这里插入图片描述

不定长参数

在这里插入图片描述

…用法

在这里插入图片描述

virtualize VA----CPU----(MMU)-----PA

物理地址 空间对应于系统中实际拥有的DRAM容量

虚拟地址 —大得多–对每个进程都是相同的

在这里插入图片描述
在这里插入图片描述

磁盘disk --虚拟内存
DRAM–物理内存

页 --大部分 4KB 有时4MB

相关文章:

  • 软文营销评论区怎样营造好的氛围?
  • Android Gradle plugin requires Java 11 问题解决
  • mysql安装,安装mysql配置教程(超级详细图解)
  • 为什么现在西红柿都“硬邦邦”的,放几个星期都不会坏?为你解答
  • java实现微信小程序获取手机号(htts接口实现)
  • 亚马逊,速卖通,国际站卖家为什么要做测评
  • Centos7搭建sftp服务器,开启SFTP上报日志
  • 模式识别课程混合式教学设计
  • 基于云原生的视频管理系统设计与实现
  • AOP的使用(详细讲解)
  • DES加密算法安全吗,有哪些优点和缺点?
  • AI智能分析网关包含哪些深度学习算法?如何赋能场景应用?
  • JavaEE图书管理项目
  • SpringBoot Web开发----Thymeleaf的简单入门
  • Object Detection in 20 Years: A Survey
  • [NodeJS] 关于Buffer
  • [译]如何构建服务器端web组件,为何要构建?
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Java多态
  • magento 货币换算
  • maya建模与骨骼动画快速实现人工鱼
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Python 基础起步 (十) 什么叫函数?
  • Python爬虫--- 1.3 BS4库的解析器
  • react 代码优化(一) ——事件处理
  • REST架构的思考
  • SpringBoot 实战 (三) | 配置文件详解
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Web设计流程优化:网页效果图设计新思路
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 计算机常识 - 收藏集 - 掘金
  • 聊聊sentinel的DegradeSlot
  • 如何借助 NoSQL 提高 JPA 应用性能
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • PostgreSQL之连接数修改
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • #include<初见C语言之指针(5)>
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (TOJ2804)Even? Odd?
  • (附源码)计算机毕业设计ssm电影分享网站
  • (四) 虚拟摄像头vivi体验
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)JAVA中的堆栈
  • (转)Sql Server 保留几位小数的两种做法
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)视频码率,帧率和分辨率的联系与区别
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • *上位机的定义
  • .bashrc在哪里,alias妙用
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明