Я пытаюсь построить контрольный граф результатов сборки, которые возвращаются через вызов objdump -d. В настоящее время лучший метод, который я придумал, состоит в том, чтобы поместить каждую строку результата в связанный список и выделить адрес памяти, код операции и операнды для каждой строки. Я разделяю их, полагаясь на обычную природу результатов objdump (адрес памяти - от символа 2 до символа 7 в строке, представляющей каждую строку).
Как только это будет сделано, я запускаю собственно инструкцию CFG. Каждый узел в CFG содержит начальный и конечный адрес памяти, указатель на предыдущий базовый блок и указатели на любые дочерние базовые блоки. Затем я просматриваю результаты objdump и сравниваю код операции с массивом всех кодов операций потока управления в x86_64. Если код операции является управляющим потоком, я записываю адрес как конец основного блока и в зависимости от кода операции добавляю два дочерних указателя (условный код операции) или один (вызов или возврат).
Я нахожусь в процессе реализации этого в C, и кажется, что это будет работать, но чувствует себя очень незначительным. У кого-нибудь есть предложения или что-то, что я не принимаю во внимание?
Спасибо, что нашли время, чтобы прочитать это!
редактирование:
Идея состоит в том, чтобы использовать его для сравнения стековых трассировок системных вызовов, генерируемых DynamoRIO, с ожидаемым CFG для целевого бинарного файла. Я надеюсь, что его создание будет способствовать этому. Я не использовал повторно то, что доступно, потому что A) я действительно не думал об этом, и B) мне нужно поместить график в пригодную для использования структуру данных, чтобы я мог проводить сравнения путей. Я собираюсь взглянуть на некоторые утилиты на странице, на которую вы ссылались, спасибо, что указали мне правильное направление. Спасибо за ваши комментарии, я действительно ценю это!