动态库优化——Prelink(预连接)技术

来源:互联网 发布:数据挖掘 风险控制 编辑:程序博客网 时间:2024/06/09 22:09
 

PrelinkRed Hat 开发者 Jakub Jelinek 所设计的工具,正如其名字所示,Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。

我们在上一章中详细介绍了动态链接和加载的过程,这种运行时的动态链接尤其是重定位(relocation)的开销对于大型系统来说是很大的。相比之下,早期UNIX下的a.out格式的老式链接方法在速度和占用内存方面有明显的优势(但不如ELF格式更灵活,能方便的构建动态共享库)。Prelink工具是试图在保持一部分灵活性的基础上,借鉴a.out格式在速度和占用内存方面的优点,对ELF文件进行一些改进。

事实上,Prelink工具的原理主要基于这样一个事实:动态链接和加载的过程开销很大,并且在大多数的系统上, 函数库并不会常常被更动, 每次程序被执行时所进行的链接动作都是完全相同的,对于嵌入式系统来说尤其如此。因此,这一过程可以改在运行时之前就可以预先处理好,即花一些时间利用Prelink工具对动态共享库和可执行文件进行处理,修改这些二进制文件并加入相应的重定位等信息,节约了本来在程序启动时的比较耗时的查询函数地址等工作,这样可以减少程序启动的时间,同时也减少了内存的耗用。

Prelink的这种做法当然也有代价:我们每次更新动态共享库时,相关的可执行文件都需要重新执行一遍Prelink才能保证有效,因为新的共享库中的符号信息、地址等很可能与原来的已经不同了。这种代价对于嵌入式系统的开发者来说可能稍微带来一些复杂度,不过好在对用户来说几乎是可以忽略的。

更多有关Prelink的具体做法和细节读者可以参考Prelink的开发者 Jakub Jelinek的专文介绍:http://people.redhat.com/jakub/prelink/prelink.pdf

很多Linux的发行版上已经预装了或者已经使用了Prelink工具,不过我们需要专门的针对嵌入式体系,比如ARM的版本,这样我们需要到Red Hat的网站下载源代码并重新编译。下载地址是:http://people.redhat.com/jakub/prelink/

编译时主要是configure时设定--host参数,注意它是一个用于主机而不是开发板上的工具,不要用arm-linux-gcc编译它,如下所示:

# ./configure --prefix=/opt/tools/arm/prelink --host=arm-linux

# make

# make install

Prelink工具的使用非常简单,对一个系统来说可能要花几分钟或者十几分钟。一般来说我们不用在命令行中直接指定ELF文件的方式,而是将需要Prelink的文件写到配置文件/etc/prelink.conf中,然后使用下面的命令即可:

# prelink -avmR

如果你要取消已经做了的Prelink也非常简单,运行:

# prelink -au

Prelink常用的选项含义如下:
-a
对所有的文件进行Prelink,包括/etc/prelink.conf文件中指定目录下的所有程序
-m
节省虚拟定址分配,在有许多程序需要连接时使用
-f
重新强制预连接已经连接的程序,主要用于更新连接数据时使用
-R
在给库指定地址时,使用随机地址,这有利于提高系统安全以防缓冲区溢出
-u
取消已做的预连接

下面是一份/etc/prelink.conf文件的示例:

    # This config file contains a list of directories both with binaries

    # and libraries prelink should consider by default.

    # If a directory name is prefixed with `-l ', the directory hierarchy

    # will be walked as long as filesystem boundaries are not crossed.

    # If a directory name is prefixed with `-h ', symbolic links in a

    # directory hierarchy are followed.

    # Blacklist specification should be prefixed by -b

# and optionally also -l or -h if needed.

    -l /opt/lib

    -l /opt/bin

    -l /opt/qte/lib

其中以”#”开头的行为注释,正如注释中所解释的,下面列出的文件目录分别可以有”-l”, “-h””-b”开头,”-l”“-h”区分是否包括符号连接类型的目录,”-b”指黑名单,即应该排除出去的部分。

你可能会在Prelink时遇到类似这样的错误:"Cannot prelink against non-PIC shared library"  这是因为有些库没有使用 -fPIC gcc 选项编译。PICPostion Independent Code,即位置无关代码,是动态链接的一项技术,也是Prelink的前提条件。这种问题只需要用-fPIC重新编译代码就可以了。

根据笔者的经验,如果你的嵌入式系统中动态库过多过慢是系统性能的瓶颈之一,推荐你试试Prelink的方法。在笔者工作的平台上,它是非常行之有效的,让大多数应用的启动时间及系统启动时间都有了显著的提升。

来自:http://www.top-e.org/jiaoshi/html/?165.html
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 文件过大无法复制到u盘怎么办 淘宝账号上不去总说网络不好怎么办 手机上登录微信一直闪退怎么办 京东账号手机号换了登陆不了怎么办 对方账号停止收款我们汇了款怎么办 淘宝店铺严重违规被扣12分怎么办 中国网银登陆不会自动弹出怎么办 高考报考的时候页面无法显示怎么办 如果卖家收到货不退款怎么办 淘宝退货卖家收到货不退款怎么办 手机号码淘宝被注册跟换绑定怎么办 微信发送ppt显示文件太大怎么办 微信手机号丢了微信登不了钱怎么办 新买的号码注册过支付宝怎么办 新买的号码被注册过支付宝怎么办 支付宝同号码注册了新的帐号怎么办 新卖的号码有人注册过支付宝怎么办 我的号码被别人注册了支付宝怎么办 别人用我的号码注册了支付宝怎么办 打开支付宝进入到淘宝的界面怎么办 我的手机号注销了支付宝账号怎么办 微博绑定的支付宝账号注销了怎么办 闲鱼买家申请退款卖家不同意怎么办 微信与手机旧版本不一致怎么办 在应用宝里下载微信老是失败怎么办 使用u盘储存视频显示不兼容怎么办 支付宝下载显示与存在不兼容怎么办 cpu与64位系统不兼容怎么办 微信版本低登录不了怎么办苹果手机 手机版本低登录不了微信怎么办? 进入微信公众号显示登录失败怎么办 安卓系统手机亮度调到最低怎么办 阿里妈妈买家号虚假交易违规怎么办 淘宝商让我修改追评叫我怎么办 红冲金额大于了当月的销售额怎么办 淘宝买家号虚假交易评价删除怎么办 淘宝卖的宝贝电话写错了怎么办 邮政快递都揽件了一直不运输怎么办 应用宝里面的安装包安装不了怎么办 苹果平板电脑充电接口坏了怎么办 读书郎平板电脑开不了机怎么办