void* dlsym(void* handle, const char* symbol)
获得symbol
对应的地址。
void* handle
是dlopen函数的返回值。
const char* symbol
是符号(变量名、函数名)。
返回symbol
对应的地址。
step1、编写一个C源程序add.c
,其内容如下
int add(int a, int b) {
return a + b;
}
step2、使用gcc命令将add.c
编译为动态库
gcc -shared -fPIC -o libadd.so add.c
step3、编写一个C源程序main.c
,其内容如下
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char* argv[]) {
if (1 == argc) {
perror("please provide a library path");
return 1;
}
void* handle = dlopen(argc[1], RTLD_LAZY);
if (NULL == handle) {
printf("load %s error, %s\n", argc[1], dlerror());
return 1;
}
printf("load %s success.\n", argc[1]);
int (*add)(int a, int b);
add = dlsym(handle, "add");
int value = add(2, 3);
printf("add(2, 3) = %d\n", value);
int statusCode = dlclose(handle);
printf("unload %s %s!\n", argc[1], statusCode ? "failed" : "success");
return statusCode;
}
step4、使用gcc命令将mian.c
编译为可执行文件
gcc -o main main.c
step5、运行main
可执行文件
./main libadd.so
运行结果如下:
load libadd.so success.
add(2, 3) = 5
unload libadd.so success.
source code on GitHub