使用c++编写和使用.so动态链接库
作者:网络转载 发布时间:[ 2014/6/9 11:19:32 ] 推荐标签:net c++ 动态链接库
3,运行时动态加载.so
动态库的运行时加载时通过一系列由动态链接器(dynamic linker)提供的API来实现的,这几个API的实现都是在libdl.so中的,且相关的声明和常量定义在头文件<dlfcn.h>中。
dlopen():主要用来打开一个.so,并将其加载到进程的地址空间,完成初始化过程,原型如下:
void *dlopen(const char *filename, int flag);
filename:the dynamic library file named by the null-terminated string;对于路径设置为相对路径或路径情形下,dlopen()是如何查找该动态库文件的,这个直接参考man;
flag:用于表示函数符号的解析方式,如:RTLD_LAZY表示使用延迟绑定,只有在函数第一次被使用时才会去绑定,即PLT机制;相对应的为RTLD_NOW表示当模块被加载时即完成所有的函数绑定工作,如果有任何未定义的符号引用的绑定工作无法完成,dlopen都直接返回错误;其他的flag标识可以直接参考man;
返回值是被加载的模块的句柄,该句柄会被其他的几个API使用到,如果加载失败,则返回NULL。
dlsym():通过此函数来找到所需要的符号,定义如下:
void *dlsym(void *handle, const char *symbol);
第一个参数handle是dlopen返回的句柄,第二个参数symbol表示要查找的符号的名字,一个以‘
