Может ли моя цепочка инструментов GCC (или версия моей цепочки инструментов GCC) создать другую схему памяти для объектов Drawable, чем в скомпилированном engine.a?
Да. Рассмотрим следующий глупый пример:
struct Drawable
{
#ifdef ENABLE_COUNTERS
int counter = 0;
#endif
// ...
};
Возможно, один человек скомпилировал -DENABLE_COUNTERS
, а кто-то другой - нет. Это нарушает правило единого определения. Или, возможно, была скомпилирована одна цепочка инструментов, где целые числа были 32-битными, а другая - с 64-битными.
Линкер, чтобы быть быстрым, не будет жаловаться;оно просто отбросит все, кроме одного определения, которое может привести к разным видам хаоса (вызовы виртуальных функций могут стать странными, так как смещения становятся неправильными).
Как я могу это знать и как я могу это сделатьбыть уверенным в правильном поведении?
gcc имеет flto-odr-type-merging
и -Wodr
, которые могут помочь вам при компиляции.
Google's ASAN также может проверить макеты памяти, чтобы убедиться, что они идентичны.
Относительно вашего редактирования только на внутренних компонентах компилятора.
Пожалуйста, обратитесь к руководству GCC по стабильности ABI: https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
Грубо говоря. Каждая основная версия компилятора имеет новый ABI. Более поздние второстепенные выпуски с тем же основным выпуском почти всегда совместимы.
Вы можете контролировать, на какой ABI вы ориентируетесь -fabi-version