File tree Expand file tree Collapse file tree 1 file changed +14
-1
lines changed Expand file tree Collapse file tree 1 file changed +14
-1
lines changed Original file line number Diff line number Diff line change @@ -29,7 +29,7 @@ source["源文件 (*.c, *.cpp)"] -->|编译| target["目标文件 (*.o)"]
29
29
header["头文件 (*.h)"] --- source
30
30
target -->|链接| executable["可执行文件 (ELF等)"]
31
31
target -->|ar rcs| staticlib["静态链接库 (*.a)"]
32
- target -->|gcc -shared| dynamiclib["动态链接库 (*.a )"]
32
+ target -->|gcc -shared| dynamiclib["动态链接库 (*.so )"]
33
33
```
34
34
35
35
### 使用链接库
@@ -116,3 +116,16 @@ gcc main.c -L./lib -lsquare -o main
116
116
这里,` -L./lib ` 表示要求链接器在 ` ./lib ` 中寻找链接库,` -lsquare ` 表示需要链接 ` libsquare.a ` 这个静态链接库文件。
117
117
118
118
编译好之后,就可以正常使用了。由于静态链接库中的代码会被直接合并到链接产生的可执行文件 ` main ` 中,因此运行时不需要文件 ` libsquare.a ` 。
119
+
120
+ ## 动态链接库
121
+
122
+ 动态链接库与静态链接库类似,都是首先需要对库的代码进行编译。但是,动态链接库需要生成位置无关代码 (PIC),且是在依赖这个库的程序** 运行时** 由加载器 (loader) 动态加载到内存空间中的。
123
+
124
+ !!! comment "关于动态加载"
125
+
126
+ 如果多个程序共用一份动态链接库,那么内存中可以只有一份动态链接库的二进制代码,所有程序通过虚拟内存机制“看到”这份二进制代码,而非像静态链接库那样每个依赖于它的程序中都嵌入一份,有效节约了空间。
127
+
128
+ 也正因为此,动态库和依赖于动态库的程序是分开存储的 (两个不同的文件),这可能会带来一些问题:
129
+
130
+ - 不同版本的动态库可能都安装在系统上,如果使用了不正确的版本,库提供的接口可能不对应,这会导致栈不平衡等严重的问题。
131
+ - 动态链接库 (特别是常用的那些) 有被恶意修改的可能,如果程序依赖一个动态库而它被修改的话,几乎可以执行任意代码。
You can’t perform that action at this time.
0 commit comments