软链接与硬链接,动态库与静态库

首先我们了解一个概念 文件系统:

我们使用ls -l的时候除了看到文件名,还看到了文件元数据:

软链接与硬链接,动态库与静态库_第1张图片

可以看到每行包含七列,分别为:模式,硬链接数,文件所有者,组,大小,最后修改时间,文件名。

ls -l读取存储在磁盘上的文件信息,然后显示出来。还可以用stat命令查看某个文件的具体信息:

软链接与硬链接,动态库与静态库_第2张图片

上面结果中有一个inode很重要,我们分析一下它,先看文件系统:

软链接与硬链接,动态库与静态库_第3张图片

这就是文件系统的图示,其中超级块存放文件系统本身的结构信息;i节点表存放文件属性如文件大小,所有者,最近修改时间

等;数据区存放文件内容。

接下来我们看看创建一个新文件是如何创建的呢:


这个657909就是空闲的i节点,内核找到这个空间i节点并把文件信息记录到其中,该文件需要存储在三个磁盘块,内核找到了三

个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。文件内容按顺序300,500,800存

放。内核在inode上的磁盘分布区记录了上述块列表。然后内核将入口(657909,abc)添加到目录文件。文件名和inode之间的

的对应关系将文件名和文件的内容和属性连接起来。

可结合下图理解:

软链接与硬链接,动态库与静态库_第4张图片

硬链接:

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。其实在linux中可以让多个文件名对应于同一个inode.


abc和edf的链接状态完全相同,它们被称为指向文件的硬链接。内核记录了这个连接数,inode 657909的硬链接数为2。我们在

删除文件时干了俩件事,第一把这个文件在目录中对应的记录删除,第二把硬链接数减1,如果为0,将对应的磁盘释放。

软链接;

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件。



静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库

用一个小程序来实现一下生成静态库和动态库:

先看一下代码:

软链接与硬链接,动态库与静态库_第5张图片

软链接与硬链接,动态库与静态库_第6张图片

我们通过命令来生成静态库:

软链接与硬链接,动态库与静态库_第7张图片

我们可以看出生成静态库的步骤很简单,只需要了解记住这些命令的意思就行了。

测试目标文件生成后,删除静态库,程序照样可以运行。

动态库

动态库(.so)程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码

在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。

动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存

中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。


下面同样是上面的代码,我们再生成动态库:

软链接与硬链接,动态库与静态库_第8张图片

还是通过命令,也需要了解并且记住这几个命令。


你可能感兴趣的:(Linux)