linux 动态库的加载与调用

下面是加载动态库的一些函数 

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)关闭库函数。类似于打开文件操作最后要关闭文件,这里是关闭动态库。


以上就是加载动态库的全部操作。有误或者有不同想法可交流。大笑大笑

系统的内存管理,虚拟物理地址等明天再写,今天理解不够快哭了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值