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

转载于:https://my.oschina.net/axes/blog/315486

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值