ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Linux】深入解析动静态库:原理、制作、使用与动态链接机制 [打印本页]

作者: 没腿的鸟    时间: 2024-6-20 19:38
标题: 【Linux】深入解析动静态库:原理、制作、使用与动态链接机制
媒介:

在软件开发中,动静态库是两种重要的代码复用和模块化本事。静态库(.a)在步伐编译时将库代码整合到可实行文件中,而动态库(.so)则在步伐运行时才链接库代码,使得多个步伐可以共享同一份库代码。这种机制不但进步了开发效率,还节省了磁盘和内存空间。本文将深入探讨动静态库的概念、制作和使用,以及动态库的查找和加载机制,资助读者更好地理解和应用动静态库。
1. 什么是动静态库


a. 用过库吗? 用过,语言给我们提供了大量的库来进行链接。
b. 动态库 & 静态库: 系统默认安装动态库,云服务器,静态库(C标准库)默认是没有安装的。
c. 默认编译步伐,用的是动态链接的,假如要静态加上 -static
d. libXXX.so、libYYY.a , 库真实的名字:XXX、YYY
2. 动静态库的制作和使用

站在库制作者的角度:我只给你提供 .o , 在不提供源文件的环境下也能形成可实行步伐。
   为什么要有库:
    全部的 .o 文件用特定的方式,进行打包,形成一个文件

  1. // main.c
  2. #include "mymath.h"
  3. #include "mystdio.h"
  4. #include <stdio.h>
  5. int main()
  6. {
  7.     int res = myAdd(10, 20);
  8.     printf("%d + %d = %d\n", 10, 20, res);
  9.     myFILE* fp = my_fopen("log.txt", "w");
  10.     if (fp == NULL) return 1;
  11.     return 0;
  12. }
复制代码

打包:
  1.   ar -rc libmyc.a  mymath.o mystdio.o
复制代码
  1. gcc main.c -lmyc -L .
复制代码

-L . :假如不像让 gcc 在当前目录下找了,可以将头文件添加到系统默认的头文件和库目录下。
gcc -c src.c -> src.o
gcc -c -fPIC src.c
动态库打包,我们不必要其它工具
makefile 文件:
  1. libmyc.so: mymath.o mystdio.o
  2.         gcc -shared -o $@ $^
  3. %.o:%.c
  4.         gcc -c -fPIC $<
  5. .PHONY:clean
  6. clean:
  7.         rm -rf *.o libmyc.so
复制代码
编写库的人:将来要给别人(用库的人), 交付的是: 头文件+库文件
打包为压缩包:
  1. libmyc.a:mymath.o mystdio.o
  2.         ar -rc $@ $^
  3.         rm *.o
  4. %.o:%.c
  5.         gcc -c $<
  6. libmyc.so:mymath.o mystdio.o
  7.         gcc -shared -o $@ $^
  8. %.o:%.c
  9.         gcc -c -fPIC $<
  10. #mymath.o:mymath.c
  11. #        gcc -c -fPIC $<
  12. #mystdio.o:mystdio.c
  13. #        gcc -c -fPIC $<
  14. .PHONY:clean
  15. clean:
  16.         rm -rf *.o libmyc.so *.a mylib mylib.tgz
  17. .PHONY:output
  18. output:
  19.         mkdir -p mylib/include
  20.         mkdir -p mylib/lib
  21.         cp -rf *.h mylib/include
  22.         cp -rf *.so mylib/lib
  23.         cp -rf *.a mylib/lib
  24.         tar czf mylib.tgz mylib
复制代码
以目录的形式组织起来:(告诉编译器头文件和库所在的文件位置)


3. 动态库的查找题目

     我们告诉的仅仅是编译器文件所在路径,可实行步伐并不知道
   所谓的把库(其它软件)安装到系统中,本质就是把对应的文件,拷贝到指定的路径中。
  对动态库
编译时的搜索路径 —— gcc
运行时的库搜索路径 —— OS
将库安装在系统中(/lib64),既可以支持编译,又可以支持运行。
解决找不到动态库的4种方案
  1. sudo ln -s /home/qhd/...(绝对路径) /lib64/libmyc.so
复制代码
编译器选择库的环境:

4. 理解动态库的加载

4.1. 站在系统的角度理解

库默认就是一个磁盘 级别的文件
库函数调用,依旧在历程的地址空间种进行的。
动态库加载之后,会被映射到历程的共享区中。
本质:全部系统历程中公共的代码和数据,只必要存在一份!
   题目:
  
  1. struct loadlib
  2. {
  3.         char *libname;
  4.         void *addr;
  5.         uint64_t time;
  6.         struct loadlib *next;
  7.         //...
  8. }
复制代码
4.2. 编址、可实行步伐

可实行步伐本身是有本身的格式信息的。
假如我们的可实行步伐,没有加载到内存中,我们的步伐中有没有地址呢?本来就有地址。
其实我们可实行步伐,在没有加载之前,也已经根本被按照类别(比如权限,访问属性等)已经可实行步伐分别为各个区域了。
我们历程地址空间内里的许多地址数据,是从可实行步伐中来的 。
   绝对编址的方式 —— 平坦模式
相对地址(逻辑地址) —— 段地址 + 偏移量
  操作系统和编译器也有关系? 假造地址空间本身不但是 OS 要服从,编译器编译的时候也要服从。
4.3. 动态库动态链接和加载题目

总结:

本文具体先容了动静态库的概念、制作、使用以及动态库的查找和加载题目。通过对比静态库和动态库的特点,我们了解到静态库在编译时链接,而动态库则在运行时链接,这使得动态库在节省空间和进步代码复用方面具有上风。文章还先容了如何制作和使用动静态库,包括编译器选项和Makefile的编写,以及如何处置惩罚动态库的查找题目,比方通过修改环境变量、创建软链接或配置系统路径等方法。最后,文章深入探讨了动态库的加载机制,包括系统如何管理已加载的库和动态链接的细节,显现了操作系统、编译器和盘算机体系结构在地址空间管理中的协同工作。通过本文的阅读,读者应该能够更加深入地理解动静态库的工作原理,以及如何在实际开发中有用地应用它们。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4