2012-03-30 3 views
9

Я ищу в создании графа вызовов для ядра Linux, который будет включать указатели на функции (см. Мой предыдущий вопрос Static call graph generation for the Linux kernel для получения дополнительной информации). Мне сказали, что LLVM должен быть подходящим для этой цели, однако мне не удалось найти соответствующую информацию на llvm.org.Как использовать LLVM для генерации графика вызовов?

Любая помощь, включая указатели на соответствующую документацию, будет оценена по достоинству.

ответ

12

Во-первых, вы должны скомпилировать свое ядро ​​в LLVM IR (вместо собственных объектных файлов). Затем, используя llvm-ld, объедините все файлы объектов IR в один большой модуль. Это может быть довольно сложной задачей, вам придется сильно модифицировать make-файлы, но я считаю, что это выполнимо.

Теперь вы можете сделать свой анализ. Простой график вызовов может быть сгенерирован с использованием инструмента opt с пропуском -dot-callgraph. Маловероятно, чтобы обрабатывать указатели на функции, поэтому вы можете изменить его.

Отслеживание всех возможных путей потока данных, которые будут нести указатели на функции, является довольно сложной задачей, и в общем случае это невозможно сделать (если есть указатель на целые приведения, если указатели хранятся в сложных структурах данных, и т.д.). Для большинства конкретных случаев вы можете попытаться реализовать глобальную абстрактную интерпретацию, чтобы приблизить все возможные пути потока данных для ваших указателей. Конечно, это было бы неточно, но тогда вы получите хотя бы консервативное приближение.

+2

Вы действительно не хотите создавать точную диаграмму для 8 миллионов строк кода. Это будет охватывать теннисный корт, если точка может нарисовать его, чего не может. Кроме этого, это отличное отголосок ответа на другую вопросную заметку OP: -} с особым упором на то, что представляют собой увлекательные указатели функций. –

+0

@IraBaxter, конечно, вы не хотите * показывать * dot callgraph для чего-либо большего, чем «привет, мир!». Но вы можете использовать этот .dot-файл для дальнейшего анализа. Я обычно разбираю файлы .dot и сохраняю их в базе данных. –

+0

Спасибо, что указали инструмент 'opt'. Да, Ира, я не ищу создания графического представления графа вызовов. Наличие в любом разборном формате в порядке, для которого подходит формат точки. Что касается указателей на функции, мне сказали, что LLVM должен иметь возможность выполнять некоторые из этих точек для анализа указателей функций. Я не понимаю, как это реализовать. – addalbx

Смежные вопросы