file:
maic.c
plugin_a.c
Makefile
main.c:
#include <stdio.h>
#include <dlfcn.h>
#define PLUGIN_NAME "./plugin.so"
#define FUNC_NAME "func"
int main()
{
int ret = 0;
void *flib = NULL;
char *err_info = NULL;
int (*pfunc)(int a, int b);
printf("this plugin test!\n");
flib = dlopen(PLUGIN_NAME, RTLD_LAZY);
err_info = dlerror();
if(err_info != NULL)
{
printf("dlopen er, err:[%s]\n", err_info);
return 1;
}
*(void **)(&pfunc) = dlsym(flib, FUNC_NAME);
err_info = dlerror();
if(err_info != NULL)
{
printf("dlsym er, err:[%s]\n", err_info);
return 1;
}
ret = pfunc(1, 2);
printf("result:[%d]\n", ret);
dlclose(flib);
err_info = dlerror();
if(err_info != NULL)
{
printf("dlclose er, err:[%s]\n", err_info);
return 1;
}
return 0;
}
plugin_a.c:
int func(int a, int b)
{
return a + b;
}
Makefile:
EXEC=test
all: plugin.so
gcc -o $(EXEC) main.c -ldl
plugin.so: plugin.o
gcc -shared -lc -o plugin.so plugin.o
plugin.o:
gcc -c -fpic plugin_a.c -o plugin.o
clean:
-rm -f $(EXEC) *.elf *.gdb *.o *.so