3.17 开发一个插件

打开动态链接库

• void *dlopen (const char *filename, int flag);
返回一个操作句柄void *Handle = dlopen (“./libct.so”, RTLD_LAZY);
• RTLD_LAZY:解析动态库遇到未定义符号不退出,仍继续使用
• RTLD_NOW:遇到未定义符号,立即退出
• RTLD_GLOBAL:允许导出符号,后面其它的动态库中可以引用

取动态对象地址

• void *dlsym (void *handle, char *symbol);

根据动态链接库句柄和符号,返回符号对应的地址
一般要定义一个符号类型的指针,保存该符号对应的地址
• void (* funcp) (int , int);
• funcp = (void(*)(int, int )) dlsym(Handle , “myfunc”);

关闭动态链接库

• int dlclose (void *Handle);
该函数将共享库引用计数减一,当引用计数为0时,该共享库
将会从系统中卸载

动态库错误函数

• const chat *dlerror (void);
当动态链接库操作函数失败,dlerror将返回出错信息;没有出
错,则返回值为NULL
系统调用头文件:#include<dlfcn.h>


/* C file */
/************************************************
* Copyright(C) zhaixue.cc. All rights reserved
*
*      Filename: main.c
*        Author: litao.wang
*        E-mail: 3284757626@qq.com
*   Description: 
*        Create: 2017-09-21 06:59:57
* Last Modified: 2017-09-21 07:00:08
************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<dlfcn.h>

typedef int (*cac_func)(int ,int);

int main(void)
{
	void *handle;
	char *error;
	cac_func fp = NULL;

	handle = dlopen("./libct.so",RTLD_LAZY);
	if(!handle)
	{
		fprintf(stderr, "%s\n", dlerror());
		exit(EXIT_FAILURE);
	}

	dlerror();

	fp = dlsym(handle, "add");
	if((error = dlerror()) !=NULL)
	{
		fprintf(stderr, "%s\n",error);
		exit(EXIT_FAILURE);
	}

	printf("add:%d\n",fp(8,2));

	fp = (cac_func)dlsym(handle,"sub");
	printf("sub:%d\n",fp(8,2));

	fp = (cac_func)dlsym(handle,"mul");
	printf("mul:%d\n",fp(8,2));

	fp = (cac_func)dlsym(handle,"div");
	printf("div:%d\n",fp(8,2));


	dlclose(handle);
	exit(EXIT_SUCCESS);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值