动态加载

时间:2023-02-23 21:00:52

动态加载

1、dlopen

#include<dlfcn.h>
void *dlopen(const char * filename, int flags);
功能:将动态库加载到内存。
参数:filename:共享库路径。如果只给定文件的名字。按照动态链接器的搜索路径找动态库文件
LD_LIBRARY_PATH指定的路径下或者默认路径下找
flags:加载方式,可取以下值
RTLD_LAZY - 延迟加载,使用共享库中的符号(如调用库中的函数)时才加载
RTLD_NOW - 立即加载。函数返回的时候,已经加载到内存

返回值:
成功:返回动态库加载到内存的地址
失败:NULL可以使用dlerror(3)函数诊断错误的原因
注意:
动态链接器的API都需要使用到dl动态库文件。所以链接的时候要使用-ldl。


2、dlclose

#include<dlfcn.h>
int dlclose(void *handle);
功能:关闭动态库。仅仅使动态库的引用计数减一,并不一定从内存移除。只有引用计数为0的时候,才从内存移除。
参数:handle:动态库加载到内存的地址。dlopen(3)的返回值返回值 :
返回值:
成功 0
失败 非0 可以使用dlerror(3)诊断错误的原因

3、dleeror

#include<dlfcn.h>
char *dlerror(void);
功能:获取dlopen API的错误信息
返回值:
返回错误原因字符串的首地址
NULL 没有产生错误

4、dlsym

#include<dlfcn.h>
void *dlsym(void *handle,const char * symbol);
功能:从动态库的句柄种找到符号的地址
参数:
handle:动态库加载到内存的地址。dlopen(3)的返回值
symbol:符号的名字。(符号包括函数的名字、全局变量的名字、静态局部变量的名字)
返回值:成功 返回符号的地址
失败 NULL 可以使用dlerror(3)获取错误的原因

实验代码:

动态加载

动态加载

最后加载成功