Инструменты анализа сборки - PullRequest
9 голосов
/ 06 ноября 2010

У кого-нибудь есть предложения по инструментам анализа сборочных файлов?Я пытаюсь проанализировать файлы ARM / Thumb-2 ASM, сгенерированные LLVM (или, альтернативно, GCC) при передаче опции -S.Меня особенно интересует статистика команд на базовом уровне блоков, например, подсчет операций с памятью и т. Д. Я могу свернуть свой собственный инструмент на Python, но мне было любопытно посмотреть, существуют ли какие-либо существующие инструменты до того, как я запустился.

Обновление: я провел небольшой поиск и нашел хороший ресурс для инструментов разборки / hex-редакторы / etc здесь , но, к сожалению, он в основном сосредоточен на сборке x86, а также не включает в себялюбые актуальные сборочные анализаторы файлов.

Ответы [ 3 ]

3 голосов
/ 08 ноября 2010

Вам нужен инструмент, для которого вы можете определить синтаксис языка ассемблера, а затем создать собственные анализаторы.Вы, анализаторы, можете быть простыми («сколько места занимает инструкция?») Или сложными («Сколько циклов потребуется для этого isntruction?» [Который зависит от предыдущей последовательности инструкций и, возможно, от сложной модели процессора, который вы используете).забота о]).

Один специально разработанный для этого - New Jersey Machine Toolkit .Он действительно предназначен для создания генераторов кода и отладчиков.Я подозреваю, что это было бы хорошо при "количестве байтов инструкции".Не ясно, хорошо ли это для более сложных анализов.И я полагаю, что он настаивает на том, чтобы вы придерживались его стиля синтаксиса, а не вашего.

Тот, который специально не предназначен для этого, но хорошо разбирает / анализирует языки в целом, - это наша DMSSoftware Reengineering Toolkit .

DMS может получить описание грамматики практически для любого контекстно-свободного языка (охватывающего большинство синтаксиса ассемблера), а затем может анализировать конкретный экземпляр этой грамматики (ассемблерного кода) в AST.для дальнейшей обработки.Мы покончили с несколькими языками ассемблера, включая IBM 370, 8-разрядную линию процессора Motorola и довольно специфический DSP, без проблем.

Вы можете указать грамматику атрибута (вычисление по AST) для DMSбез труда.Это отличный способ кодирования анализов, которые нуждаются только в локальной информации, такой как «Насколько велика эта инструкция?».Для более сложного анализа вам понадобится модель процессора, основанная на серии инструкций;Передача такой модели машины AST для отдельных команд была бы простым способом применить модель машины для вычисления более сложных вещей, таких как «Сколько времени занимает эта инструкция?».

Другие анализы, такие как поток управления и данныепоток, предоставляются в общей форме DMS.Вы можете использовать оценщик атрибутов для сбора локальных фактов («control-next для этой инструкции - ...», «данные из этой инструкции передаются в ...») и передавать их в анализаторы потока для вычисления фактов глобального потока («если я выполню эту инструкцию, какие другие инструкции могут быть выполнены в нисходящем направлении?» ..)

Вам необходимо настроить DMS для вашего конкретного языка (ассемблера). предназначен для настройки для подобных задач.

Да, вы, вероятно, можете все это кодировать в Python;в конце концов, это машина Тьюринга.Но, вероятно, не так просто.

Дополнительное преимущество: DMS готова применить преобразования к вашему коду, основываясь на ваших анализах.Таким образом, вы могли бы также реализовать свой оптимизатор с ним.В конце концов, вам необходимо подключить аналитическую индикацию, что оптимизация безопасна, к фактическим шагам оптимизации.

2 голосов
/ 14 ноября 2010

Я написал много дизассемблеров, включая руку и большой палец. Не качество продукции, а в целях изучения ассемблера. Как для ARM, так и для Thumb ARM ARM (ARM Architectural Reference Manual) имеет хороший график, из которого вы можете легко подсчитать операции с данными из загрузки / сохранения и т. Д., Может быть, стоит часов работы, может быть, двух. По крайней мере, на начальном этапе, вы бы в итоге подсчитали значения данных.

Другой постер может быть прав, так как с диаграммой, о которой я говорю, написать программу для проверки ASCII на предмет поиска ldr, str, add и т. Д. Должно быть очень просто. Не нужно анализировать все, если вы заинтересованы в подсчетах операций с памятью и т. д. Конечно, недостатком является то, что вы, вероятно, не сможете исследовать циклы. Одна функция может иметь загрузку и сохранение, другая может иметь загрузку и сохранение, но она обернута циклом, вызывая намного больше операций с памятью после выполнения.

Не зная, что вас действительно интересует, я думаю, вы можете смоделировать код и посчитать такие вещи. Я написал симулятор большого пальца (thumbulator), который пытается сделать именно это. (и я использовал его для сравнения выполнения llvm и выполнения gcc, когда дело доходит до количества выполненных инструкций, выборок, операций с памятью и т. д.) Проблема может быть в том, что это только большой палец, без ARM и Thumb2. Thumb2 может быть добавлен проще, чем ARM. Существует рука от руки, которая находится в источниках GDB среди других мест. Я не могу вспомнить сейчас, если он выполняет thumb2. Насколько я понимаю, когда рука использовалась, она точно показывала вам такую ​​статистику.

1 голос
/ 16 ноября 2010

Вы можете подключить свою статистику в генератор кода LLVM, она довольно гибкая и уже собирает некоторые статистические данные, которые можно использовать в качестве примера.

...