了解链接
-
链接属于编译过程的哪一步
- 编译器通常是由许多具有独立功能的小程序所组成,由编译器驱动器程序(compiler driver program) 来调用,这样做便于设计维护与移植。
- 这些独立程序通常分为预处理器(preprocessor)、语法和语义检查器(syntactic and semantic checker)—前端、代码生成器(code generator)— 后端、汇编程序(assemble)、优化器(optimizer)、链接器(linker)。
- 事实上优化器(optimizer) 可以加在上述各阶段之后。
-
动态链接
- 如果函数库的一份拷贝是可执行文件的物理组成部分,那么我们称之为静态链接;如果可执行文件只是包含了文件名,让载入器在运行时能够寻找程序所在的函数库,我们称之为动态链接,在外部函数被真正调用之前,运行时载入器并不解析它们,故不会带来额外开销;
- 静态链接与动态链接都不会将整个文件装入,而是装入需要的函数。
-
动态链接的优点
- 动态链接可执行文件比功能相同的静态链接可执行文件体积小,节约磁盘空间与虚拟内存;
- 所有动态链接到特定函数库的可执行文件在运行时共享该函数库的一个单独拷贝,提供了更好的I/O以及交换空间利用率,节省了物理内存,提高了系统性能;而静态链接则是每个文件都拥有一份拷贝,显然极为浪费。
-
如何创建动态库并使用
- 该书中所写代码我无法成功运用,并找到了代替方案。
生成动态库: gcc -fPIC -shared -o libname.so 文件名; 如: gcc -fPIC -shared -o libfruit.so tomato.c 调用动态库:(这里只写命令) gcc 文件名 绝对路径 如: gcc main.c /home/fengyue/libfruit.so
- 该书中所写代码我无法成功运用,并找到了代替方案。
-
Interpositioning / Interposing
这是指用与库函数同名的函数取代该库函数,但这样做有时候会出现大问题,在用自己版本的函数取代库函数之后,无论是你的代码还是系统调用,都会使用你的版本!但C语言允许这样做,所以不会提示错误信息,故需注意。