下面是加载动态库的一些函数
SYNOPSIS
#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
Link with -ldl.
首先还是创建函数(函数和昨天创建静/动态库的函数一样) : 查看函数
然后我们创建动态库: gcc -c -fPIC test.c test1.c
gcc -shared -o libhaha.so test.o test1.o
生成了动态库,然后使用命令 gcc main.c -L. -lhaha 来链接动态库生成a.out 文件
然后使用export LD_LIBRARY_PATH=. 来设置系统查找动态库的路径
以上操作完成了动态库的制作。接下来创建一个新的函数:vi new.c函数内容如下:
1 #include<stdio.h>
2 #include <dlfcn.h>
3 typedef int (*new)(int,int);
4 int main(void){
5 int flag=RTLD_LAZY;
6 void *p=dlopen("libhaha.so",flag);
7 if(p==NULL){
8 printf("open file fails...\n");
9 printf("%s\n",dlerror());
10 return -1;
11 }
12 new a=dlsym(p,"func");
13 new b=dlsym(p,"func1");
14 printf("9+5=%d\n",a(9,5));
15 printf("9*5=%d\n",b(9,5));
16 dlclose(p);
17 p=NULL;
18 return 0;
19 }
然后gcc new.c -ldl 结果如下:
tarena@ubuntu:~/LIANXI/10.10$ export LD_LIBRARY_PATH=.
tarena@ubuntu:~/LIANXI/10.10$ gcc new.c -ldl
tarena@ubuntu:~/LIANXI/10.10$ ./a.out
9+5=14
9*5=45
可以看到我在new函数中通过dlopen函数调用了libhaha.so 动态库,使用了里面的函数。
下面说明一下函数的用法:
首先
3 typedef int (*new)(int,int);
这一行的意思是 声明一个指针型的变量new,它的访问方式是int(int,int)函数型的。(因为我们的func函数就是int(int,int)型的)。typedef是给它起了个别名。
void *p=dlopen("libhaha.so",flag);
上面一行的意思是生声明一个void型指针。因为dlopen函数的返回值为所打开的动态库的指针,dlopen函数的格式为:dlopen("动态库",flag)
flag的设置查看手册 RTLD_LAZY ,RTLD_NEW 二选一 前者表示懒连接:程序运行时,需要动态库中的函数时,才会加载动态库到内存中。 后者表示程序一运行就加载动态库到内存中。
printf("%s\n",dlerror());
如果打开动态库失败会返回NULL ,dlerror()函数为找到最近运行的dl函数的错误信息,返回值为一个字符串的地址。
12 new a=dlsym(p,"func");
13 new b=dlsym(p,"func1");
上面的函数表示声明一个指针变量a ,它的访问方式为int(int,int)型。 disym(p,"func")函数的意思是调用p指向的库里的函数,获取“func”函数的地址。因为返回的为地址所以在typedef时要在new前加*。
最后dlcose(p)关闭库函数。类似于打开文件操作最后要关闭文件,这里是关闭动态库。
以上就是加载动态库的全部操作。有误或者有不同想法可交流。
系统的内存管理,虚拟物理地址等明天再写,今天理解不够