如何在编译时检测XNU内核二进制文件?

时间:2017-12-12 16:38:21

标签: llvm instrumentation xnu

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

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

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

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

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

感谢。

1 个答案:

答案 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;
}