android 加载动态库 分析

最近在移植代码的时候,出现一个问题,加载动态库失败。之前是没有问题的,查了很多资料,发现是因为这个动态库所信赖的另外一个动态库发生了变化导致的。

通过这次的解bug过程,我对动态库的生成与加载有了更深一层次的了解,在此做下总结。

1、因为要跟踪加载过程,所以要在bionic打印log,所以还要设置一下,代码更改如下:

//1.linker_debug.h中的#define LINKER_DEBUG和#define TRACE_DEBUG都改为1。当然也可以在Android.mk里添加
//2.linker.c中的
#define HOODLUM(name, ret, ...)                                               \
    ret name __VA_ARGS__                                                      \
    {                                                                         \
        char errstr[] = "ERROR: " #name " called from the dynamic linker!\n"; \
        write(2, errstr, sizeof(errstr));                                     \
        abort();                                                              \
    }
HOODLUM(malloc, void *, (size_t size));
HOODLUM(free, void, (void *ptr));
HOODLUM(realloc, void *, (void *ptr, size_t size));
HOODLUM(calloc, void *, (size_t cnt, size_t size));
//这一段注释掉。
//3.Android.mk中的
LOCAL_STATIC_LIBRARIES := libcutils libc_nomalloc
//改成
LOCAL_STATIC_LIBRARIES := libcutils \
                          libc
//4.重新编译linker,上传到模拟器或实际设备,export DEBUG=3,然后执行命令就看到linker输出的log了。

详见:如何让android的bionic中的linker输出调试信息

2、加载某个库失败了,不一定是这个库导致的,也可能是这个库所信赖的库加载失败了。在加载一个库的时候,会先加载其所依赖的库,这些信息都写在.so文件里。

所依赖的库,在Android.mk里有体现:

LOCAL_SHARED_LIBRARIES += liblog
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libcamera

这就说明了,在编译时会把liblog.so写进生成的.so文件的依赖库列表里。当然,你加上<cutils/log.h>头文件,就可以在代码里调用liblog.so里的函数了。

可在 Android.mk 中设置该库是否需要 Prelink ,默认是使用 Prelink 的,也可设置成否,方法如下: 
LOCAL_PRELINK_MODULE := false

详见:Android PreLink 技术简介  Android学习之--prelink

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值