目录
1. 什么是库
2. 静态库
2.1 静态库生成
2.2 静态库使用
3. 动态库
3.1 动态库形成
3.2 动态库使用
3.2.1 拷贝至系统
3.2.2 创建软链接
3.2.3 LD_LIBRARY_PATH
3.2.4 配置文件
4. 使用外部库
5. 目标文件
6. ELF文件
7. ELF从形成到加载轮廓
7.1 ELF形成可执行
7.2 ELF可执行文件加载
8. 理解链接与加载
8.1 静态链接
8.2 ELF加载与进程地址空间
8.2.1 虚拟地址/逻辑地址
8.2.2 重新理解进程虚拟地址空间
8.3 动态链接与动态库加载
8.3.1 进程如何看到动态库
8.3.2 进程间如何共享库
8.3.3 动态链接
8.3.3.1 概要
8.3.3.2 我们的可执行程序被编译器动了手脚
8.3.3.3 动态库中的相对地址
8.3.3.4 我们的程序,怎么和库具体映射起来的
8.3.3.5 我们的程序,怎么进行库函数调用
8.3.3.6 全局偏移量表GOT(global offset table)
8.3.3.7 库间依赖
8.3.4 总结
1. 什么是库
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:
- 静态库.a[Linux]、.lib[windows]
- 动态库.so[Linux]、.dll[windows]
// ubuntu 动静态库
// C
$ ls -l /lib/x86_64-linux-gnu/libc-2.31.so
-rwxr-xr-x 1 root root 2029592 May 1 02:20 /lib/x86_64-linux-gnu/libc-2.31.so
$ ls -l /lib/x86_64-linux-gnu/libc.a
-rw-r--r-- 1 root root 5747594 May 1 02:20 /lib/x86_64-linux-gnu/libc.a
//C&