欢迎来到天天文库
浏览记录
ID:9381830
大小:20.61 KB
页数:41页
时间:2018-04-29
《为linux应用程序编写dll》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、为Linux应用程序编写DLL为Linux应用程序编写DLL来源:ChinaUnix博客 日期:2009.07.1515:57 (共有0条评论)我要评论Linux动态链接Linux中的应用程序以以下两种方式之一链接到外部函数:要么在构建时与静态库(lib*.a)静态地链接,并且将库代码包含在该应用程序的可执行文件里;要么在运行时与共享库(lib*.so)动态地链接。通过动态链接装入器,将动态库映射进应用程序的可执行内存中。在启动应用程序之前,动态链接装入器将所需的共享目标库映射到应用程序的内存,或者使用系统共享的目标并为应用程序解析所需的外部引用。现在应用程序就可
2、以运行了。作为示例,下面有一个演示Linux中对动态链接库的缺省使用的小程序:main(){printf("Helloworld");}当使用gcc编译hello.c时,就创建了一个名为a.out的可执行文件。通过使用Linux命令ldda.out(该命令打印出共享库的相互依赖性),可以看出所需的共享库是:libc.so.6=>/lib/libc.so.6(0x4001d000)/lib/ld-linux.so.2=>/lib/ld-linux.so.2(0x40000000)使用相同的动态链接装入器在应用程序运行之后将dll映射进
3、应用程序的内存。通过使用Linux动态装入器例程,应用程序控制装入哪一个动态库以及调用库中的哪一个函数,以执行装入和链接以及返回所需入口点的地址。回页首Linuxdll函数Linux提供4个库函数(dlopen,dlerror,dlsym和dlclose),一个include文件(dlfcn.h)以及两个共享库(静态库libdl.a和动态库libdl.so),以支持动态链接装入器。这些库函数是:dlopen将共享目标文件打开并且映射到内存中,并且返回句柄dlsym返回一个指向被请求入口点的指针dlerror返回NULL或者一个指向描述最近错误的ASCII字符串的指
4、针dlclose关闭句柄并且取消共享目标文件的映射动态链接装入器例程dlopen需要在文件系统中查找共享目标文件以打开文件并创建句柄。有4种方式用以指定文件的位置:dlopencall中的绝对文件路径在LD_LIBRARY_PATH环境变量中指定的目录中在/etc/ld.so.cache中指定的库列表之中先在/usr/lib之中,然后在/lib之中回页首dll示例:小的C程序和dlTest动态链接装入器示例程序是一个小的C程序,该程序被设计用来练习dl例程。该程序基于每个人都编写过的一个C程序,它将“HelloWorld”打印到控制台上。最初打印的消息是“HeLl
5、OWoRlD”。该测试程序链接到再次打印该消息的两个函数上:第一次都用大写字符,第二次都用小写字符。以下是该程序的概要:定义dllinclude文件dlfcn.h和所需的变量。至少需要这些变量:到共享库文件的句柄指向被映射函数入口点的指针指向错误字符串的指针打印初始消息,“HeLlOWoRlD”。使用绝对路径“/home/dlTest/UPPERCASE.so”和选项RTLD_LAZY,dlopen打开UPPERCASEdll的共享目标文件并返回句柄。选项RTLD_LAZY推迟解析dll的外部引用,直到dll被执行。选项RTLD_NOW在dlopen返回之前解析所
6、有的外部引用。dlsym返回入口点printUPPERCASE的地址。调用printUPPERCASE并且打印修改过的消息“HELLOWORLD”。dlclose关闭到UPPERCASE.so的句柄,并且从内存中取消dll映射。dlopen使用基于环境变量LD_LIBRARY_PATH的相对路径查找共享目标路径,来打开lowercasedll的共享目标文件lowercase.so,并且返回句柄。dlsym返回入口点printLowercase的地址。调用printLowercase并且打印修改过的信息“helloworld”。dlclose关闭到lowercase
7、.so的句柄,并且从内存中取消dll映射。注意,每次调用dlopen、dlsym或dlclose之后,调用dlerror以获取最后的错误信息,并且打印该错误信息字符串。以下是dlTest的测试运行:dlTest2-OriginalmessageHeLlOWoRlDdlTest3-OpenLibrarywithabsolutepathreturn-(null)-dlTest4-FindsymbolprintUPPERCASEreturn-(null)-HELLOWORLDdlTest5-printUPPERCASEreturn-(null)-dlTest6-Clos
8、ehand
此文档下载收益归作者所有