我想在编译时在XNU内核中的每个函数的序言中插入我的代码块。
为IR转换编写LLVM
通道可能是它的最佳选择,但我找不到任何有关使用LLVM
通道构建XNU内核的信息。
是否可以使用我自己的LLVM
传递插件构建XNU内核?如果是这样,你能告诉我怎么做或提供任何链接吗?
在编译时是否还有其他方法可以使用我的代码块来检测XNU内核?
This链接描述了如何构建XNU内核。
感谢。
答案 0 :(得分:1)
我不确定这是否是一个充分的答案,但在评论中没有足够的空间。
一般情况下,如果你想通过自定义LLVM
优化传递传递任何东西,你需要1)产生bitcode然后使用传递,或2)让clang
运行通过你。
对于1),这意味着您需要使用相同的选项和标志对程序进行预处理和编译,并在链接阶段(当您处理完生成的bitcode时)执行相同操作。最简单且侵入性较小的AFAIK是使用wllvm
实用程序(特别是xnu
使用make
后)。
对于2),您需要使用clang
的传递管理器注册您的插件。根据{{3}},有各种注册表,但没有提到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
并将其命名为
@Provides
@Singleton
protected Client provideRestClient() {
log.info("Http client instance created");
ClientConfig cfg = new ClientConfig();
cfg.property(ClientProperties.CONNECT_TIMEOUT, 5000);
cfg.property(ClientProperties.READ_TIMEOUT, 5000);
final Client client = ClientBuilder.newClient(cfg);
return client;
}