Макет скомпилированных объектов

Есть ли способ, похожий на просмотр результата предварительной обработки с помощью gcc -E — посмотреть, как выглядят мои объекты после компиляции в объектные файлы?

Я говорю о GCC, но решение, включая MSVC, будет в порядке.

Ответы

Ответ 1

Для Visual С++:

Наконец-то мне удалось выкопать (хорошо скрытые!) недокументированные флаги компилятора, которые MSVС++ поддерживает с помощью здесь и здесь. Вот они:

/d1reportSingleClassLayoutXXX
/d1reportAllClassLayout

(замените XXX на имя класса)

Ответ 2

Скомпилированные исполняемые файлы GCC, Pahole. Он покажет вам, как компилятор изложил ваши структуры/классы и независимо от того, имеют ли они "дыры" в них. Отверстия заполняются из-за правил выравнивания памяти.

Ответ 3

Объектные файлы содержат двоичные данные - только более высокий уровень, который большинство компиляторов может выводить, является ассемблером, поэтому, если вы не можете прочитать, что вам не повезло. Тем не менее, посмотрите этот вопрос для получения дополнительной информации в этой области.

Ответ 4

Вы можете проверить расположение двоичных файлов и их содержимое с помощью файлов карт. Используйте /MAP для VC и -Map или --print-map для gcc.

Ответ 5

Ваш вопрос немного запутан.

Если вы хотите увидеть результат предварительной обработки с помощью MSVC, вы можете использовать /E, /P/ или /EP.

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

Ответ 6

Конструктор - это еще одна функция (если только она не вставлена). Файлы объектов содержат много информации для компоновщика; поэтому вы должны найти функцию в файле .a(имена функций будут искажены, хотя).