我想在编译时将我的代码块插入 XNU 内核中每个函数的序言。
为 IR 转换编写LLVM
pass 可能是它的最佳选择,但我找不到任何有关使用LLVM
pass 构建 XNU 内核的信息。
是否可以使用我自己的LLVM
pass 插件构建 XNU 内核?如果是这样,你能告诉我如何做到这一点或提供任何链接吗?
有没有其他方法可以在编译时使用我的代码块来检测 XNU 内核?
此链接描述了如何构建 XNU 内核。
谢谢。
我想在编译时将我的代码块插入 XNU 内核中每个函数的序言。
为 IR 转换编写LLVM
pass 可能是它的最佳选择,但我找不到任何有关使用LLVM
pass 构建 XNU 内核的信息。
是否可以使用我自己的LLVM
pass 插件构建 XNU 内核?如果是这样,你能告诉我如何做到这一点或提供任何链接吗?
有没有其他方法可以在编译时使用我的代码块来检测 XNU 内核?
此链接描述了如何构建 XNU 内核。
谢谢。
我不确定这将是一个足够的答案,但评论中没有足够的空间。
通常,如果您想通过自定义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