Linux 动静态库

本文详细介绍了Linux中静态库与动态库的概念、本质及其使用规则。静态库在编译时与程序合并,形成独立的可执行文件;动态库在运行时加载,节省磁盘和内存资源。讲解了gcc编译规则、制作与使用静态库动态库的方法,以及解决动态库找不到的问题的多种策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

静态库和动态库的概念和本质。

结合虚拟地址空间 理解静态库和动态库的使用

gcc规则使用动静态库的规则:

制作静态库

使用静态库

方法1.

方法2.

制作动态库

使用动态库

方法1:

方法2:

方法3:

方法4:


静态库和动态库的概念和本质。

1. 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库,生成的可执行程序中自己的代码和静态库的代码是一体的,进程运行起来之后,全部都在地址空间的代码区。

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

所以,在编译链接时,静态库就会和自己的源文件编译汇编形成的.o文件合并,生成一个可执行程序,之后再执行此可执行程序时,不再需要静态库,因为已经在可执行程序内部了。而使用动态库时,动态库并不在可执行程序内部,每次运行过程中,才会去加载链接动态库。


结合虚拟地址空间 理解静态库和动态库的使用

静态库在你的源文件编译汇编,最后链接时,已经进入可执行程序内部了,生成可执行程序之后,后期执行此可执行程序,不再需要静态库文件。可以独立运行,所有代码都存在于进程地址空间的代码段中。

动态库和可执行程序可以分批加载,先运行可执行,若需要执行动态库中的函数代码时,加载动态库代码到内存中,建立进程地址空间中共享区(栈堆之间的那部分区域),页表,内存中的动态库代码的映射关系。执行动态库代码时,从地址空间中的代码段跳转到共享区,然后通过页表映射执行内存中的动态库代码即可。

这也是为什么动态库的.o文件编译时,要加-fPIC选项,fPIC表示生成的.o文件中的地址,是一种与位置无关的地址,相对地址。编动态库代码的地址时,都是从0开始编址。

因为动态库的使用机制。动态库是一种共享库,动态库可以被多个进程共享,同时使用。所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。    即,如果多个进程需要用到内存中的一个共享库,则利用虚拟地址空间机制,建立映射关系即可。    而静态库则不是,若有十个进程使用同一个静态库,同时运行,则内存中将会有10份一样的静态库代码。这无疑是一种内存资源浪费。

结合动态库是一种共享库,以及用gcc -c 汇编动态库源文件时要加-fPIC选项,这个选项表示动态库编址是一种相对地址。如何理解呢?

多个进程使用同一个动态库时,每一次动态库被加载到内存,映射到进程的地址空间的共享区后,映射的位置可能是不一样的。
但是,因为动态库内使用的是相对地址,所以,函数定位可以采用 库在地址空间中的起始虚拟地址 + 函数偏移量的方式,确定函数的虚拟地址。也就是动态库的编址为一种相对地址。

而静态库和自己的.o文件链

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值