首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在编译时检测XNU内核二进制文件?

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

Stack Overflow用户
提问于 2017-12-13 00:38:21
回答 1查看 131关注 0票数 0

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

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

有没有可能用我自己的LLVM pass插件来构建XNU内核?如果是这样的话,你能告诉我怎么做或提供任何链接吗?

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

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

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-12-13 02:06:14

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

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

对于1),这意味着您需要使用相同的选项和标志对程序进行预处理和编译,并在链接阶段执行相同的操作(当您处理完生成的位码时)。AFAIK,最简单、侵入性最小的方法是使用wllvm实用程序(特别是因为xnu使用make)。

对于2),你需要向clang的pass管理器注册你的插件。根据documentation的说法,有各种各样的注册表,但clang的注册表没有提到。看看LLVM是如何在llvm/Transforms/IPO/PassManagerBuilder.h中做到这一点的

代码语言:javascript
复制
#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);

并将其称为

代码语言:javascript
复制
clang -Xclang -load -Xclang [path to plugin]/libHelloPass.so foo.c -o foo
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47777457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档