- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态链接库的原理及使用
动态链接库的原理及使用
动态链接库的原理及使用
2007-09-12 08:51:28
一. 动态链接库的原理及使用
大家对Windows操作系统中的DLL文件一定十分熟悉,其实这种软件组件化的方法在Linux中也可以实现。其实插件和 DLL 通常是用来无须编写整个新应用程序而添加功能的极好方法,一般来讲,在不更改原有应用程序的情况下,插件为现有应用程序提供新功能。Linux环境下甚至做的更好。
Linux提供4个库函数、一个头文件dlfcn.h以及两个共享库(静态库libdl.a和动态库libdl.so)支持动态链接。
? dlopen:打开动态共享目标文件并将其映射到内存中,返回其首地址
? dlsym:返回锁请求的入口点的指针
? dlerror:返回NULL或者指向描述最近错误的字符串
? dlclose:关闭动态共享文件
函数dlopen需要在文件系统中查找目标文件并为之创建句柄。有四种方法指定目标文件的位置:
? 绝对路径
? 在环境变量LD_LIBRARY_PATH指定的目录中
? 在/etc/ld.so.cache中指定的库列表中
? 在/usr/lib或者/lib中
下面举一个例子。
主程序文件hello.c:
#include stdio.h
#include dlfcn.h
void* slib=0;
void (*func)(char*);
const char* hError;
int main(int argc,char* argv[])
{
slib=dlopen(./slib.so,RTLD_LAZY);
hError=dlerror();
if (hError)
{
printf(dlopen Error!\n);
return 1;
}
func=dlsym(slib,func);
hError=dlerror();
if (hError)
{
dlclose(slib);
printf(dlsym Error!\n);
return 1;
}
func(How do you do?\n);
dlclose(slib);
hError=dlerror();
if (hError)
{
printf(dlclose Error!\n);
return 1;
}
return 0;
}
函数dlopen的第二个参数有两种选择:
? RTLD_LAZY:推迟解析DLL中的外部引用,直到DLL被执行
? RTLD_NOW:在返回之前解析所有的外部引用
以下是DLL文件源码slib.c:
int func(char* msg)
{
printf(func be Executed!\n);
printf(msg);
return 0;
}
是不是很简单?
源代码写好后,在编译和链接时有点复杂。为此,我们编写了一个makefile:
all:hello slib.so
hello:
gcc -o hello hello.c -ldl
slib.so:slib.o
gcc -shared -lc -o slib.so slib.o
slib.o:
gcc -c -fpic slib.c
生成这个程序需要三步:
? 将DLL编译为位置无代码
? 创建DLL共享目标文件
? 编译主程序并与DLL相链接
编译slib.c时,使用了-fpic或者-fPIC选项,使生成的代码是位置无关的,因为重建共享目标库需要位置无关,并且这类代码支持大的偏移。
创建DLL共享目标文件时使用了-shared选项,该选项产生适合动态链接的共享目标文件slib.so。
生成主程序时,使用-ldl选项,这是链接选项,即主程序中的部分符号为动态链接库中的符号,也就是说,在运行时需要到dll文件中才能够解决引用。
二. 通用类型的动态函数库的建立
Linux操作系统和各种软件包为软件开发人员提供了很多的动态函数库文件。但是一般情况下这些库还不能满足用户的所有需求。开发人员会根据自己的需要编写很多的函数。对于这些函数,如果总是将源文件与调用它们的程序链接起来,虽然也
您可能关注的文档
最近下载
- 企业文化建设及实施方案.docx VIP
- 20171010《初识人工智能》说课.pptx VIP
- 经营管理培训课件.pptx VIP
- 《多媒体技术基础》课件.pptx VIP
- 安全风险管控及隐患排查治理全套台账清单.doc
- 惠阳区惠阳水厂二及管网配套工程环境影响评价文件情况点击环评报告.pdf VIP
- 《经营管理培训》课件.pptx VIP
- Office 2016 办公软件高级应用全书电子教案完整版课件最全ppt整本书教学教程最新讲义.pptx VIP
- 2025秋新版本-人教版二年级数学上册全册PPT课件.pptx
- 部编小学语文六年级上册第二单元《革命岁月》集体备课教材分析解读.pptx VIP
文档评论(0)