我想在编译时在XNU内核中每个函数的开头插入我的代码块。
为IR转换编写一个LLVM pass可能是最好的选择,但是我找不到任何关于使用LLVM pass构建XNU内核的信息。
有没有可能用我自己的LLVM pass插件来构建XNU内核?如果是这样的话,你能告诉我怎么做或提供任何链接吗?
有没有其他方法可以在编译时用我的代码块插装XNU内核?
XNU链接描述了如何构建This内核。
谢谢。
发布于 2017-12-13 02:06:14
我不确定这是否是一个足够的答案,但在评论中没有足够的空间。
通常,如果要通过自定义LLVM优化过程传递任何内容,则需要1)生成位码并使用该过程,或者2)让clang为您运行该过程。
对于1),这意味着您需要使用相同的选项和标志对程序进行预处理和编译,并在链接阶段执行相同的操作(当您处理完生成的位码时)。AFAIK,最简单、侵入性最小的方法是使用wllvm实用程序(特别是因为xnu使用make)。
对于2),你需要向clang的pass管理器注册你的插件。根据documentation的说法,有各种各样的注册表,但clang的注册表没有提到。看看LLVM是如何在llvm/Transforms/IPO/PassManagerBuilder.h中做到这一点的
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
// using llvm::PassManagerBuilder
// using llvm::RegisterStandardPasses
static void registerHello(const llvm::PassManagerBuilder &Builder,
llvm::legacy::PassManagerBase &PM) {
PM.add(new HelloPass());
return;
}
static llvm::RegisterStandardPasses RegisterHello(llvm::PassManagerBuilder::EP_EarlyAsPossible, registerHello);并将其称为
clang -Xclang -load -Xclang [path to plugin]/libHelloPass.so foo.c -o foohttps://stackoverflow.com/questions/47777457
复制相似问题