0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文了解Prelink的特点和机理

如意 来源:CSDN 作者:CaspianSea 2020-06-20 11:54 次阅读

一、What is Prelink?

1.1 Prelink 简介

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

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

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

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

很多 Linux 发行版上已经预装了或者已经使用了 Prelink 工具,不过我们需要适用于嵌入式平台,比如 ARM 的版本,这样我们需要到下载 Prelink 的源代码并重新编译。

1.2 Prelink 机理

从我们最熟悉的 hello world 程序开始分析:

#include 《stdio.h》

int main(int argc, const char* argv[]) {

printf(“Hello, World!\n”);

return 0;

}

我们知道,printf 是在 c语言运行库 libc 中定义的。如果不使用动态库,也就是使用glibc 的静态库版本,链接到 a.out 中的话,那么 printf 函数的地址在运行之前就是已知的,很简单的一句地址转移就可以完成了。

可是使用动态库的话,在程序编译阶段,我们是无法得知 printf 的函数地址,因为动态库的加载的内存地址是随机的。那么对于动态库的情况,针对 printf 是如何寻址的呢?

在程序启动时,当调用 printf 的时候,程序会将处理权交给 loader,由其负责在进程以及其链接的动态库中查找 printf 的函数地址。由于 loader 不知道 printf 是在哪个动态库,所以它将在整个进程和动态库的范围内查找。更糟糕的是在 C++ 程序中,符号的命名是类名+函数名,这导致在做字符串比较时,往往直到字符串的结尾才能获得结果。

这就导致了,在进程启动过程中,符号查找往往占据了大部分时间。据统计,在 Linux 的 KDE 进程中启动过程中,符号查找表竟占据了进程启动 80% 的时间。有没有办法来改进呢?

如果进程在运行前,就能获知动态库的加载地址,那么函数调用的地址就应该是已知的,我们就可以通过修改执行程序,来避免符号的查找。从而节省进程启动的时间。

实际上 Prelink 正是这么做的。Prelink 最早是在 Redhat 中引用的,用来加速 KDE 的启动速度。那时侯 Prelink 作为系统的一个进程,不定期的启动,对系统中的进程和动态库进行优化,这在系统中进程和动态库不怎么变化的情况下非常有用。

在做 Prelink 时,需要为其指定需要做 Prelink 的进程和动态库的目录。Prelink 需要做以下几件事情:

分析所有的进程和动态库,为每个动态库指定一块唯一的(虚拟)内存地址;

分析进程和动态库中,所有需要重定位的函数、全局变量等,用 loader 进行符号查找,对齐地址进行解析;

修改进程中和动态库的二进制文件;

众所周知,在 32 位 Linux 操作系统上有 4G 的地址空间,3G 以上为操作系统使用,0000000~4000000 归进程的代码段、数据段和堆段使用,从 3G 往下归栈段使用。基本上我们可以认为从 1G~3G 的地址空间可以用来指定动态库的加载地址,地址空间还是很丰富的。

凡事总有万一,如果地址空间不够怎么办呢?Prelink 关于这个问题,做了两个约定:

总是一同出现的动态库,其动态库的加载地址一定不能重叠;

总是不同时间段出现的动态库,其动态库的加载地址可以重叠;

有了这两个约定之后,基本上就可以保证,为每个动态库指定加载地址,从而在运行前就能获知函数和全局变量等符号的地址。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11304

    浏览量

    209503
  • Ha-VIS preLink
    +关注

    关注

    0

    文章

    2

    浏览量

    1577
  • 权重定位
    +关注

    关注

    0

    文章

    2

    浏览量

    1285
收藏 人收藏

    评论

    相关推荐

    了解高性能碳纤维的典型制造工艺及其主要特点

    尽管许多复合材料用户会使用碳纤维,但不少人却不了解碳纤维的制造方法,因为碳纤维生产商会对自己产品的生产方式保守秘密。每个生产商的碳纤维都与其竞争对手的产品不同,而赋予每个品牌标志性特征的加工细节则被
    的头像 发表于 12-06 10:29 185次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b>高性能碳纤维的典型制造工艺及其主要<b class='flag-5'>特点</b>

    了解激光测距传感器

    来源:SonneWay 编辑:感知芯视界 Link 在工业自动化中,激光测距传感器是最常见的传感器之。不过,您对它真的了解吗?本文将让您了解
    的头像 发表于 09-09 09:03 236次阅读

    带你了解半导体公司的各个岗位

    定的了解,能够理解产品的技术特点,并能够与客户就技术问题进行沟通。2.客户沟通,芯片公司的客户通常是其他科技公司,比如电子产品制造商、通信设备制造商等。销售岗位需要与这
    的头像 发表于 08-08 16:28 3486次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>带你<b class='flag-5'>了解</b>半导体公司的各个岗位

    了解MySQL索引机制

    的呢?起静下心来,耐心看完这篇文章吧,干货不啰嗦,相信你定会有所收获。 、索引模型 模型也就是数据结构,常见的三种模型分别是哈希表、有序数组和搜索树。 了解MySQL的朋友已经知
    的头像 发表于 07-25 14:05 295次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b>MySQL索引机制

    带你了解LT8621SXE-M国产原装芯片的特点及适用程序

    LT8621SXE-M优势特点有: 1、SPDIF数字音频输出允许用户连接音频放大器,以获得更好的音频质量和控制。 2、LT8621SXE-M基于HDMI 1.4版本,具有宽范围的自适应均衡功能,是款先进的TMDS开关,为HDMI信号重复,开关和音频提取提供
    的头像 发表于 07-11 10:07 388次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>带你<b class='flag-5'>了解</b>LT8621SXE-M国产原装芯片的<b class='flag-5'>特点</b>及适用程序

    科普 | 了解FPGA

    )、可编程逻辑块(LC)、 完整的时钟管理(CMT)、嵌入块式 RAM(BRAM)、布线资源、内嵌的底层功能单元和专用硬件模块等。 根据赛灵思披露的数据,个 LUT6 等效 1.6 个 LC,
    发表于 07-08 19:36

    带你详细了解工业电脑

    工业计算机或电脑专为处理复杂的工业任务而设计和制造。工业电脑采用工业级组件和坚固外壳制成,并经过严格的可靠性测试,在普通台式计算机无法适应的环境中也能表现出色。工业电脑的基本特点包括:无通风口和无风
    的头像 发表于 06-12 14:24 411次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>带你详细<b class='flag-5'>了解</b>工业电脑

    晶闸管的失效模式与机理

    电路性能下降甚至系统瘫痪。因此,深入了解晶闸管的失效模式与机理,对于提高电路设计的可靠性具有重要意义。本文将从晶闸管的基本原理出发,详细探讨其失效模式与机理,并结合相关数字和信息进行说明。
    的头像 发表于 05-27 15:00 1241次阅读

    get面阵工业相机

    快速了解面阵工业相机
    的头像 发表于 04-17 16:09 632次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>get面阵工业相机

    带你了解NVIDIA Jetson

    计算机发展成为今天的机器有着悠久的历史,今天看到的许多计算机都遵循类似的设计结构,至少包含CPU、GPU、内存和存储。迄今为止,我们对计算机设计的了解大部分都是基于这些使计算机正常运行的关键组件
    的头像 发表于 04-09 11:49 637次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>带你<b class='flag-5'>了解</b>NVIDIA Jetson

    电机干货!了解电机的原理及分类

    了解电机的原理及分类 电机是传动及控制系统中的重要部分,目前电机应用的重点也从过去简单的传动向电机的速度、位置、转矩的精确控制转移; 电机为何能够转动?电机又有哪些分类?不同工作环境下需要选用
    发表于 03-12 09:35

    亥姆霍兹线圈产生的磁场有什么特点

    亥姆霍兹线圈是种具有特殊结构和磁场特点的电磁装置,它能够产生均匀且稳定的磁场。本文将从亥姆霍兹线圈的基本原理、结构设计、作用机理、应用领域等多个方面进行论述,以期使读者对亥姆霍兹线圈的特点
    的头像 发表于 03-09 09:20 3860次阅读

    pcb应变测试有多重要?了解

    pcb应变测试有多重要?了解
    的头像 发表于 02-24 16:26 1089次阅读

    带你了解FPGA直方图操作

    。 上面的特点我们般选择片内双口 RAM 作为缓存存储器。对于 8 位的深度图来说,统计结果的数据量并不大,因此选择片内存储。此外,方面统计模块需要与其他时序进行配合,因此需提供双边读写接口;另
    发表于 01-10 15:07

    带您起详细了解IEEE802.3bt(PoE++)的有关特点

    Hqst华强盛(盈盛电子)导读:带您起详细了解IEEE802.3bt(PoE++)的有关特点,让我们对IEEE802.3bt(PoE++)协议有更具体的了解
    的头像 发表于 01-04 11:26 2189次阅读
    带您<b class='flag-5'>一</b>起详细<b class='flag-5'>了解</b>IEEE802.3bt(PoE++)的有关<b class='flag-5'>特点</b>