dlopen() dlsym()
简而言之,共享对象通过dlopen动态打开动态库的加载完成后,返回一个句柄,通过dlsym定位到你需要执行的函数指针然后可以在程序中使用
功能:打开一个动态链接库
包含头文件:#include
by 董力云 - Linux环境编程 - 2013-03-27 16:43:21 阅读(1492) 回复(0)
学习使用dlopen等函数动态加载函数,测试程序如下:
#include
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); ...
关于函数的介绍,概念性的东东,自己看man [root@kenthy study]# cat dlopen.c #include stdio.h> #include stdlib.h> #include dlfcn.h> int main(int argc, char **argv) { void *handle; double (*cosine)(double); char *error; handle = dlopen ("libm.so", RTLD_LAZY); if (!handle) { fprintf (stderr, "%s\n", dlerror()); exit(1); } dlerror(); /* Clear any existing error ...
我的程序大体框架是这样的: 我把dll.cpp用-shared选项编译成dll.so,在dll.cpp当中引用了静态库libA.a当中的符号。然后dll.so是在main当中用dlopen打开的。 编译和链接都没有问题,但是在运行的时候会报如下的错误: ./dll.so: undefined symbol: _ZN1AC1EiSegmentation fault 所以我猜想可能是我在动态库中引用了静态库中的符号的缘故(参见Makefile中g++ -shared -L. -lA -o dll.so dll.cpp)。 请大家帮我看看怎么办呢? 应...
dlopen返回NULL dlerror返回字符串为 [code] 0509-022 Cannot load test.so. 0509-103 The module has an invalid magic number.] [/code]
如何用g++ 生成一个动态库,可以被dlopen调用? 用g++生成使用dlopen的可执行文件用什么选项?? 能否讲一下共享库和动态库的区别? (创建时的区别?使用方式上的区别?效率上的区别和不同的使用范围?) 谢谢!!!!
[code]#include
都知道dlopen可以用来显式加载.so,但是我有个疑惑 加载程序时,系统自带的动态链接器不会先去查找并加载这个.so吗? 如果动态链接器找不到会报错的阿? 是什么原因,导致动态链接器不去查找并加载,而等到程序运行到特定dlopen时才去加载呢?