![](https://csdnimg.cn/release/download_crawler_static/9663685/bg3.jpg)
si = load_library(name, dlflags, extinfo); // 继续 SO 的加载流程
}
if (si != NULL && (si->flags & FLAG_LINKED) == 0) {
DL_ERR("recursive link to \"%s\"", si->name);
return NULL;
}
return si;
}
find_library_internal 首先通过 find_loaded_library_by_name 函数判断目标 SO
是否已经加载,如果已经加载则直接返回对应的 soinfo 指针,没有加载的话则调用
load_library 继续加载流程,下面看 load_library 函数。
3. load_library
static soinfo* load_library(const char* name, int dlflags, const Android_dlextinfo* extinfo) {
int fd = -1;
...
// Open the file.
fd = open_library(name); // 打开 SO 文件,获得文件描述符 fd
ElfReader elf_reader(name, fd); // 创建 ElfReader 对象
...
// Read the ELF header and load the segments.
if (!elf_reader.Load(extinfo)) { // 使用 ElfReader 的 Load 方法,完成 SO 装载
return NULL;
}