动态链接库的地址是浮动的,函数库一般是只读的,不能在运行过程中修改,如果要改变功能,你可以实现多个库,需要哪个加载哪个就成了。
1、通过函数名查找地址 2、地址肯定要变化,每次加载位置不同,修改后偏移也不同,不能假定地址不变,变是一定的。
**************************** * 嵌入式动态链接库技术浅谈 * **************************** 2009/04/21 asdjf@163.com www.armecos.com
在VB、VC程序里使用DLL动态链接库,用户不必看到源码或者链接整个库就可以进行二次开发,现在,我想在嵌入式系统里实现类似功能,也能用DLL库的方式为我的用户提供二次开发产品,比如:在EASTARM2200/SMARTARM2200上能实现吗?
很多《增值包》用户希望在自己的产品中实现动态链接库,动态地加载函数库,在运行时刻链接,方便用户二次开发,不用重新编译整个程序,只需编译改动部分,就能升级系统。如此美妙的功能,《增值包》可以实现吗?当然没有问题了!有了此项功能,你就可以象在Linux里那样,在命令行输入“./myprog”运行你硬盘上的应用程序了,输入不同的文件名运行不同的程序,支持多个程序并发哦。
---------------- 动态链接库的好处 ---------------- 动态链接库的好处可多了,例如:当你升级一个系统的时候,可以只升级一个模块,而不必升级整个系统。你可以把不同的模块放在不同的介质上,并实施不同等级的保护,例如存放在flash里进行写保护。
有些系统允许用户进行二次开发,这个时候几乎一定是需要动态链接库的,因为你不希望用户需要链接整个系统才能够进行二次开发,而且你可能希望支持多个用户模块,彼此不相互依赖,彼此不相互干扰。用户程序和DLL库可以分别开发,运行时刻才链接到一起,修改更新升级DLL库,不用重新编译用户应用程序。其实,这样已经有组件化开发的雏形了,如果再符合接口调用标准,那就真的很象COM(组件对象模型)了。使用组件开发软件产品具有很多优点: 1、组件易替换------在庞大复杂的企业级应用程序中,如果使用组件技术将程序分成一个个组件模块,在进行程序修改或版本升级时,就可以只修改或替换相关的组件,而不影响其他众多的程序组件。 2、适应业务需求更改------软件的业务需求通常象流水一样不确定,开发期间和软件配置之后,新的需求会不断涌现。在组件软件中,可以将业务规则放在少数几个组件中。当业务规则发生改变时,只需要修改原组件或重建并发布新组件即可。更新是局部的,程序中出错的机会也就限制在这个局部,使程序的调试和测试更为方便。 3、可实现二进制代码重用------组件之间可以在二进制级别上进行集成和重用,这样一来只需一次编写代码就可以到处使用(类似java)。例如:可以建立一个处理所有字符串函数的组件,任何应用程序都可以使用这个字符串处理组件。以后对这个组件进行任何纠正和修改,也不必改变使用这个组件的应用程序。 4、有助于并行开发------一个大应用系统由许多组件组成,这些组件的实现可以并列进行。比如:应用可能包含一个字符串处理组件、一个计算组件和一个数据读取组件,这些组件可以同时建立,只要接口设计正确,则建立这些组件之后他们将能顺利配合。 可以实现类似DOS/Linux那种命令行启动程序功能,在命令行输入“./myprog”就可以运行硬盘根目录上的myprog应用程序。 动态链接库只在用到时才加载到内存,不需要时可以卸载,节省内存资源。 -------------------- 动态链接库的使用方法 -------------------- 假设开发了一个动态链接库mylib,里面有一个foo函数,现在要求动态加载函数库mylib,并找到foo函数的地址,然后执行此函数。
//从存储介质(硬盘/CF卡/SD卡/flash)上读取动态链接库文件 err = mount( "", "/", "ramfs" );//挂装根目录到flash介质上 fd = open("./mylib",O_RDONLY);//只读方式打开动态链接库文件mylib len = read(fd, libfoo, len);//读取动态链接库至内存,只有用到的库才加载到内存,以便节省资源。
void *fooh = dlopenmem( libfoo, len, RTLD_NOW );//打开动态链接库libfoo
vfn *foo = (vfn *)dlsym( fooh, "foo" );//从动态链接库里找到foo函数的地址 if( foo ) { CYG_TEST_INFO( "LoadFoo: foo() call" ); foo(); //执行动态链接库里的foo函数 CYG_TEST_INFO( "LoadFoo: foo() returned" ); } else { CYG_TEST_FAIL_FINISH( "LoadFoo: foo() NULL!!!" ); } 现在你就可以用《增值包》开发动态链接库了,很简单吧! 你可以一次开发若干版本的库,用户需要哪个版本就加载哪个版本,如果需要升级更新,只要向用户提供新的替代库即可,用户应用程序不必做任何改变。可以把库保存到各种介质上,如:硬盘、CF卡、SD卡、flash等,保存到flash上的库自然就有写保护功能喽。你可以把需要不同权限的库保存到不同介质上。用户不必看到源码或者链接整个库就可以进行二次开发,太方便了不是吗!
|