dlopen() dlsym()
简而言之,共享对象通过dlopen动态打开动态库的加载完成后,返回一个句柄,通过dlsym定位到你需要执行的函数指针然后可以在程序中使用
功能:打开一个动态链接库
包含头文件:#include
by 董力云 - Linux环境编程 - 2013-03-27 16:43:21 阅读(1492) 回复(0)
glibc-2.9/dlfcn/dlsym.c 里的 __dlsym 的实现调用了__rtld_lock_lock_recursive(GL(dl_load_lock)); __rtld_lock_lock_recursive是宏,跟到一大坨内嵌汇编 GL把dl_load_lock变成了_dl_load_lock 这里感觉完全看不懂了,而且变量也没找到。
int dev_func(char dev_func_name[]) { int res; void *handle; int (*func)(); char *error; handle = dlopen(dev_lib_path, RTLD_LAZY); if(!handle) { LOG(m_event, ERROR, "%s\n", dlerror()); return FAIL; } func = dlsym(handle, dev_func_name); if((error = dlerror()) != NULL) { LOG(m_event, ERROR, "%s\n", error); dlclose(handle); ...
[code]#include
我在.so中有这两个函数: extern "C" { Progress * createInstance() { return new Prog_A; } void destroyInstance(Progress * p) { delete p; } } 然后用Create_t * pfCreate = (Create_t *)dlsym(dp,"createInstance");调用,可是却报函数未实现。这是为什么呢?
使用dlsym可以调用so里面定义的函数,但是我想调用类里面的成员函数怎么办阿? 例如,在so里面有print的函数,我可以使用dlsym(handle,"print")得到这个函数指针, 但是,我定义了class A 里面有个A.print函数,我怎么用dlsym来得到这个函数指针阿?
声明了一个如下类型的函数指针 [code]int (*cmd)(arg1,arg2);[/code] 程序我是这样写的: [code] dp=dlopen(...); cmd=dlsym(dp,“cmd”); [/code] 用g++编译返回错误是: [code] invalid conversion from `void*' to `int (*)(arg1, arg2)' [/code] c++里边应该怎么进行这样的转换?
本帖最后由 testh 于 2012-11-24 15:00 编辑 使用的是alsa-lib-1.0.25,分别编译了x86和arm版本的libasound.so,且在x86上任何运行都正确。 通过分析alsa-lib的源码发现,在snd_pcm_open()内部通过层层调用,在src/dlmisc.c中的snd_dlsym_verify()中有一组dlopen()-->dlsym()的调用,很明显,他们是获取libasound.so本身中可导出的接口的,通过调试发现,使用strace pcm_min 发现段错误就发生在调用dlsym()这个接口里,没有办法再...
rt.我的对象定义和实现都在动态库中。通过dlsym调用其中的对象构造方法创建了对象,之后能否就dlclose()并继续使用对象?还是说一直要等对象销毁后才能dlclose()?