1 , 前言
之前在鹅厂面试过程中,与面试官聊到操作系统方面 ,让我谈谈一些理解 ,面试官提到dlopen 脑子一片空白,平时这些东西真的很少接触,所以在专注于一点时,还是要多了解一些,部分要精! 共勉
2,什么是dlopen ? dlsym ? dlclose ?
其实就是Linux提供的加载和处理动态链接库的系统调用,为了使程序更加方便扩展。
在Linux上 在#include<dlfcn.h>头文件下
#include <dlfcn.h> void *dlopen(const char *filename, int flag); char *dlerror(void); void *dlsym(void *handle, const char *symbol); int dlclose(void *handle);
简答介绍一下这几个函数
- dlopne 以指定模式打开指定动态库链接文件,返回一个可操作句柄
- dlsym 通过句柄和连接符名称获取函数名或者变量名
- dlerror 返回出现的错误
- dlclose 通过句柄卸载加载的动态库
在dlopen 函数的参数 flag 分为 : 1 RTLD_LAZY 暂缓决定,等有需要时再解出符号. 2 RTLD_NOW 立即决定,返回前解除所有未决定的符号。
- RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析(只对函数引用有效,对于变量引用总是立即解析)
- RTLD_NOW:需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在dlopen会返回NULL,错误为:: undefined symbol:x x x x