动态链接Linux动态链接:共享库的实现(linux共享库实现的)
Linux动态链接是Linux系统操作管理的重要组成部分。它指的是在程序运行期间,将未被程序包含的功能函数库代码加载进进程,且实现函数调用和程序运行。动态链接模块使用共享库实现,集成了可能会被多个程序所使用的代码,一次性被加载进内存,被多个程序共享,可以加快效率。这就是Linux动态链接的共享库的实现方式。
Linux的共享库遵循标准POSIX 共享库规范,基于ELF(Executable 和 Linkable FORMAT)可执行文件格式。ELF格式并不仅仅限于共享库,也用于可执行文件,内核等,它具有可移植性好、当64位应用程序同时与32位应用程序而且兼容性好,所有的ELF文件中都含有一个专门处理共享库链接和加载的部分:动态连接部分(Dynamic Linking Part)。
动态链接的实现过程分为三步:1. 链接器编辑,系统根据用户的输入,将ELF头、程序段和数据段卷建,生成地址虚拟内存中的可执行代码;2.实际运行时,系统根据ELF可执行文件中的动态链接程序段,将动态链接程序段映射到物理内存,执行编译时添加的函数调用,将共享库加载到内存中;3. 运行共享库中的函数,执行完毕后,从内存中清除共享库函数,完成一次的动态链接过程。
Linux 中编写使用动态链接的程序,需要使用gcc编译命令,它会产生一个可执行文件,其中含有一些特殊的段,这些段用于动态链接的处理。程序被加载进内存之后,会发现可执行文件动态链接程序段中提及的共享库未被加载进内存,系统会自动查找共享库位置,并调用内核实现共享库加载并连接动作。
动态链接的实现思路在工程上很重要,它可以实现程序免安装,动态引用共享库缩减代码量,提高程序运行速度,减少系统内存消耗,节省硬盘空间,对于系统的运行稳定性和兼容性非常有利。
// gcc命令的例子:
gcc -o main main.c -L /usr/lib -lm
// ld命令的例子:
ld -r /usr/lib/libm.so.6 main.o -o main