摘要:本文详细介绍了在Linux平台上如何创建和使用动态加载库,并提出了一种基于动态加载的通信数据处理模型。随后并给出了该模型的一个项目实例的主要实现,由此分析了动态加载库的应用对系统性能带来的影响。
关键字:Linux,动态加载,通信数据处理,共享库,gcc
Realization of the Dynamic Loaded-Based Communication Data Processing on Linux
Abstract:This paper discuss how to create and use dynamic loaded library on Linux in detail, and put forward a kind of application model of dynamic loaded-based communication data processing, Subsequently, it also gives the main implement of a project example of that model and explains the effect on system performance of the application of dynamic loaded library.
Key words::Linux, Dynamic Loaded, communication data processing, shared library, gcc
1 引言
随着网络尤其是Internet的广泛普及,基于网络的应用系统的开发数量得到迅速增加。在这些应用系统中,都需要对通信数据(即消息)进行处理,并且通常对于整个系统的性能都有影响。在多数系统中,如银行代收代付系统,不可避免地有时会需要增加和修改业务,这一变化通常会导致对消息进行分发和处理程序的变动。如何可以将这些变动限制在局部范围内,并且相应地使系统的升级变得简化。在Window32的平台上,可以通过使用动态链接库(DDL)来实现。
在Linux平台上,也有与动态链接库相似的机制,被称为共享库(Shared Libraries)或共享对象(Shared Object)。通过共享库来实现动态加载,可以更换共享库来升级应用系统,所付出的代价只不过是系统的安装配置变得复杂。在通常的消息处理模型中,对消息的处理都是通过调用对应的处理函数来实现的。将消息处理函数通过动态链接的方式调用,不但提高了代码的重用性,并简化了以后软件的升级,只需要更换相应的共享库文件就可以了。Linux的主要C/C++编译器gcc很好地实现了共享库和动态加载机制,并已经得到了广泛应用。
2 Linux的函数链接方式
Linux 中的应用程序可以通过两种方式链接到外部函数:一种是在构建时与静态库( lib*.a)静态地链接,并将库代码包含在该应用程序的可执行文件里;一种是在运行时与共享库( lib*.so)动态地链接。与静态链接不同的是,应用程序的可执行文件中不包含共享库中的要调用的代码,而仅仅包含了一个索引而已。
2.1 档案文件( Archives )
档案文件(又称为静态库)只是将一系列C/C++程序编译成的对象文件(.o文件)存放在一个文件里。它类似于Windows中的.LIB文件。在链接可执行文件时,通过向链接器提供静态库文件,链接器就会在静态库文件中搜索到需要的对象文件,并把它取出链接到程序里去。这和直接提供给链接器这些对象文件是一样的。
在Linux中,可以通过ar命令来创建静态库文件(通常以.a作为后缀名)。将test1.o和test2.o两个对象文件生成一个静态库文件libtest.a的命令如下:
% ar cr libtest.a test1.o test2.o
cr是表示创建静态库文件的命令行参数。如果程序app.c中调用了test1.o中的函数,则在将app.c编译成.o文件之后,调用命令:
% gcc -o app app.o -L. –ltest
由于Linux中的静态库文件通常是lib*.a的格式,因而链接器会自动将-ltest补为libtest.a。