Llvm 如何在编译时插入XNU内核二进制文件?

Llvm 如何在编译时插入XNU内核二进制文件?,llvm,instrumentation,xnu,Llvm,Instrumentation,Xnu,我想在编译时在XNU内核中每个函数的序言处插入代码块 为IR转换编写LLVM过程可能是最好的选择,但我找不到任何关于使用LLVM过程构建XNU内核的信息 可以用我自己的LLVMpass插件构建XNU内核吗?如果是的话,你能告诉我怎么做或者提供链接吗 有没有其他方法在编译时用我的代码块插入XNU内核 链接描述了如何构建XNU内核 谢谢。我不确定这是否是一个足够的答案,但评论中没有足够的空间 通常,如果您想通过自定义LLVM优化传递传递任何内容,则需要1)生成位码并使用传递,或者2)让clang为您

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

为IR转换编写
LLVM
过程可能是最好的选择,但我找不到任何关于使用
LLVM
过程构建XNU内核的信息

可以用我自己的
LLVM
pass插件构建XNU内核吗?如果是的话,你能告诉我怎么做或者提供链接吗

有没有其他方法在编译时用我的代码块插入XNU内核

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


谢谢。

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

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

对于1),这意味着您需要使用相同的选项和标志预处理和编译程序,并在链接阶段(处理完生成的位代码后)执行相同的操作。好吧,最简单、侵入性较小的方法是使用该实用程序(尤其是使用
make

对于2),您需要在
clang
的pass manager中注册插件。根据,有各种各样的注册,但是没有提到
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

解决这个问题将是有益的。谢谢你的回复!假设我有一个自定义的llvm过程,xnu内核树中的文件(makefile)的哪一部分需要修改以使过程正常工作?或者使用make的哪些选项?CFLAGS?我想是的。这是你可以在玩具/虚拟项目上尝试的东西,对吗?你不必在尝试之前问每一个细节,请看