dlopen 函数原型:
void* dlopen(const char* filename, int flag);
filename 是elf文件路径
flag 就是各种标志位了
1. 执行流程
dlfcn.cpp 这个文件中 有dlopen的实现
void* dlopen(const char* filename, int flags) {
ScopedPthreadMutexLocker locker(&gDlMutex); // mutex锁
soinfo* result = do_dlopen(filename, flags); // 调用linker.cpp 中的do_dlopen
if (result == NULL) {
__bionic_format_dlerror("dlopen failed", linker_get_error_buffer());
return NULL;
}
return result;
}
根据代码可以看出, 实际上是调用的linker.cpp 中的do_dlopen函数.
linker.cpp 中 do_dlopen函数原型
soinfo* do_dlopen(const char* name, int flags);
do_dlopen中代码流程较多,等有时间在画序列图. 先看重点
打开so文件
int fd = open_library(name);
读取Elf结构
ElfReader elf_reader(name, fd);
if (!elf_reader.Load()) {
return NULL;
}
然后就是给soinfo结构分配内存