【CSAPP】深入理解计算机系统 第九章 虚拟内存 动态链接 printf 17/26
链接 深入 理解 动态 17 26 虚拟内存 printf
2023-06-13 09:15:03 时间
静态链接 在我们的实际开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如一个源文件可能要调用另一个源文件中定义的函数,但是每个源文件都是独立编译的,即每个.c 文件会形成一个.o 文件,为了满足前面说的依赖关系,则需要将这些源文件产生的目标文件进行链接,从而形成一个可以执行的程序。这个链接的过程就是静态链接。 动态链接 动态链接出现的原因就是为了解决静态链接中提到的两个问题,一方面是空间浪费,另外一方面是更新困难。 静态链接与动态链接的区别
- 在静态链接中,外部库文件中定义的函数和变量在可执行文件中链接。这意味着在编译 / 链接时,代码实际上与您的代码相关联。**使用动态链接,您在软件中使用的外部函数不会与可执行文件链接。**相反,它们驻留在外部库文件中,这些文件仅由您的软件引用。即: 编译器 / 链接器指示软件在哪里找到使用的函数。动态链接生成的可执行文件要比静态链接生成的文件要小一些。
- 静态链接在” 编译时” 由称为链接器的工具完成。动态链接在运行时由操作系统完成。
更高明
这里有一个小问题,就是从上面的图中可以看到静态运行库里面的一个目标文件只包含一个函数,如libc.a里面的printf.o只有printf()函数,strlen.o里面只有strlen()函数。 我们知道,链接器在链接静态链接库的时候是以目标文件为单位的。比如我们引用了静态库中的printf()函数,那么链接器就会把库中包含printf()函数的那个目标文件链接进来,如果很多函数都放在一个目标文件中,很可能很多没用的函数都被一起链接进了输出结果中。由于运行库有成百上千个函数,数量非常庞大,每个函数独立地放在一个目标文件中可以尽量减少空间的浪费,那些没有被用到的目标文件就不要链接到最终的输出文件中。
C printf() 详解之终极无惑
不定长参数
…用法
virtualize VA----CPU----(MMU)-----PA
物理地址 空间对应于系统中实际拥有的DRAM容量
虚拟地址 —大得多–对每个进程都是相同的
磁盘disk --虚拟内存 DRAM–物理内存
页 --大部分 4KB 有时4MB
相关文章
- Integrity plus for mac(网站链接检查工具)
- 【Android 逆向】Linux 文件分类 ( 普通文件 | 目录文件 | 链接文件 | 字符设备文件 | 管道文件 | 块设备文件 )
- 锚文本链接是什么?有什么作用?
- 深入了解Linux下的文件链接机制(linux下链接文件)
- 深入学习Linux:理解符号链接的作用(linux符号链接)
- 比较:Visual Studio 与MySQL 链接(vs链接mysql)
- 深入Linux C语言编程:实现跨平台链接(linuxc链接)
- Linux的静态链接:获取最大性能(静态链接linux)
- 深入理解Linux符号链接文件(linux 符号链接文件)
- MS SQL数据库在Kali Linux中的连接实践(mssql链接 kali)
- Linux系统下深入研习目录与软链接(linux目录软连接)
- 深入探索Oracle数据库的全链接查询(oracle全链接查询)
- 深入了解Redis查看链接数及其影响原理(查看 redis 链接数)
- 深入了解查看Redis中的连接数量(查看redis有多少链接)
- 无功而返无法连接Redis(无法链接redis)
- 基于Redis实现安全高效的服务器链接(redis 链接服务器)
- 简易指南获取Redis链接信息(redis 链接信息)
- 常用参考资料(手册)下载或者链接
- javascript实现阻止iOSAPP中的链接打开Safari浏览器