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