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

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

1668175895584.jpg1668175907076.jpg

静态链接


在我们的实际开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如一个源文件可能要调用另一个源文件中定义的函数,但是每个源文件都是独立编译的,即每个.c

文件会形成一个.o

文件,为了满足前面说的依赖关系,则需要将这些源文件产生的目标文件进行链接,从而形成一个可以执行的程序。这个链接的过程就是静态链接。


动态链接


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


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


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

编译器 / 链接器指示软件在哪里找到使用的函数。动态链接生成的可执行文件要比静态链接生成的文件要小一些。


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


更高明

1668175957164.jpg1668175964952.jpg1668175973640.jpg1668175982719.jpg






这里有一个小问题,就是从上面的图中可以看到静态运行库里面的一个目标文件只包含一个函数,如libc.a里面的printf.o只有printf()函数,strlen.o里面只有strlen()函数。

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


C printf() 详解之终极无惑

1668175999271.jpg



不定长参数

1668176010871.jpg


…用法

1668176022486.jpg


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

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


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

1668176030073.jpg1668176040317.jpg




磁盘disk --虚拟内存

DRAM–物理内存


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


相关文章
|
4月前
|
存储 安全 Linux
【Linux系统编程】程序地址空间
【Linux系统编程】程序地址空间
|
5月前
|
算法 调度 C语言
操作系统进程调度算法(c语言模拟实现)
操作系统进程调度算法(c语言模拟实现)
154 0
|
6月前
|
存储 安全 Windows
3.6 Windows驱动开发:内核进程汇编与反汇编
在笔者上一篇文章`《内核MDL读写进程内存》`简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用`capstone`引擎实现这个功能。
26 0
3.6 Windows驱动开发:内核进程汇编与反汇编
|
11月前
|
存储 缓存 算法
【操作系统--MMU内存管理单元】Linux环境下C语言详解(附代码)
【操作系统--MMU内存管理单元】Linux环境下C语言详解(附代码)
202 0
|
11月前
|
存储 资源调度 算法
【操作系统--页面置换算法】C语言详解--大作业版(附代码)
该实验为作者OS课程大作业,内容若有问题,望指出,多多交流
250 0
|
存储 Unix 程序员
C程序运行对应的内存分布关系
C程序运行对应的内存分布关系
105 0
C程序运行对应的内存分布关系
|
编译器
【CSAPP数据段解析】汇编语言机械级编程
【CSAPP数据段解析】汇编语言机械级编程
85 0
【CSAPP数据段解析】汇编语言机械级编程
|
人工智能 程序员 编译器
【C语言指针详解-CSAPP数据段解析】1024程序员节 | 汇编语言机械级编程|用代码,改变世界#
【C语言指针详解-CSAPP数据段解析】1024程序员节 | 汇编语言机械级编程|用代码,改变世界#
90 0
【C语言指针详解-CSAPP数据段解析】1024程序员节 | 汇编语言机械级编程|用代码,改变世界#
【CSAPP】深入理解计算机系统 第一章 程序 1/26
【CSAPP】深入理解计算机系统 第一章 程序 1/26
75 0
【CSAPP】深入理解计算机系统 第一章 程序 1/26