Linux动态链接库研究及应用第13期屯脑与信息技术2005月COMPUTERANDINFORMATIONTECHNOLOGY文章编号:1005—1228(2005)02—0025—04VOVO1。13NO。2ApzilApzil2005WindowsLinux动态链接库研究及应用(重庆科技学院计算机科学与技术大学,湖南长沙430081)摘要:动态链接库技术是实现和设计程序常用的技术。文章剖析和比较了WindowsLinux两种操作系统动态技术,并给出了将VisualC编制的动态库移植到Linux的方式和经验。关键词:动态链接库;共享对象技术;程序移植中图分类号:TP316文献标示码:AStudyDynamicLinkLibraryaboutWindowsandLinuxanditsapplicationXIA0Jin—Hua(ComputerSchool,WuhanUniversityofScienceandTechnology,Wuhan,Hubei430081,China)Abstract:DynamicLinkLibraryisusualtechnologyinprogramming。ThispaperanalyzesandcomparesDynamicLinkLibraryofWindowsandLinux,givemethodandexperienceabouttransplantVisualCdynamiclibrarytoLinux。
Keywords:DynamicLinkLibrary;SharedObject;programtrans[er。序言动态链(DynamicLinkLibraryabbr,DLL)技术是程序设计中时常采用的技术,其目的是削减程序,节约空间,提升效率。采用动态库技术具有很高的灵活性,对于升级软件版本愈发容易。与静态库(StaticLinkLibrary)不同,动态库上面的函数不是执行程序本身的一部份,而是依据执行须要按需载入,其执行代码可以同时在多个程序中共享。在WindowsLinux操作系统中,都可以采用这些方法进行软件设计,但它们的调用方法以及编程方法不尽相同。动态库技术1。1Windows动态库技术动态链接库是实现Windows应用程序共享资源,节约显存空间,提升使用效率的一个重要技术手段。常见的动态库包含外部函数和资源,也有些动态库只包含资源,如Windows字体资源文件,称之为资源动态链接库。一般动态库以。dll,dry查看linux是什么系统,。fon等作为后缀。相应的Windows静态库一般以。1ib结尾,Windows自己就将一些主要的系统功能以动态库模块的方式实现。Windows动态库在运行时被系统加载到进程的虚拟空间中,使用从调用进程的虚拟地址空间分配的显存,成为调用进程的一部份。
DLL只能被该进程的线程所访问。DIL的句柄可以被调用进程使用;调用进程的句柄可以被DLL用。DLL模块中包含各类导入函数,用于向外界提供服务。DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈收稿Et期:2005~02—28作者简介:肖~(1955一),女,广东深圳人,学士,副院长,硕士生导师,研究方向:系统软件开发,操作系统,信息安全研究。?26?笔记本与信息技术第13模式;一个DLL在显存中只有一个实例;DLL现了代码封装性;DLL的编制与具体的编程语言及编译器无关,可以通过DLL来实现混和语言编程。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。按照调用方法的不同,对动态库的调用可分为静态调用方法和动态调用方法。(1)静态调用称作为隐式调用,由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码(Windows系统负责对DLL调用次数的计数),调用方法简单,才能满足一般的要求。一般采用的调用方法是把形成动态链接库时形成的LIB文件加入到应用程序的工程中,想使用DLI中的函数时,只须在源文件中申明一下。LIB文件包含了每一个DLL导入函数的符号名和可选择的标示号以及DLL文件名,不富含实际的代码。
Lib文件包含的信息步入到生成的应用程序中,被调用的DLL文件会在应用程序加载时同时加载到显存中。(2)动态调用,即显示调用方法,是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,比较复杂,但能愈发有效地使用显存,是编制小型应用程序时的重要方法。在Windows统中,与动态库调用有关的函数包括:LoadLibrary(或MFCAfxLoadLibrary),装载动态库。GetProcAddress,获取要引入的函数,将符号名或标示号转换为DIL内部地址。FreeLibrary(或MFCAfxFreeLibrary),释放动态链接库。在Windows中创建动态库特别便捷和简单。在VisualC中,可以创建不用MFC而直接用语言写的DLL程序,也可以创建基于MFC库的DLL程序。每一个DLL必须有一个人口点,在VC++中,DllMain是一个缺省的人口函数。DllMain负责初始化(Initialization)和结束(Termination)T作。动态库输出函数也有两种约定,分别是基于调用约定和名子修饰约定。DLL程序定义的函数分为内部函数和导入函数,动态库导入的函数供其它程序模块调用。
一般可以用下边几种方式导入函数;采用模块定义文件的EXP"target—XPORT部份指定要输入的函数或则变量。使用MFC提供的修饰符号一declspec(dllexport)。以命令行形式,采用/EXP"target=XP0RT命令行输出有关函数。在Windows动态库中,有时须要编撰模块定义文件(。DEF),它是用于描述DLI属性的模块句子组成的文本文件。1。2Linux共享对象技术在Linux操作系统中,采用了好多共享对象技术(SharedObject),尽管它和Windows态库相对应,但它并不称为动态库。相应的共享对象文件以。SO作为后缀,为了便捷,在本文中,对该概念不进行专门分辨。Linux系统的/lib以及标准图形界面的/usr/x1lR6/lib等目录上面,就有许多以SO结尾的共享对象。同样,在Iinux也有静态函数库这些调用方法,相应的后缀以。a结束。Linux采用该共享对象技术以便捷程序间共享,节约程序占有空间,降低程序的可扩充性和灵活性。Linux还可以通过ID—PREIOAD变量让开发人员可以使用自己的程序库中的模块来替换系统模块。同Windows系统一样,在Linux中创建和使用动态库是比较容易的事情,在编译函数库源程序时加上一shared选定即可,这样所生成的执行程序就是动态链接库。
一般这样的程序以SO缀,在Linux动态库程序设计过程中,一般流程是编撰用户的插口文件,一般是。h文件linux动态链接库软件,编撰实际的函数文件,以。c或。cpp为后缀,再编撰makefile文件。对于较小的动态库程序则毋须如此,但这样设计会使程序愈加合理。编译生成动态链接库后,从而可以在程序中进行调用。在Linux中,可以采用多种调用方法,同Windows的系统目录(。。system32等)一样,可以将动态库文件拷贝gt]/lib目录或则在/lib录上面构建符号联接,便于所有用户使用。下边介绍Linux调用动态库常常使用的函数,但在使用动态库时,源程序必须包含dlfcn。h头文件,该文件定义调用动态链接库的函数的原型。(1)打开动态链接库:dlopen,函数原型void*dlopen(constchar*filename,intflag);dlopen用于打开指定名子(filename)的动态Linux动态链接库研究及应用:!:链接库,并返回操作句柄。(2)取函数执行地址:dlsym,函数原型为:void*dlsym(void*handle,char*symbo1);dlsym按照动态链接库操作句柄(handle)与符号(symbo1),返回符号对应的函数的执行代码地址。
(3)关掉动态链接库:dlcloselinux动态链接库软件,函数原型为:intdlclose(void*handle);dlclose用于关掉指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才能真正被系统卸载。(4)动态库错误函数:dlerror,函数原型为:eonstchar*dlerror(void);当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。在取到函数执行地址后,就可以在动态库的使用程序上面,按照动态库提供的函数插口申明,调用动态库上面的函数。在编撰调用动态库的程序的makefile文件时,须要加入编译选项一rdynamicldl。不仅采用这些方法编撰和调用动态库之外,Linux操作系统还提供了一种更为便捷的动态库调用方法,便捷其它程序的调用。这些方法与Windows系统的隐式链接类似,其动态库命名方式为"lib*。SO。*"。这个命名方法中的第一个*表示动态链接库的库名,第二个*一般表示该动态库的版本号,也可以没有版本号。在这些调用方式中,须要维护动态链接库的配置文件/etc/ld。
SO。conf来让动态链接库为系统所使用,一般将动态链接库所在目录名追加到动态链接库配置文件中。如具有XWindow窗口系统发行版的文件中都具有/usr/Xl1R6/lib,它指向XWindow窗口系统的动态链接库所在目录。为了使动态链接库能为系统所共享,还需运行动态链接库的管理命令。/sbin/ldconfig。在编译所引用的动态库时,可以在gcc采用一选项,或直接引用所需的动态链接库形式进行编译。在Linux上面,可以采用ldd命令来检测程序依赖共享库。两种系统动态库比较剖析WindowsLinux采用动态链接库技术的目的是基本一致的,但因为操作系统不同,她们之间也还是有许多不同之处,主要彰显在以下几个方面。(1)动态库程序编撰。在Windows系统下的执行文件格式是PE格式,动态库须要一个DllMain函数作为初始化的入口,一般在导入函数的申明时须要有declspec(dllexport)关键字。Linuxgcc编译的执行文件默认是EIF式,不须要初始化入口,亦不须要在函数中做非常的申明linux虚拟机,编撰比较便捷。(2)动态库编译。
在Windows系统下边,有方便的调试编译环境,一般不用自己去编撰makefile文件,但在linux"target—Linux下边,须要自己动手编撰makefile文件,因而,必须掌握一定的makefile编撰方法,一般Linux编译规则相对严格些。(3)动态库调用方面。Windows其下编制的动态库都可以采用显式调用或隐式调用,但具体的调用方法不尽相同。(4)动态库输出函数查看。在Windows许多工具和软件可拿来查看DLL中输出的函数,比如命令行形式dumpbin以及VC++工具中的DEPENDS程序。在Linux系统中一般采用nm