Linux动态库与静态库

Linux动态库与静态库

1.库的概念、种类与使用

库的概念:一组.o文件的集合,或者说.obj文件(windows下)的集合,也就是链接生成可执行文件时用到的文件

请添加图片描述

在我的理解里,库就是别人写的代码,比如库函数,第三方库,包括之后会用到的网络库,这些都是别人写的,我们只是拿过来使用而已

那为什么我们要使用别人的代码呢?

因为:为了开发效率和代码的健壮性

那我们要如何使用别人的库?

  • 借助库、开源代码、和网络。下面我们主要了解库的使用
  • 如果别人要用我们的功能,我们又不想给源码,就可以把源码打包成一个库给对方用

库的种类:

链接分为动态链接和静态链接,库分为动态库和静态库。静态链接是一个过程,这个过程中用到的库就是静态库,动态链接同理

使用三方库时的链接过程:
请添加图片描述


2.链接简述

2.1 链接过程理解

链接过程简单概括为地址和空间分配,符号解析和代码重定位

符号指的是变量,函数名等,符号解析则是将符号的定义和符号的引用建立联系

重定位我简单理解为可以准确的运行我们的程序,比如一个函数,我们可以精准的找到函数入口的地址并进行运行

符号解析后生成符号表,linux下查看符号表命令:readelf -s 文件名.o

请添加图片描述

代码的重定位:我们运行的指令都有其对应的地址,比如我们进入一个函数就是跳到一个表示函数入口的地址,代码变化指令也会跟着变化,地址自然就变化了,比如前面一开始有4条代码,修改后有5条,那对应的指令和地址可能都要发生变化,函数入口就变化了,此时的代码里重新计算地址的过程就叫做重定位。如果有多个模块,成千上万行代码,修改这个地址的工作就是庞大的,早期还是人工改,现在都交给链接器了


2.2 静态链接与动态链接概念

静态链接概念:

  • 静态链接:是指编译阶段把静态库的代码加入到可执行文件中,或者说把用到的函数的全部链接到可执行文件中(但是链接器是以文件为单位进行操作的,比如要用printf就得链接所有包含printf的文件)。这样生成的可执行文件不需要借助外部的库,生成后可以直接使用,这就是静态链接。缺点是文件比较大,每次更新都得重新编译,优点是运行较快
  • 简言之:把需要的代码和数据从库全拷贝到当前代码

动态链接概念:

  • 动态链接:是什么时候要用到库里的东西就什么时候去找,存的也只是索引和相关的部分信息,所以占用空间不大。好处是占用空间小,所有的程序可以共用同一个库,更新也比较方便,缺点就是比较慢。如果我们有及时上百个进程都用了同一个库,那相比静态链接就大大节省了空间
  • 简言之:动态库可以被多个进程共享,与进程地址空间里的共享区有关

2.3 静态链接与动态链接的例子

gcc -o 命令默认动态链接,加上-static选项就表示静态链接,可通过file命令查看链接属性

#include <stdio.h>
int main()
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值