Скомпилируйте код C++ в сборку, а затем разберите

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

g++ -S

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

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

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


person Shayan Pooya    schedule 01.11.2011    source источник
comment
После того, как вы скомпилируете программу на C++, нет никакого способа вернуть исходный код из сборки для всех, кроме самых тривиальных программ (если только ваш компилятор не сделает что-то странное, например, включит исходный код в двоичный файл или что-то в этом роде). Вы можете получить очень грубое приближение, но это все.   -  person Seth Carnegie    schedule 01.11.2011
comment
Для ПК вы можете использовать опцию -masm=intel, чтобы получить более читаемый (традиционный) синтаксис.   -  person Cheers and hth. - Alf    schedule 01.11.2011
comment
Я надеюсь, что есть какой-то инструмент, который может генерировать C++ версию байт-кода Java, которую можно легко разобрать. Если это возможно для Java, то возможно и для C++.   -  person Shayan Pooya    schedule 01.11.2011
comment
С какой целью вы это делаете? Если это на самом деле просто проверка работы компилятора, я бы не стал заморачиваться. Если это по какой-либо другой причине, я предлагаю вам изучить сборку для обучения.   -  person jli    schedule 01.11.2011
comment
@Shayan: Если это возможно для Java, то возможно и для C++ Нет, на самом деле это не так. C++ и Java — это не одно и то же, и с точки зрения моделей компиляции они совершенно разные.   -  person Nicol Bolas    schedule 01.11.2011


Ответы (4)


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

person Jerry Coffin    schedule 01.11.2011
comment
HexRays кажется разумным решением, хотя стоимость начинается от 600 долларов. - person Shayan Pooya; 01.11.2011
comment
@Shayan: Да, по сравнению с бесплатными инструментами стоимость довольно высока. OTOH, если вы используете его профессионально (или платите кому-то за это), он может окупить себя очень быстро. - person Jerry Coffin; 01.11.2011

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

person MSalters    schedule 01.11.2011

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

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

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

person Basile Starynkevitch    schedule 01.11.2011

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

person jli    schedule 01.11.2011