分类: LINUX
2012-06-03 23:30:16
如果应用程序需要加载libfoo.so(注意,名字必须以lib开始), 那么按照第一种方式,我们需要将libfoo.so拷贝到/usr/lib文件夹下,在编译的时候加入-lfoo即可。如果libfoo.so不在/usr/lib文件夹下,则需要编辑/etc/ld.so.conf文件,加入库文件所在目录的路径,然后运行ldconfig命令。
按照第二种方式,可执行程序调用Linux动态加载接口将动态链接库加载到自己的地址空间,并且解析动态链接库中的符号。
与之相关的函数有三个,第一个函数用于加载动态库。
点击(此处)折叠或打开
参数pathname是需要加载的库的路径名,mode有三个可选值:RTLD_LAZY表示未定义的符号是来自动态链接库的代码;RTLD_NOW表示要在dlopen函数返回之前确定所有未定义的符号,如果没有完成,则执行失败。RTLD_GLOBAL则表示动态链接库中定义的外部符号可以被随后加载的库使用。如果执行成功,将返回动态链接库的一个句柄。
动态链接库加载完成后,可以调用dlsym函数获取库中的函数以及定义的符号。
点击(此处)折叠或打开
如果找不到symbol,则返回NULL。
当不需要对动态连接库使用的时候,可以调用dlclose将打开的动态链接库与当前进程断开。只有当动态链接库的引用为0的时候,才会将其卸载。
点击(此处)折叠或打开
另外还有一个比较使用的函数就是dlerror(), 这个函数可以帮助我们打印上次调用dlopen, dlsym的出错信息。
点击(此处)折叠或打开
实例:
foo.cpp:
点击(此处)折叠或打开
点击(此处)折叠或打开
点击(此处)折叠或打开
BigBen_PigBear2012-06-05 22:00:01
Aquester2012-06-04 09:35:40
赞,总结得非常好,另外分享一个:可执行的DSO,请参见博文:http://blog.chinaunix.net/uid-20682147-id-351108.html