Как настроить двоичный файл ядра XNU во время компиляции?

Я хочу вставить свой блок кода в пролог каждой функции в ядре XNU во время компиляции.

Написание прохода LLVM для IR-преобразования, вероятно, лучший выбор для этого, но я не смог найти никакой информации о сборке ядра XNU с проходами LLVM.

Можно ли собрать ядро ​​XNU с моим собственным плагином LLVM pass? Если да, то не могли бы вы рассказать мне, как это сделать или дать ссылку на это?

Есть ли другой способ оснастить ядро ​​XNU моим блоком кода во время компиляции?

По этой ссылке описано, как собрать ядро ​​XNU .

Спасибо.


person user10007    schedule 12.12.2017    source источник


Ответы (1)


Я не уверен, что это будет адекватный ответ, но в комментариях недостаточно места.

В общем, если вы хотите передать что-либо с помощью пользовательского LLVM прохода оптимизации, вам нужно либо 1) создать битовый код и затем использовать проход на нем, либо 2) clang запустить этот проход для вас.

Для 1) это означает, что вам нужно предварительно обработать и скомпилировать программу с теми же параметрами и флагами и сделать то же самое на этапе компоновки (когда вы закончите обработку сгенерированного битового кода). Насколько мне известно, самым простым и менее инвазивным является использование утилиты 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
person compor    schedule 12.12.2017
comment
было бы полезно решить эту проблему. Спасибо за ответ! - person user10007; 13.12.2017
comment
предполагая, что у меня есть собственный проход llvm, какую часть файлов (makefile) в дереве ядра xnu нужно изменить, чтобы этот проход работал? - person user10007; 13.12.2017
comment
или какие варианты make использовать? CFLAGS? - person user10007; 13.12.2017
comment
Я бы так догадался. Это то, что вы можете опробовать на проекте игрушки/манекена, верно? Вам не нужно спрашивать каждую деталь, прежде чем даже попробовать что-то, см. это - person compor; 13.12.2017