[论文解读] Fine-Grained Library Customization
本文提出了一种细粒度的库定制技术,通过分析数据结构中未使用的字段,识别并移除静态链接库中的无结果代码。该方法基于 LLVM IR 上的依赖分析与模式匹配,将库代码大小减少了 50.83%(722 条指令中的 367 条),显著展示了通过有针对性的代码裁剪实现攻击面最小化与性能提升的潜力。
Code bloat widely exists in production-run software. Left untackled, it not only degrades software performance but also increases its attack surface. In this work, we conduct a case study to understand this issue in statically linked libraries. To be specific, we analyze midilib, a software package enclosing statically linked libraries. We show that it is possible to leverage dependence analysis to trim the resultless code statements re- siding in a target library. With this observation, we believe it is possible to build a tool to automatically cut off code pertaining to resultless operations.
研究动机与目标
- 调查在静态链接库中,特别是返回数据结构中未使用字段的无结果代码的普遍性。
- 解决因代码膨胀导致的攻击面扩大、内存压力增加和网络开销上升的问题。
- 开发一种概念验证技术,实现对不影响应用程序输出的计算的细粒度移除。
- 证明基于字段级使用分析的精确、安全代码裁剪可超越粗粒度方法。
提出的方法
- 对 C 库(midilib)进行静态分析,识别 m2rtttl 应用程序未访问的 MIDI 消息结构体(MIDI_MSG)中的字段。
- 使用数据依赖分析追踪并识别与未使用字段相关的 LLVM IR 指令,将其标记为无结果且可移除。
- 实现两个概念验证工具:一个基于未使用字段赋值的模式匹配,另一个使用依赖分析定位相关语句。
- 结合两个工具的结果,识别出重叠与互补的可移除指令集合。
- 将综合方法应用于 midifile.c 库,测量 LLVM 指令与源代码行数的减少情况。
- 通过确保对应用程序可观察行为无影响,验证移除操作的安全性。
实验结果
研究问题
- RQ1在静态链接库中,返回数据结构中未使用字段在多大程度上导致了代码膨胀?
- RQ2依赖分析是否能有效识别并移除应用程序未使用的计算值的代码?
- RQ3与粗粒度方法相比,通过细粒度字段级分析可消除多少代码膨胀?
- RQ4结合模式匹配与依赖分析对代码裁剪效果有何影响?
主要发现
- 研究发现,在 MIDI_MSG 结构体的 44 个原始字段中,仅有 9 个被 m2rtttl 应用程序使用,表明存在大量未使用的计算。
- 通过模式匹配,识别出 33 条无结果字段赋值指令,确认可安全移除。
- 依赖分析识别出额外 322 条与无结果赋值相关的指令,总计可移除指令达 355 条。
- 综合方法从 722 条 LLVM 指令中移除了 367 条,代码大小减少 50.83%。
- 这相当于源代码行数约减少 39.63%,充分展示了库代码瘦身的巨大潜力。
- 结果证实,基于字段使用与依赖分析的细粒度裁剪可安全消除大量未使用代码。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。