Скомпилируйте код C ++ в ассемблер и затем деассемблируйте - PullRequest
1 голос
/ 01 ноября 2011

Кто-нибудь знает, как преобразовать код C ++ в код сборки, а затем сделать обратное?Путь вперед очень прост:

g++ -S

Я хочу проанализировать вывод и посмотреть, правильно ли он был скомпилирован (просто для любопытства, но он может иметь некоторые приложения).Тем не менее, мои знания о сборке очень ограничены, и вывод трудно понять (это особенно верно, если я использую оптимизации (-O) или компилирую с отладочной информацией (-g)).

Есть ли де-ассемблер для C ++ (GCC) для создания кода C ++?Если нет, есть ли какое-нибудь промежуточное представление, из которого я могу скомпилировать код C ++, а затем обратно из него?

Кажется, есть некоторые способы для преобразования C ++ в C здесь .У GCC есть что-нибудь для этого?

Ответы [ 4 ]

4 голосов
/ 01 ноября 2011

Возможна декомпиляция языка ассемблера обратно в C ++ (например, с HexRays ), с некоторыми ограничениями - прежде всего из-за того, что выходной C ++ будет правильно отражать основные алгоритмы, он, вероятно, победит ' Это не очень похоже на исходный код (хотя искажение имен в C ++ помогает сохранить нечто ближе к оригиналу, чем вы обычно получаете во многих других языках).

2 голосов
/ 01 ноября 2011

Последний вопрос («существует ли какое-либо промежуточное представление, в которое я могу скомпилировать код C ++ и затем вернуться из него?») Звучит как AST, созданный CLang.

1 голос
/ 01 ноября 2011

Возможно, вам может быть интересно узнать больше о внутренних представлениях, используемых GCC, в частности GIMPLE (и Tree-s). Если вы хотите воспользоваться многочисленной обработкой GCC вокруг GIMPLE, вам следует написать плагин GCC или расширение GCC MELT (MELT - это высокоуровневый предметно-ориентированный язык для легкого расширения НКУ).

Но все промежуточные внутренние представления компиляторов C ++, о которых я знаю, довольно далеки от исходного кода C ++, потому что интерфейс C ++ уже проделал большую работу, и нет простого способа вернуться назад. к некоторому полезному C ++.

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

0 голосов
/ 01 ноября 2011

Используйте objdump -d, чтобы разобрать скомпилированный объект. Кроме этого, вы не можете получить гораздо больше информации из этого (и, конечно, не первоисточник). Я бы доверял компилятору на твоем месте.

...