动静态库

inode

inode用于管理文件属性和内容

一个文件只能有一个inode,一个inode可以对应多个文件名

Linux进程中,打开的每一个文件都有对应的文件inode属性和文件页缓冲区(内存和磁盘的缓冲区)

软硬链接

硬链接

多个文件指向同一个inode时,inode就有多个计数,这几个文件实质上是同一个文件

删除时inode计数不为0,这个inode管理的文件内容就不会释放

软链接

链接指定文件时,产生独立的inode

删除源文件,软链接失效

为什么软链接可以跨文件系统链接,但是硬链接不可以?

因为软链接是独立的inode,里面存有源文件的路径

动静态库特点

动态库

1、动态库也是运行库所以在运行程序时加载到内存中去

在根据起始地址,计算内部函数以及变量地址,这导致动态库速度较慢

2、动态库是共享库,所以多个程序可以共享一个动态库

静态库

静态库要拷贝到可执行程序中,这可以使得静态库速度更快,但是缺点是冗余的代码会占用内存

动静态库

静态库

一般只在如下情况使用静态库

1、static修饰

2、只提供静态库

为什么 -I 引用头文件时不需要绝对路径,但是在链接 -L 却需要绝对路径?

这两者都是需要绝对路径的,预处理阶段头文件展开,是需要在系统路径下找的

引用头文件只是告诉编译器去哪条路径下找,绝对路径写在了main.c中

库名称是libmymath.a 为什么链接时却是mymath?

链接库时去掉前缀和后缀

动态库

为什么动态库找不到?

链接时告诉了编译器动态库在哪里,但系统不知道(加载器),所以在加载时找不到动态库

为什么静态库能找到?

静态库是直接拷贝到可执行程序

找不到静态库解决方法

Linux进程可以共享动态库 --共享库

所以动态库可以节省内存和磁盘空间

动态库是怎么被加载的?

进程地址空间中的共享区内容通过页表映射在物理内存中,通过映射,之后执行的代码都会在进程地址空间中执行

系统在运行多个库时,会对多个库进行管理(先描述,在组织)

地址问题

程序没加载前

在函数入口处的地址是虚拟地址

程序加载后

CPU运行函数入口(虚拟地址)后,通过进程页表映射到物理内存,CPU看到的是虚拟地址,他不需要直接关心物理地址

共享库大了,具体映射在哪里?

动态库是不可能加载到固定的地址空间位置

库可以在虚拟内存任意位置加载,让自己内部函数不采用绝对编址,只表示在库中的偏移量就可以

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值