//say.c
#include <stdio.h>
int say(char **str){ printf("%s\n",str);
}
|
将say.c 生成共享库的编译:
gcc -o dlopen.so -shared say.c
//使用dlopen函数动态加载库的源代码
/** * Filename: mydlopen.c * Author: lijunjie */ #include <stdio.h> #include <dlfcn.h> #include <unistd.h>
void show_help(char *msg){ if(msg == NULL){ printf("Usage:mydlopen dlopen.so say stringtosay\n"); }else{ printf("%s\n",msg); } exit(1); } int main(int ac,char ** av){
if(ac < 3){ show_help(NULL); } void *handle; //void *pfunc;
int (*pfunc)(char *str); char * filename = av[1]; char * func = av[2]; char * word = av[3]; char * error; handle = dlopen(filename,RTLD_LAZY); if(!handle){ printf("Error: handle\n"); return 1; }
pfunc = (int (*)(char *))dlsym(handle,func); if((error=dlerror()) != NULL){ printf("Error: dlsym\n"); return 2; } (*pfunc)(word);
dlclose(handle); return 0;
}
|
//编译命令:
gcc -o mydlopen mydlopen.c -ldl
注意事项:
1.dlsym返回的指针是无类型的,要转换的指定的函数的类型。
2.使用函数指针时的写法: (*pfunc)(word); 不能直接写成 pfunc(word);会段错误的
3.C还不支持默认参数,写show_help时不能给msg以NULL的默认值
3.编译时要使用共享库dl 其中有dlopen dlsynm dlerror dlclose 函数
使用命令:
./mydlopen ./dlopen.so say aaaabbbdddd
阅读(871) | 评论(2) | 转发(0) |