Инструменты анализа сборки

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

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


person Zeke    schedule 05.11.2010    source источник
comment
Мне кажется, что анализ LLVM IR будет проще, поскольку он использует форму SSA для регистров.   -  person    schedule 06.11.2010
comment
@delnan Я согласен, но я добавляю проход оптимизации на уровне сборки, поэтому мне нужно иметь возможность анализировать фактически сгенерированный ASM.   -  person Zeke    schedule 06.11.2010
comment
могу ли я предложить, чтобы ваш пропуск работал либо как LLVM MachineFunctionPass, либо, если это абсолютно необходимо, внутри инфраструктуры MC? На самом деле нет причин разбирать asm, перестраивать всю информацию об управлении и потоке данных, а затем выполнять некоторую оптимизацию.   -  person ohmantics    schedule 01.12.2010
comment
@ohmantics: этот анализ выполняется после запуска новой оптимизации. Фактическая реализация использует существующий MachineFunctionPass, но я хотел проанализировать полученный файл ASM, чтобы сравнить ассемблерный код с новым проходом и без него.   -  person Zeke    schedule 01.12.2010


Ответы (3)


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

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

Наше программное обеспечение DMS не предназначено специально для этого, но хорошо подходит для синтаксического анализа/анализа языков. Инструментарий реинжиниринга.

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

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

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

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

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

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

person Ira Baxter    schedule 08.11.2010
comment
Спасибо за ссылки и увлекательный TechTalk. Я думаю, что DMS может быть излишним для моей конкретной ситуации, но сама концепция очень интересна. Насколько крута кривая обучения при использовании DMS? - person Zeke; 08.11.2010
comment
DMS — сложная система, потому что она имеет дело со сложными артефактами и выполняет некоторые довольно сложные вещи (анализ потока на 25 миллионах строк кода C требует довольно удивительного механизма). Вы можете изучить основы за неделю; посетите semanticdesigns.com/Products/DMS/SimpleDMSDomainExample.html, чтобы быстро тур по основам. Вероятно, потребуется 6-12 месяцев, чтобы научиться хорошо пользоваться DMS; подумайте о кривой обучения, чтобы научиться хорошо использовать C++. Возможно, это неправильный способ думать о DMS; реальный вопрос в том, сколько времени потребуется, чтобы выполнить ту же задачу без него? - person Ira Baxter; 08.11.2010
comment
это не похоже на то, что это бесплатно, поэтому оно может не подходить для личных проектов / проектов бесплатного программного обеспечения. Или я ошибаюсь и просто пропустил ссылку для скачивания? Хотя выглядит крутой инструмент. - person Matthieu M.; 12.11.2010
comment
@Matthieu: The New Jersey Machine Toolkit имеет открытый исходный код, насколько я знаю. DMS — это коммерческий продукт, и, вероятно, он не подходит для личных/бесплатных программных проектов. Но тогда, если вы собираетесь сделать что-то, что требует 6-12 месяцев разработки, это, вероятно, не личный проект. - person Ira Baxter; 12.11.2010

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

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

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

person old_timer    schedule 14.11.2010
comment
Вы не назвали это Наперстянкой? - person Ira Baxter; 19.11.2010

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

person SK-logic    schedule 16.11.2010