【Linux】动静态库

目录

什么是库

静态库

动态库

ELF


什么是库

1、库:写好的,现有的,别人可以直接拿来用的,不用自己再去一个个实现

2、分类

静态库

1、.h文件 是对.c文件中函数的一个说明文档,告诉你 怎么使用,也就是使用手册

2、所以比如有A.c B.c D.c总共三个文件,分别自己形成自己的.o文件就行,实际上只是gcc *.o这一步才会链接三个文件。

3、只要把我的.h和.o文件打包交给别人,就可以实现库的效果!

4、但是如果有很多.o文件呢,所以要对所有的.o文件打包,那么打包所有的.o文件,其实就是静态库的形成。

5、但如果用tar打包给对方,对方还要解包,所以Linux直接提供了一个方法,可以把所有的.o文件打包成一个文件,这个文件也不用解包,对方可以直接使用,也就是 ar -rc myc.a *.o

而.a是使用者可以直接用gcc进行链接就行。

6、真正的静态库名字,要去掉lib,去掉.a eg. libmyc.a 真正的名字是 myc

7、链接的时候Linux默认不会在当前目录找库,所以有-L . 也就是在 . 指定的目录下去找库

8、最终的命令 gcc -o usercode usercode.o -L. -lmyc

其中usercode是最终的可执行程序,最后直接./usercode就能运行,链接的是 usercode.o和myc静态库。

9、要是编译自己的.c,编译成.o文件,找不到对应的头文件.h,因为.h可能没在当前.c文件的目录下,所以需要指定找头文件的路径 gcc -c usercode.c -I ./lib/include

-I(大i) 找到头文件的路径

-L 找到库的路径

-l(小L) 库名

10、库的安装

实际上就是把自己写的.h文件cp到系统的目录include里面,把自己写的.a文件cp到系统目录的lib64里面去,自此,只要链接加上库的名字就能链接成功,例如:gcc usercode.c -lmyc

动态库

1、把所有.c 生成 .o 要加 -fPIC eg. gcc -fPIC -c *.c

2、 静态库用ar生成.a, 动态库直接用gcc, eg: gcc -shared -o libmyc.so *.o

3、我已经形成了可执行程序,但是./usercode找不到libmyc.so这个动态库,但是为啥静态库不存在这个问题。因为静态库只要编译通过,运行的时候就不需要了,但是动态库不一样,运行的时候还需要系统告诉它动态库。

①也就是要把 libmyc.so 拷贝到系统的 lib64下

②通过建立系统目录的软链接实现

③通过环境变量 LD_LIBRARY_PATH添加动态库的路径去实现

④更改系统的配置文件

4、动静态库都同时存在

如果没有静态,只有动态,带static,就会报错

5、ELF文件

.o文件都是ELF格式的

合并:

ELF

1、ELF Header:

存储的是ELF的管理信息,比如:每一部分的大小,比如sizeof Program Header Table

2、下面会在虚拟地址里面进行统一的编址。

3、CPU拿到的地址都是虚拟地址,然后用页表把虚拟地址转化成物理地址,CPU和磁盘的视角是一模一样的,入口地址在ELF Header中,有一个Entry point address去记录。如下图所示

4、可执行程序是如何加载到内存的

5、动态库通过地址空间和进程关联

共享库=动态库

6、动态链接

GOT表映射到对应的库和偏移量

  • 由于代码段只读,我们不能直接修改代码段。但有了GOT表,代码便可以被所有进程共享。但在不 同进程的地址空间中,各动态库的绝对地址、相对位置都不同。反映到GOT表上,就是每个进程的 每个动态库都有独⽴的GOT表,所以进程间不能共享GOT表。
  • 在单个.so下,由于GOT表与 .text 的相对位置是固定的,我们完全可以利⽤CPU的相对寻址来找 到GOT表。
  • 在调⽤函数的时候会⾸先查表,然后根据表中的地址来进⾏跳转,这些地址在动态库加载的时候会 被修改为真正的地址。
  • 这种⽅式实现的动态链接就被叫做 PIC 地址⽆关代码。换句话说,我们的动态库不需要做任何修 改,被加载到任意内存地址都能够正常运⾏,并且能够被所有进程共享,这也是为什么之前我们给 编译器指定-fPIC参数的原因, PIC=相对编址+GOT。
相关推荐
27669582922 小时前
京东最新滑块 分析
linux·前端·javascript·h5st·京东滑块·京东m端滑块·京东逆向
dddddppppp1232 小时前
c 模拟一个fat16文件系统1
linux·运维·服务器
lengjingzju2 小时前
一网打尽Linux IPC(四):POSIX IPC
linux·服务器·c语言
取加若则_2 小时前
Linux进程状态解析:僵尸与孤儿进程揭秘
linux
活蹦乱跳酸菜鱼2 小时前
Linux开发板使用AI-通义千问
linux·运维·服务器
Xの哲學2 小时前
Linux IPC机制深度剖析:从设计哲学到内核实现
linux·服务器·网络·算法·边缘计算
lihui_cbdd2 小时前
[故障排查] NFS 存储集群卡顿的完整排查记录:谁在深夜疯狂读写?
linux·运维
张火火isgudi3 小时前
VMware Debian 挂载 Windows 文件夹至 Debian 目录
linux·运维·windows·debian
石榴花上3 小时前
银河麒麟上的9090端口被占用问题处理
linux