关于dlopen函数分析

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结构分配内存

你可能感兴趣的:(关于dlopen函数分析)