Android学习之--prelink

最近移植一些既存的c程序到android中,不可避免的需要了解ndk,jni之类的东西,编译体系,toolchain之类的东西。偶尔,发现了Android中的src中有一个叫做LOCAL_PRELINK_MODULE的参数,它是Android采用的加快一些系统的函数库加载速度的手段。

因为对这个比较感兴趣,就稍微去了解了一下。


首先,需要了解一下什么是prelink

由RedHat的大牛Jakub Jelínek所发布的开源程序。通过修改ELF的可执行文件预先计算出函数库的relocation的信息,来加速系统对于被prelink处理过后的函数库的加载速度。


详细可以参考一下资源:

http://people.redhat.com/jakub/prelink/prelink.pdf

http://jserv.blogspot.com/2010/10/android.html这篇是台湾同胞写的,因为发布在blogspot上而悲惨的被墙了,所以在本文最后贴出来方便大家查看。


接着,就看看Android中什么地方使用到了

以下是Android的开发这David Turner在邮件列表中对于一个开发者的疑问的回答(原文链接):

Android使用了一个定制的prelinker tool来降低系统库的大小和加载速度(通过预先指定可执行文件使用到的动态库的location地址配合定制的linker来完成)。它的回答中提到了,Android中使用的linker也是定制过的,没有完全实现一些ELF所规定的relocations相关的功能。这就会导致如果用其它的toolchain编译出的动态库如果用了一些Android的linker所不支持的特性,有可能就会出奇怪的问题。如果你用了其它的toolchain编译了一些动态库,导致在android上链接失败,最好还是使用android提供的toolchain。(从linker和两个prelink工具的代码看,默认的android执行的linker是在/system/bin/linker)

           grep了一下android源代码,发现只有编译dalvik时会根据是否是模拟器来显示开启这个选项,而其它的库都默认是打开prelink的。

                    mydroid/bionic/linker/README.TXT文件中对Android中的prelink做了一些描述:android默认对所有系统的库都会进行prelink,一旦有新的库被加入或者更改时,需要重新更新prelink-linux-xxx.map的文件,android提供了定制的apriori和soslim(在使用)两个工具在build的时候进行相应的prelink动作。

                    主要由apriori(代码在mydroid/build/tools/apriori/下)和soslim(代码在mydroid/build/tools/soslim/)配合完成prelink的动作

                    dalvik/vm/Android.mk:    LOCAL_PRELINK_MODULE := true

                    同时,build/core/prelink-linux-arm.map是关键的一个配置文件。

                    查看dalvik的代码,在Native.c的注释中,有关于dalvik中使用dynamic library的一些注意事项

          

最后,作为开发者我们可以如何使用它

           适用于Android的系统开发者,用来定制系统级的动态库,加速定制的android的系统的启动及加载速度。

           由于嵌入式设备尤其是android设备,目前的升级比较频繁,一旦prelink过的库函数修改过了,要求所有引用该库函数的可执行文件也要被重新编译。这就要求系统开发者谨慎的修改系统代码,毕竟每次OTA升级的代价还是很大的。


例子:

         让我们以系统的一个可执行文件,service为例(mydroid/out/target/product/generic/system/bin/service)

         使用readelf dump出该可执行elf文件的信息,可以看到.interp这个section,并发现它是指向/system/bin/linker这个定制化的android的连接器。为什么这里会有.interp这个section,主要是因为它的Dynamic Setction明确用到了一些库函数,而这些库函数是被prelink过的。

          Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL          

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值