将 LLVM IR 分析与最终地址相关联
Correlating LLVM IR analysis with final address
我正在尝试设计一个 LLVM IR pass,它从 LLVM IR 获取一些信息(特别是:IR 调用指令中使用的类型),并以某种方式将此 IR 级分析与二进制级地址相关联。例如,我想知道 call
指令(在最终二进制文件中的某个地址)正在调用具有特定类型签名的函数。
一些观察:
- 明显的问题是当 IR pass 运行时最终地址还不可用。
- 虽然 IR 指令不会将 1:1 映射到机器指令,但可以相对安全地假设 IR 中的
call
将映射到机器代码中的 call
。
- 可以反汇编二进制文件,查看被调用的函数,并获取其类型。但是,这不适用于间接调用指令(这就是我尝试在 IR 中执行此操作的原因)。
在 this comment 中,解决类似问题的建议方法是“注入[] 一些稍后可以在可执行文件中发现的元数据”。但是,我找不到任何有关如何使元数据在二进制文件中存活的信息。
您可以使用调试位置(这是一种元数据)将 IR 调用与最终调用联系起来。如果您确保 IR 中的每个调用都有一个文件名、行和列,那么这种 hack 应该是可能的。我确信存在更清洁的解决方案。
我正在尝试设计一个 LLVM IR pass,它从 LLVM IR 获取一些信息(特别是:IR 调用指令中使用的类型),并以某种方式将此 IR 级分析与二进制级地址相关联。例如,我想知道 call
指令(在最终二进制文件中的某个地址)正在调用具有特定类型签名的函数。
一些观察:
- 明显的问题是当 IR pass 运行时最终地址还不可用。
- 虽然 IR 指令不会将 1:1 映射到机器指令,但可以相对安全地假设 IR 中的
call
将映射到机器代码中的call
。 - 可以反汇编二进制文件,查看被调用的函数,并获取其类型。但是,这不适用于间接调用指令(这就是我尝试在 IR 中执行此操作的原因)。
在 this comment 中,解决类似问题的建议方法是“注入[] 一些稍后可以在可执行文件中发现的元数据”。但是,我找不到任何有关如何使元数据在二进制文件中存活的信息。
您可以使用调试位置(这是一种元数据)将 IR 调用与最终调用联系起来。如果您确保 IR 中的每个调用都有一个文件名、行和列,那么这种 hack 应该是可能的。我确信存在更清洁的解决方案。