0

我想在编译时将我的代码块插入 XNU 内核中每个函数的序言。

为 IR 转换编写LLVMpass 可能是它的最佳选择,但我找不到任何有关使用LLVMpass 构建 XNU 内核的信息。

是否可以使用我自己的LLVMpass 插件构建 XNU 内核?如果是这样,你能告诉我如何做到这一点或提供任何链接吗?

有没有其他方法可以在编译时使用我的代码块来检测 XNU 内核?

链接描述了如何构建 XNU 内核。

谢谢。

4

1 回答 1

1

我不确定这将是一个足够的答案,但评论中没有足够的空间。

通常,如果您想通过自定义LLVM优化传递传递任何内容,您需要 1) 生成位码并在其上使用传递,或者 2)clang为您运行该传递。

对于 1),这意味着您需要使用相同的选项和标志来预处理和编译程序,并在链接阶段执行相同的操作(当您完成处理生成的位码时)。AFAIK,最简单且侵入性较小的是使用该wllvm实用程序(尤其是因为xnu使用make)。

对于 2),您需要向clang' 通行证管理器注册您的插件。根据文档,有各种注册表,但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 foo
于 2017-12-12T18:06:13.943 回答