Gcc скомпилированные двоичные файлы с различными размерами?

Если один и тот же код создается в разное время w/gcc, результирующий двоичный файл будет иметь различное содержимое. Хорошо, я не одинок в этом, но что это такое.

Тем не менее, я недавно столкнулся с ситуацией, когда один и тот же код, построенный с той же версией gcc, генерирует двоичный файл с другим размером, чем предыдущая сборка (примерно на 1900 байт).

Кто-нибудь может понять, что может вызвать любую из этих ситуаций? Это какой-то вопрос ELF? Существуют ли какие-либо инструменты (кроме ldd), которые можно использовать для сброса содержимого двоичных файлов, чтобы увидеть, что именно отличается?

Спасибо заранее.

Ответ 1

objdump - вероятно, программа, которую вы ищете для сброса содержимого двоичных файлов.

objdump -h покажет вам разделы и их размеры, поэтому вы сможете увидеть, где происходит изменение размера, а затем развернуться дальше, чтобы понять, почему.

Ответ 2

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

Используя readelf, (readelf -a -W), я создал отчет, в котором перечислены содержимое обеих сборников и сравниваются с ними (используя Beyond Compare). Это показало, что пара дополнительных символов вытягивается из boost libs.

Ло и вот, мы фактически строили против другой версии зависимой библиотеки и не понимали этого. В этом случае вреда не будет, но хорошо знать, что происходит с вашим исполняемым файлом.

Спасибо всем за вдумчивые ответы.

Ответ 3

Повторяемый пример поможет:

  • Используете ли вы другие внешние библиотеки?
  • Вы связываете статически или динамически?
  • Вы меняли флаги как -O или -s?

Ответ 4

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

Ответ 5

Для этого использовались компиляторы DEC VMS. Причина в том, что оптимизатор может лучше справляться с более свободной оперативной памятью, с которой ей приходилось работать. Очевидно, что очень трудно получить то же самое количество свободной RAM, доступное при каждом компиляции.

Помню, в то время некоторые люди были потрясены этим. Это было особенно актуально для людей, которым нравилось проверять исходные изменения путем сравнения полученных двоичных файлов. Мой совет, как сейчас, это преодолеть это. Источники вы можете "различать". Для двоичных файлов единственной гарантией является то, что оба исполняемых файла, скомпилированные из тех же исходных файлов, будут делать то, что вы им сказали.

Ответ 6

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

Ответ 7

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

  • компилятор может помещать информацию о пути/имени о файлах, вложенных в компиляцию, либо для отладки информации, либо из-за использования макроса __FILE__. Возможно, что это может сделать это для его собственных целей, которые не имеют никакого отношения ни к одной из этих вещей. Если сборка происходит на разных машинах с даже немного другой структурой каталогов, это может учитывать различия в двоичном файле.
  • аналогично для даты/времени сборки, хотя я бы ожидал, что они найдут свой путь в двоичном коде гораздо реже (но что я знаю?). Если бы это было фактором, вы бы увидели разный размер даже из идентичных сборок на одной машине, только в разное время enuogh.

Эти вещи сводятся к различиям в состоянии машины сборки как указал Нил Баттерворт.