1.1. 地址无关代码
需要被 prelink 的 elf 文件,无论是共享库还是可执行文件,编译时必须加 -fpic/-fpic 参数,生成目标无关地址代码。对于可执行文件,不能使用 -fpie/-fpie 加 –pie 生成地址无关可执行文件,否则无法被 prelink。
这个结论是根据上述测试程序得出的,其中的详细机理有待进一步研究。
1.2. 检查prelink 状态
可以使用 readelf 和 objdump 工具来检查一个 elf 文件是否已经被 prelink。例如:
注意观察到 6~14 行,对比没有被 prelink 之前的状态,init、fini、strtab、symtab 等 section 的地址已经修改为运行时进程空间的虚拟内存地址。第 30 行,relacount 表示已经预先进行重定位的符号的数量;第 31 行是 prelink 根据 elf 所直接依赖的共享库计算的 md5 值,该值用于判断该 elf 所以来的共享库是否被修改过;从第 32 行可以看出该 elf 已被加上 prelinked 标记和时间戳。
但是,并非所有被成功 prelink 的 elf 文件都会加上 prelinked 的标记和时间戳。在用 prelink 处理完我们的sdk的后,发现 target_bin 所有的依赖项都有 prelinked 标记,target_bin 自身并没有此标记。但是通过测试其启动速度,确有巨大的提升,证明 prelink 在 target_bin 上确实发挥了作用。
至于为什么没有这个标记,暂时还没有调查清楚,仍待进一步研究。
对于上述情况,通过 objdump 等工具查看elf文件的 section header,我们仍然可以发现 prelink 处理后留下的蛛丝马迹。
prelink 之前,查看 target_bin 的节头:
prelink 之后,再次查看节头:
对比 prelink 前后的节头信息,我们发现 prelink 后每个节的地址都有了调整,增加了.gnu.liblist , .gnu.conflict 和 .gnu.prelink_undo 这三个节。同时 .dynstr 节的 size 由 0xa3cb1 增加到了 0xa3e8c。这些都是 prelink 之后 elf 的 size 有所增大的原因。
1.3. 查看elf依赖树
prelink 的处理过程是从目标 elf 文件开始,检查其依赖树。从叶子节点开始处理,自底向上,直至根节点。若中间任何节点处理异常,则目标文件都无法被 prelink。同理,如果已经被 prelink 处理的 elf 文件,如果其依赖树的中任何节点对应的 elf 文件有更改,则需要从根开始重新 prelink。如果被更改的 elf 所处的层级较低,被很多可执行文件依赖,则可能整个系统的 elf 都需要重新进行 prelink 处理。
可以使用 lddtree 查看 elf 文件的依赖树。但是这个工具比较鸡肋,只适用于处理本机的 elf 文件,无法像 prelink 一样可以在运行时指定 sysroot 和 ld_library_path。
1.4. 不必要的依赖项
如果 prelink 在处理某个 elf 文件(记为 a)的过程中,发现 a 并没有使用其直接依赖的另一个 elf 文件(记为 b),而 a 又通过 c 间接依赖到 b,并且 b 已经被 prelink 处理。此时,a 将无法被 prelink。
1.5. 动态加载的共享库
prelink 对于通过 dlopen 方式打开的共享库没有效果。
能讯半导体基站发射系统发明专利揭秘
机智云IoT开发平台助力企业打造定制化工业互联网系统
京东城市在iCity智能城市大会上全新亮相
启明FOTA差分升级 系统级解决方案
嵌入式OS烽火再起 微软称霸胜算几何?
一文了解Prelink的注意事项
什么是MEMS?MEMS深度文章从原理制造到应用全讲透
紫光国微拟以180亿收购安全芯片厂商 并且开市起复牌
装车量暴增,渗透率仍低,DMS成为爆款之前还有哪些问题要解决?
OLED显示屏出现老化迹象,应如何解决
诺基亚9什么时候上市?诺基亚9现身帅炸了,加入索尼Xperia元素+高屏占比,价格超6000,情怀还在不在?
基于二极管桥的差分电容读出电路分析
AT32 MCU如何设定启动存储器为主存扩展
全球移动市场的指路灯——SK海力士背照式(BSI)技术分享
空客与ANH签订HCare Smart零件合同 风河通过CMMI Level 3等级认证
扬尘监测系统,助力城市空气污染防治
为什么高通在芯片领域比不上英特尔赚钱多
浅谈变电站继电保护定义及线路保护原理
高速信号知识科普
模拟与数字的智能集成