在讲动态链接时,不得不先复习一下静态链接。
像Unix ld程序这样的静态连接器以一组可重定位目标文件和命令行参数作为输入,生成一个完全连接的可以加载和运行的可执行目标文件作为输出。为了构造可执行文件,连接器必须完成两个任务。1.符号解析
目标文件定义和引用符号。符号解析的目的是将每个符号引用刚好和一个符号定义联系起来。2.重定位
编译器和汇编器生成从地址0开始的代码和数据结构。链接器通过把每个符号定义与一个虚拟存储器位置关联起来,然后修改所有对这些符号的引用,使得他们指向这个存储器位置,从而重定位这些节。静态库
在Unix系统中静态库以存档(archive)的特殊文件格式存放在磁盘中。在链接时,链接器将只拷贝被引用程序引用的目标模块,这就减少了可执行文件在磁盘和存储器中的大小。另一方面,应用程序员只要包含较少的库文件的名字。(注意由于链接器解析引用的方式,要注意参数的顺序)。共享库
共享库是一个目标模块(.so),在运行时,可以加载到任意的存储器地址,并和一个在存储器中程序链接起来。这个过程称为动态链接,是由一个叫做动态链接器的程序来执行的。加载共享库有两种方式。- 在应用程序执行之前,即应用程序被加载时,动态链接器加载和链接共享库。
- 在应用程序执行时,要求动态链接器加载和链接任意共享库,而无需在编译时链接那些库到应用中。
- 在应用程序执行之前,即应用程序被加载时,动态链接器加载和链接共享库。
动态链接共享库
最新推荐文章于 2023-07-20 16:40:08 发布