Если я создаю один и тот же исходный код, то ссылаюсь на одну и ту же версию тех же библиотек, с той же цепочкой инструментов (тот же компилятор, компоновщик и т. Д., GCC 4.4), с той же версией той же операционной системы (Centos 5 Linux в моем дело) но на двух разных машинах;
Разумно ли предполагать, что создаваемые двоичные файлы должны быть идентичными?
В этом контексте мой код имеет «неопределенное поведение», которое «работает» на одной конфигурации, но не на другой, очевидный ответ — это исправить это, но мне было бы интересно узнать, если мое предположение о том, что создаваемые двоичные файлы должны быть идентичны, правильный.
Я заметил разницу в размере в несколько сотен байтов, расположение символов, показанных с помощью команды «nm», немного отличается, даже если символы одинаковы.
Обычно я ожидаю, что дата и / или метаданные будут немного отличаться даже между сборками на одном хосте.
Вы также забыли упомянуть флаги компилятора, (оптимизация и #define
s из командной строки, например).
Однако я изначально подозреваю, что файлы должны иметь одинаковый размер, что приводит нас к выводу, что что-то является не то же самое в двух системах. Наиболее вероятными кандидатами являются системные заголовки (только одна функция корневого уровня в установке ОС может привести к совершенно другому виду этих файлов) и любые зависимые библиотеки.
Вы можете проверить, что заголовки одинаковы, предварительно обработав g++ -E
или похожие. Вы также можете перейти по пути к библиотеке и подтвердить, что связанные файлы идентичны в каждой системе.
Других решений пока нет …