【问题标题】:A higher level tool for writing a pass in LLVM用于在 LLVM 中编写通行证的更高级别工具
【发布时间】:2012-09-21 16:24:38
【问题描述】:

通常如果你想修改 LLVM IR,你需要写一个 pass。但是,如果更高级别的工具可以为您提供帮助,有时自己编写通行证是一种矫枉过正的做法。

例如,有人可能希望记录程序中的每个loadstore。为此,他需要注入执行日志记录的代码。现在如果有更高级别的工具,它可以提供回调给我们写我们想要的东西。因此,在这种情况下,例如,它可以为我们提供OnLoadOnStore 函数,我们可以填充这些函数来告诉工具在每次加载和存储时要做什么。这种工具存在吗?

所以基本上我想要类似于动态二进制检测工具提供的东西,但它适用于 LLVM,用于编译时代码注入。

【问题讨论】:

  • 您是否检查了现有的 LLVM API,如果是,您发现缺少什么?我记得 LLVM API 足够强大,可以在几行代码中完成类似的操作,尽管我从未使用过它。
  • 它们确实足够强大,但我仍然认为如果存在更高级别的工具,可以更轻松地完成一些任务。例如,在这种情况下,使用它们正在加载或存储的地址记录每个加载和存储,虽然可以通过编写 pass 来完成,但当然不会像通过简单地实现 OnLoad 和告诉工具做什么那么简单OnStore 功能。使用工具做到这一点会容易 10 倍。
  • 这可以在 LLVM IR 的文本表示上使用一点 grep-fu 或 sed-fu 轻松完成。或者,更好的是,使用 LLVM API 编写 30 行 C++。
  • 是的,用不支持模式匹配的语言编写这样的通行证并不是很愉快的体验。您可能想尝试 OCaml 或 Haskell 绑定。
  • 请小心你所做的事情:为每个加载/存储发出额外的代码是可怕的膨胀,你可以只计算每个基本块的加载/存储,并在输入块时更新数字。

标签: c++ c llvm


【解决方案1】:

我认为你应该考虑使用 PIN 而不是 LLVM 来处理这些事情:http://www.pintool.org/

PIN 使您能够在多个粒度级别插入检测/分析代码:指令、基本块、函数、跟踪,甚至共享库的加载/卸载。这可能是一种更实用的方式,因为您不需要编译应用程序 - 因此您可以分析例如不是开源的程序。

有适用于 windows 和 linux 的 PIN 版本。

PS:另一个似乎有用的工具:http://eces.colorado.edu/~blomsted/llvmpin/llvmpin.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 2015-07-08
    • 1970-01-01
    • 2013-07-01
    • 2010-09-08
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多