`
steven-zhou
  • 浏览: 212414 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

理解动态链接库

阅读更多
在Linux的应用开发中,静态库和动态库都是我们经常用到的技术,有必要对这两个概念及其原理做一些介绍。

静态库
静态库是一些目标文件的集合,通常为后缀为.o 的文件,通过ar 工具打包而成,命名
格式为libxxx.a ,其中xxx 为给定的静态库文件名,如libm.a ,为数学函数库,用户也可以命名自己的库。在创建可执行程序的过程中,静态库同时被链接到程序代码,被主程序调用的函数目标文件连同主程序组合成单一的可执行程序。静态库只在程序链接时起作用,最终的执行程序脱离静态库运行。

动态库
按照其英文(shared library )也可理解为共享库,动态库的后缀一般为.so ,通过编译器生成,在不同的平台有不同的生成方法,但是在Linux 平台中,其使用及工作原理是一致的。使用动态库创建执行程序,分为两个阶段:链接阶段,即通过ld 创建执行程序时,链接编辑器会在指定的动态库中搜索、解析被主程序调用的函数及其他变量等,如引用被找到,则在执行程序的XCOFF 头结构的loader 区域,建立包含引用的动态库的影像,反之,如在指定的动态库中没有找到此引用的定义,编译器会给出类似未定义的符号引用错误。这不同于静态库,包含引用的目标文件并不和执行程序链接在一起。
另一阶段为运行阶段,即执行程序运行时。程序运行时,系统相关模块将读取定义执行程
序的XCOFF 头结构中的信息,查找并加载相关的动态库,假设,所有被应用的动态库都被定位且加载后,程序将开始运行。反之,如果,被应用的动态库丢失,则程序报错。这一个过程我们常称之为动态链接。可以通过一个简单的例子来分析静态库与动态库的不同,假定执行程序名为a.out ,分别通过静态库和动态库编译、链接.对使用动态库的程序,程序启动后,相关的动态库的目标代码加载到系统内存,而且可以被其他使用此动态库的执行程序共享使用。这样,在给定的时间,统一动态库的代码在系统中只有一份拷贝,所有使用此动态库的程序可共享这一拷贝。动态链接的使用可以节省系统内存的使用,对一些比较复杂的应用作用比较明显,另外,执行程序代码的减小,也可以节省磁盘空间。

加载动态链接库,首先为共享库分配物理内存,然后在进程对应的页表项中建立虚拟页和物理页面之间的映射。你可以认为系统中存在一种引用计数机制,每当一个进程加载了共享库(在该进程的页表中进行一次映射),引用计数加一;一个进程显式卸载(通过dlclose等)共享库或进程退出时,引用计数减一,当减少到0时,系统卸载共享库。

(1)打开动态链接库:dlopen,函数原型void *dlopen (const char *filename, int flag); dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。

(2)取函数执行地址:dlsym,函数原型为: void *dlsym(void *handle, char *symbol); dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。

(3)关闭动态链接库:dlclose,函数原型为: int dlclose (void *handle); dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

(4)动态库错误函数:dlerror,函数原型为: const char *dlerror(void); 当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

在取到函数执行地址后,就可以在动态库的使用程序里面根据动态库提供的函数接口声明调用动态库里面的函数。在编写调用动态库的程序的makefile文件时,需要加入编译选项-rdynamic和-ldl。


用nm命令查看动态库文件提供哪些调用:
nm -D /usr/lib/libz.so
分享到:
评论

相关推荐

    动态链接库的基础教程

    通过本文的学习,您应该能够理解动态链接库的基本概念及其与静态链接库之间的差异。更重要的是,您已经了解了如何创建和使用动态链接库,这将对您的软件开发工作大有裨益。未来您可以根据实际需求选择合适的库类型,...

    动态链接库实验报告.pdf

    ### 动态链接库实验报告知识点梳理 #### 动态链接库(DLL)概念 ...通过实际操作,可以更深入地理解动态链接库在现代软件开发中的实际应用,以及如何在实际项目中有效地利用DLL技术提高开发效率和软件质量。

    动态链接库的建立与调用

    本实验旨在帮助学习者深入理解动态链接库(Dynamic Link Library,简称DLL)的工作原理及其在Windows环境下的具体实现方式。通过动手实践,学生将能够熟悉DLL的创建流程以及如何通过隐式调用和显式调用来使用这些库...

    自定义动态链接库的实现.pdf

    在深入探讨自定义动态链接库的实现之前,我们首先需要理解动态链接库(Dynamic Link Library,简称DLL)的基本概念及其在计算机科学领域的重要性。动态链接库是在Microsoft Windows操作系统中广泛使用的一种共享库的...

    动态链接库测试程序!

    首先,让我们深入理解动态链接库的工作原理。DLL文件包含了可执行代码和数据,这些代码和数据可以在运行时被多个进程调用。与静态链接库不同,静态链接库在编译时将其代码和数据合并到可执行文件中,而DLL则在程序...

    动态链接库显式调用

    首先,我们要理解动态链接库的两种调用方式:隐式调用和显式调用。隐式调用是通过编译器在编译时处理链接过程,将DLL中的函数地址加载到程序中。而显式调用,也称为延迟加载(Delay-Loaded DLL),是在运行时通过...

    动态链接库(隐式链接)制作简单计算器

    首先,我们需要理解动态链接库的两种主要链接方式:隐式链接和显式链接。隐式链接是在编译和链接应用程序时完成的,编译器会将DLL的函数调用直接转换为程序内部的地址。这种方式下,程序员需要在项目的链接阶段指定...

    VB调用VC生成的动态链接库

    首先,我们要理解动态链接库的工作原理。DLL文件包含了可执行代码和数据,当一个程序运行时,它会加载需要的DLL,并调用其中的函数。在VB中,我们通常通过` Declare`语句来声明DLL中的函数,然后在VB代码中像调用...

    工程简单重构,封装动态链接库

    首先,理解动态链接库的工作原理至关重要。DLL文件包含可执行代码和数据,当程序运行时,系统会根据需要加载这些库,而不是一次性全部加载。这样可以减少程序启动时的内存占用,因为多个程序可以共享同一个DLL的内存...

    动态链接库简单示例 加减乘除 解除名字改编

    动态链接库(Dynamic Link Library,简称DLL)是Windows操作系统中的一种共享库机制,它允许不同程序之间共享代码和数据,从而节省...这对于初学者来说是一个很好的起点,能够深入理解动态链接库的工作原理和使用方法。

    C++动态链接库实例调用

    首先,我们需要理解动态链接库的工作原理。与静态链接库不同,动态链接库不会在编译时合并到执行文件中,而是在程序运行时按需加载。这样,DLL可以在多个进程中被使用,减少了内存占用,并且允许在不重新编译应用...

    a_sample_dll_and_call 动态链接库中的静态调用.zip

    首先,我们需要理解动态链接库的基本概念。DLL是一个包含可由多个程序同时使用的函数和资源的库。在Windows操作系统中,动态链接使得应用程序可以在运行时与DLL进行连接,而不是在编译时。这允许开发者更新或替换DLL...

    动态链接库编程.pdf

    为了更好地理解动态链接库的作用,我们可以先来看一个简单的静态链接库示例。 ##### 示例步骤: 1. **创建静态链接库**:在Visual C++ 6.0中创建名为`libTest`的静态库工程。 2. **定义和实现函数**:在`lib.h`中...

    linux动态链接库的开发实例

    总结,开发和使用Linux下的C/C++动态链接库涉及到编译、链接、运行等多个环节,并且需要理解其背后的加载机制、版本管理和移植注意事项。通过实践,开发者可以熟练掌握这一技能,提升软件开发效率和质量。

    VC++动态链接库详解

    首先,我们需要理解动态链接库与静态链接库的区别。静态链接库(Static Library)在编译时会将库函数直接嵌入到可执行文件中,而动态链接库则是在程序运行时才加载到内存中。这意味着,动态链接库可以被多个进程共享...

    C动态链接库解析.pdf

    "C动态链接库解析" 一、动态链接库的基本概念 动态链接库(DLL)是一种共享代码的方式,它提供了一些可以直接拿来用的变量、函数...希望通过本文的学习,读者能够更好地理解动态链接库和静态链接库的概念和使用方法。

    duilib动态链接库.rar_duilib_duilib.dll运行库_duilib编译出错_动态链接_链接库

    Duilib是一款广泛应用于Windows平台的UI开发框架,它是一个开源的C++库,主要用于构建具有图形用户...在遇到编译或运行时问题时,应深入理解动态链接库的工作原理,并熟练掌握相关工具和技巧,以确保项目的顺利进行。

Global site tag (gtag.js) - Google Analytics