当前位置: 首页 > news >正文

【深入理解】动静态库的制作、使用与加载原理(附详细操作指南)

一、什么是库?

库是可复用代码的二进制形式,可以被操作系统载入内存执行。库分为两种:

  • 静态库.a(Linux)、.lib(Windows)

  • 动态库.so(Linux)、.dll(Windows)

库的存在避免了“从零开始”,提升了开发效率。


二、静态库

2.1 静态库的特点

  • 编译链接时,库代码被直接嵌入到可执行文件中。

  • 运行时不再依赖外部库。

  • 生成的文件较大,但部署简单。

2.2 静态库的制作

使用 ar 工具将多个 .o 目标文件打包:

makefilelibmystdio.a: my_stdio.o my_string.oar -rc $@ $^
-rc:replace and create

2.3 静态库的使用

gcc main.c -L. -lmystdio
  • -L:指定库路径

  • -l:指定库名(去掉 lib 和 .a


三、动态库

3.1 动态库的特点

  • 程序运行时才链接库代码。

  • 多个程序可共享同一库,节省内存和磁盘空间。

  • 支持动态更新,无需重新编译程序。

3.2 动态库的制作

使用 gcc 的 -shared 和 -fPIC 选项:

makefilelibmystdio.so: my_stdio.o my_string.ogcc -shared -o $@ $^
%.o: %.cgcc -fPIC -c $<
  • -fPIC:生成位置无关代码

3.3 动态库的使用

gcc main.c -L. -lmystdio

3.4 动态库的搜索路径

如果运行时找不到动态库,可通过以下方式解决:

  1. 拷贝到系统路径:/usr/lib/usr/local/lib 等

  2. 设置 LD_LIBRARY_PATH 环境变量

  3. 使用 ldconfig 更新缓存


四、ELF 文件格式

ELF(Executable and Linkable Format)是 Linux 下可执行文件、目标文件、共享库的标准格式。

4.1 ELF 文件的四种类型

  • 可重定位文件(.o

  • 可执行文件

  • 共享目标文件(.so

  • 核心转储文件

4.2 ELF 文件结构

组成部分说明
ELF Header文件头,描述基本信息
Program Header Table程序头表,用于加载执行
Section Header Table节头表,用于链接视图
Sections代码、数据等具体内容

4.3 常见节(Section)

  • .text:代码

  • .data:已初始化全局变量

  • .bss:未初始化全局变量

  • .rodata:只读数据

  • .got:全局偏移表

  • .plt:过程链接表


五、链接与加载过程

5.1 静态链接

  • 将多个 .o 文件合并成一个可执行文件。

  • 链接器会进行地址重定位,修正函数调用地址。

gcc -c hello.c code.c
gcc hello.o code.o -o main

5.2 动态链接与加载

  • 动态链接在程序运行时进行。

  • 使用 GOT(全局偏移表) 和 PLT(过程链接表) 实现地址无关代码。
    因为代码区是只读,不能修改,所以要将偏址放到数据区

  • 支持延迟绑定,提高加载效率。


六、查看与分析工具

6.1 常用命令

命令说明
readelf -h查看 ELF 头
readelf -l查看程序头表
readelf -S查看节头表
objdump -d反汇编代码段
ldd查看动态库依赖
nm查看符号表

6.2 示例:查看可执行文件结构

readelf -h a.out
readelf -l a.out
objdump -d a.out

七、总结

对比项静态库动态库
链接时机编译时运行时
文件大小
内存使用不共享共享
更新维护需重新编译替换即可
适用场景独立部署多进程共享
http://www.dtcms.com/a/613622.html

相关文章:

  • OpenFeign:完整学习笔记
  • Vue 3 的Suspense组件:讲解如何使用_Suspense_处理异步组件加载状态
  • 【go.sixue.work】2.2 面向对象:接口与多态
  • 建设网站需要收费吗做淘客找单子的网站
  • 视频号直播视频录制
  • 抓取资源的网站怎么做珠海网站设计培训班
  • CPO(Co-Packaged Optics) 是整个数据中心互连范式的下一代核心
  • 1.5 ShaderFeature
  • 暄桐教练日课·10天《梦瑛篆书千字文》报名啦~
  • 从代码规范到 AI Agent:现代前端开发的智能化演进
  • 【MySQL】01 数据库入门
  • dede网站地图栏目如何上传文件wordpress禁用古登堡
  • 【ZeroRange WebRTC】RTP/RTCP/RTSP协议深度分析
  • 有商家免费建商城的网站吗网站上面关于我们要怎么填写
  • MySQL WHERE 子句
  • 力扣每日一题:统计1的显著的字符串数目
  • 彩票网站搭建多钱百度上做网站模板
  • PAM4技术:系统深入解析与应用实践
  • 无线资源映射RE Mapping介绍
  • ​​Vue 拦截器教程​
  • 科普:.NET应用开发的环境搭建
  • cn域名后缀网站南通网站建设南通
  • Kafka集群架构(ZK + Kafka)
  • 编程语言哪种编译器好 | 如何选择适合自己的编译器,提高开发效率
  • 【原创】基于YOLO模型的手势识别系统
  • 11.15 脚本网页 剪切板管家
  • 基于python代码自动生成关于建筑安全检测的报告
  • 【Chrono库】Chrono Traits 模块解析(traits.rs)
  • Go语言使用的编译器 | 探索Go编程语言的工具链和编译过程
  • Logback,SLF4J的经典后继日志实现!