-
-
[原创]二.Android ELF系列:实现一个so文件加载器
-
发表于:
2019-2-22 19:28
6937
-
[原创]二.Android ELF系列:实现一个so文件加载器
项目我已经上传到附件里面,先下载对照着看比较好理解.
对于gradle由于不同版本可能在不同的sdk中会存在不同,可能会导致编译失败.解决方法就是
新建一个NDK项目.复制所有cpp目录下的源文件放到新项目下的cpp文件夹.
复制libs下的所有文件.修改app目录下的build.gradle目录添加如下配置
即可.
这个加载器我是直接通过下载Android 4.4系统源码把里面的linker源码抽取出来放到一个新建的ndk项目里面的.
里面的代码没有作任何修改.只是简单的把一些不能跑起来的代码给注释掉了.和增加一些函数.
先上自己写的一个加载so文件的入口函数:
注意到其中有两个变量sostart和soend这两个变量.在linker用于记录已经加载的so文件.所以我们需要把它们给获取到.
还有在调用do_dlopen完成时会调用一个保护函数设置soinfo的内存区域为只读.由于我们加载so文件时对应的soinfo信息的引用(soinfo.ref_count)会加1,所以会涉及到写入的操作.
这个内存区域的信息是通过全局变量gSoInfoPools获取的,所以这个变量我们也需要把其获取到.
gSoInfoPools 的结构为
那么怎么获取那,通过结构可以知道next的下一个结构是soinfo数组.通过分析可以发现somain模块就是在soinfo数组的第0个元素.那么我们通过somain的soinfo信息地址-4就是soinfo_pool_t* next;而且该数组的最后一个元素又指向下一个soinfo_pool_t的soinfo数组的第0个元素.
到这里我们就可以正常调用自己的do_dlopen加载so文件了.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!