Skip to content

Commit 43b4eaf

Browse files
committed
Update dev/library
1 parent ef01039 commit 43b4eaf

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

docs/dev/library.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ source["源文件 (*.c, *.cpp)"] -->|编译| target["目标文件 (*.o)"]
2929
header["头文件 (*.h)"] --- source
3030
target -->|链接| executable["可执行文件 (ELF等)"]
3131
target -->|ar rcs| staticlib["静态链接库 (*.a)"]
32-
target -->|gcc -shared| dynamiclib["动态链接库 (*.a)"]
32+
target -->|gcc -shared| dynamiclib["动态链接库 (*.so)"]
3333
```
3434

3535
### 使用链接库
@@ -116,3 +116,16 @@ gcc main.c -L./lib -lsquare -o main
116116
这里,`-L./lib` 表示要求链接器在 `./lib` 中寻找链接库,`-lsquare` 表示需要链接 `libsquare.a` 这个静态链接库文件。
117117

118118
编译好之后,就可以正常使用了。由于静态链接库中的代码会被直接合并到链接产生的可执行文件 `main` 中,因此运行时不需要文件 `libsquare.a`
119+
120+
## 动态链接库
121+
122+
动态链接库与静态链接库类似,都是首先需要对库的代码进行编译。但是,动态链接库需要生成位置无关代码 (PIC),且是在依赖这个库的程序**运行时**由加载器 (loader) 动态加载到内存空间中的。
123+
124+
!!! comment "关于动态加载"
125+
126+
如果多个程序共用一份动态链接库,那么内存中可以只有一份动态链接库的二进制代码,所有程序通过虚拟内存机制“看到”这份二进制代码,而非像静态链接库那样每个依赖于它的程序中都嵌入一份,有效节约了空间。
127+
128+
也正因为此,动态库和依赖于动态库的程序是分开存储的 (两个不同的文件),这可能会带来一些问题:
129+
130+
- 不同版本的动态库可能都安装在系统上,如果使用了不正确的版本,库提供的接口可能不对应,这会导致栈不平衡等严重的问题。
131+
- 动态链接库 (特别是常用的那些) 有被恶意修改的可能,如果程序依赖一个动态库而它被修改的话,几乎可以执行任意代码。

0 commit comments

Comments
 (0)