`
steven-zhou
  • 浏览: 207269 次
  • 性别: 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
分享到:
评论

相关推荐

    动态链接库和静态链接库区别

    动态链接库和静态链接库区别,让你真正理解动态链接库和静态链接库的区别。

    WINDOWS程序设计动态链接库 DLL 示例程序

    使用VS2010编写的《Windows程序设计》中动态链接库 dll 的例子 原书中有一些错误 以及不适用于新版本VS的地方 对程序添加了很多自己的理解的注释 主要是一个dll的编写和使用 适合对动态链接库不了解的同学学习参考

    java调用动态链接库dll

    动态链接库的唯一功能就是使用Java 能够理解的C 代码来调用目标原生函数。 这个没什么实际用途的动态链接库的编写过程令人沮丧。同时编写Java 和C 代码使开 发难度大大增加。 因此,在Java 开发社区中,人们一直都视...

    VC++动态链接库(DLL)编程

    VC++动态链接库(DLL)编程--理解库

    VC++动态链接库编程

    本文详细介绍了在VC++上面进行静态链接库和动态链接库的编写工作,运用简单的例子进行说明,有助于读者更快的理解和使用,是开发人员值得拥有入手的资料!

    C++ 库 动态链接库

    C++写的简单动态库,帮助理解C++动态库,仅供参考学习

    linux动态链接库使用方法分享

    1、前言 在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如...本文重点在于应用,如何编写和使用动态链接库,后续使用动态链接库实现一个插件程序。 2、动态链接库生产 动态链接库与普通的程序相比而言,

    Visostudio+C#.NET+动态链接库代码示例

    Visostudio+C#.NET开发动态链接库的实例教程,很好理解

    VC++动态链接库编程之基础慨念

    结合自己上课的知识,上机的多次实践,总结出的动态链接库的几种方法!里面加了一些自己的话,帮助理解!

    动态和静态链接库

    gcc编译动态和静态链接库.pdf,教你如何编译和使用库,提高程序的理解力

    理解linux下动态链接库延迟绑定.rar_lib_linux

    linux lib biding,lazy

    linux下C++动态链接C++库示例

    注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一、介绍 如何使用dlopen API动态地加载C++函数和类,是Unix C++程序员经常碰到的问题。 事实上,情况偶尔有些复杂,需要...

    VC++动态链接库(DLL)编程提高

    很受用,进一步理解dll,想学好都来了,必读的内容

    Access+2000中文版高级编程

    12.3.2 添加超级链接 370 12.3.3 在数据访问页中使用表达式 374 12.3.4 使用绑定的组合框和列表框 375 12.3.5 使用主题格式化 378 12.3.6 数据访问页所使用的其他控件 378 12.4 分组的数据访问页:Web报表...

    Access 2000中文版高级编程(part1)

    15.1 理解动态链接库 471 15.1.1 执行链接 471 15.1.2 内存管理 471 15.1.3 常用的DLL 471 15.2 检查API调用的语法 471 15.3 查找API的声明 474 15.4 查看可能的API调用 475 15.4.1 使用API Viewer定位调用 ...

    C++开源算法库OpenSAL1.1(Open Standardized Algorithm Library)——动态链接库

    OpenSAL1.1 包含了算法导论中所有数据结构和算法以及其他内容,本资源为该算法库的动态链接库 内容如下(*号表示1.1版本新增内容): 数据结构:一般堆、二项堆、斐波那契堆、红黑树、通用散列(采用全域散列和完全...

    操作系统——Windows平台多进程共享内存通信

    理解Windows环境下创建内核对象,动态链接库以及共享内存段的过程,并利用他们实现多个生产者多个消费者进程。其中生产者每次存放一个数据,消费者拿出一个数据并计数。 补充,1、生产消费模板在那个CRBuffer的...

    反编译工具dnspy,可以将已经编译的程序文件(如可执行文件、动态链接库等)转换回其原始的源代码形式

    具体而言,dnSpy可以将编译后的.NET程序集反编译为可读性较高的C#代码,开发者可以通过查看这些代码来理解程序的逻辑和实现细节。此外,dnSpy还提供了一些高级功能,例如调试程序集、修改代码、查看程序集资源等,这...

    Qt 4 插件开发

    要的功能放到动态链接库里面并不能满足一些特定的需求,比如,我们希望应用程序能够自动发现某一特定文件夹下的动态链接库,能够 知道这些动态链接库内部的逻辑是怎样的,我们能够如何使用它们。这些需求,对于一个...

    库裁剪记录:动态库裁剪

    1. 什么是库? 相信很多小白都跟我一样,在有了一定的应用程序开发经验后,对库这...实际应用中,又会根据库链接的不同方式,进一步将库分为静态库(Statically-linked library)和动态库(Dynamic-linked library)。此处

Global site tag (gtag.js) - Google Analytics