Linux_动态库与静态库(其一)

1.动态库和静态库的定义

动态库(.so):动态库是编译后不嵌入目标文件中的共享库,在程序运行的时候才去链接动态库的代码,可以被多个程序共享使用,通常以 .so 结尾。

静态库(.a):静态库是将一组目标文件(.o文件)打包成一个单一的归档文件。在编译时,链接器会将所需的目标文件代码复制到最终生成的可执行文件中,程序运行的时候将不再需要静态库,通常以.a结尾。

库的命名规则:

lib+库名+后缀(.s/.so等)

eg:libc.so的库名为c,其表示c语言动态库

eg:libc.a的库名为c,其表示c语言静态库

2.动静态程序的运行过程:

静态可执行程序

加载:因为可执行程序包含头文件所有方法和main函数,所以加载到内存比较大。

在内存的程序代码通过页表对应进程地址空间的正文代码段

如果其他进程也需要使用C库,内存中没有加载C库,C库在静态可执行程序中,所以其他进程还要重新加载C库,浪费了内存空间

动态可执行程序

加载:除了代码加载到内存,其所使用的方法也会被加到内存。所以加载比较小

内存中的代码映射到进程地址空间的正文代码段,所使用的方法映射到栈和堆区之间的共享区

如果其他进程也需要使用C库,则只要调整其他进程的映射关系到已经在内存加载好的C库即可,

不需要重复加载,节省内存空间

3.查看可执行程序依赖的动态库(ldd)

ldd主要用于查看动态库的依赖关系,而静态库在编译时会被直接链接到可执行文件中,因此通常不会显示依赖。

4.静态库与动态库的优缺点

静态库

缺点:

1).加载到内存时所占空间大

2).多个进程使用同一库会导致内存资源浪费

优点:

1).与库无关,库已经链接在可执行程序中,删除库后仍可运行

2).程序不依赖于库,跨平台性更强

动态库

缺点:

1).依赖库,如果可执行程序生成后,删除库则无法运行这个可执行程序

优点:

1).节省内存空间资源

对比动态可执行程序与静态可执行程序所占内存的差异: