Android 版本:android-8.0.0_r4
目的[x] elf的加载过程
[x] 在so加载过程中确定依赖库先被调用construct 还是后调用。
[x] elf 重定位过程做了什么?
过程
System.loadLibrary源码位于:./libcore/ojluni/src/main/java/java/lang/System.java
可以看到然后又调用了Runtime.java的loadLibrary0方法:./libcore/ojluni/src/main/java/java/lang/Runtime.java
这个方法主要有两个作用:
找到lib的全称
调用doLoad加载lib库
首先会判断loader 不为空来执行上面两步,如果为空,则换个方法继续执行上面两步。
拿到库的搜索路径,调用了native 的nativeLoad方法。
native函数在libcore/ojluni/src/main/native/register.cpp,统一注册,
其中我们需要的nativeLoad函数在libcore/ojluni/src/main/native/Runtime.c 文件下
继续跟:
继续跟android::OpenNativeLibrary , system/core/libnativeloader/native_loader.cpp
有两个点,class_loader == NULL , 和非空的情况。 。不晓得这两种是什么情况。。。。大神可以指教下。第一个过程直接走dlopen。第二个过程,走android_dlopen_ext , 两个函数最终都会走到do_dlopen 来打开so 。
find_library内部调用重载函数find_library ,内部的重载函数就是本次分析的重点。
关键函数到位了
最后于 2020-12-31 16:48
被pareto编辑
,原因: 修改标题