2015-02-08 3 views
2

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

Например, у меня есть заголовочный файл, который объявляет структуру somestruct и функцию, которая возвращает структуру. Один исходный файл определяет эту функцию и компилируется компилятором A. Другой исходный файл использует функцию и скомпилирован компилятором B и связан с двоичным кодом другого исходного файла.

Если два компилятора создают два разных макета для somestruct, то какова структура переменной, возвращаемой функцией? Относится ли он к макету одного компилятора или будет ли ошибка памяти, когда второй исходный файл пытается получить доступ к элементам структуры, возвращенным первым исходным файлом? Это ошибка во время компиляции или времени ссылки?

+0

Если два компилятора генерируют разные макеты, это, вероятно, приведет к повреждению памяти. В общем, однако, компиляторы для одной и той же платформы (то есть,CPU и ОС) имеют тенденцию соответствовать какой-то ABI, поэтому это, как правило, не проблема (остерегайтесь компиляторов Microsoft, тем не менее - они склонны не соблюдать платформу ABIs ... но кто в здравом уме будет использовать инструментальную цепочку Microsoft в любом случае, когда есть альтернативы?) –

+3

@TheParamagneticCroissant Я думаю, что вы получили это назад. Windows - это платформа, и Microsoft определяет платформу и, следовательно, ABI. Когда другие компиляторы отклоняются, это их собственная чертова проблема, потому что * они * не смогут вызывать системные библиотеки и многие сторонние библиотеки. – delnan

+0

@ delnan О, дорогая. Это хорошо и теоретически, но там, где есть компиляторы, возраст старше MSVC & co., И Microsoft идет прямо против хорошо установленных стандартов де-факто ... да, вы можете сказать, что это их право, но приятно ли это делать ? едва. –

ответ

3

Функция возвращает структуру, как указано в ABI компилятора функции. Компилятор callle, будет просто рассматривать функцию так, как если бы она соответствовала ABI себя.

Предполагая, что два компилятора используют аналогичные ABI, в большинстве случаев ошибки не будут возникать во время компиляции или времени ссылки или даже во время выполнения. Для некоторых совместимых компиляторов, таких как Clang, GCC и Intel C Compiler для OS X и Linux, нет ошибок должен результат (если есть ошибки, то это ошибка компилятора). Однако в реальном мире обычно сложно найти полностью совместимые компиляторы (в большинстве случаев их ABI аналогичны, но не совсем то же самое, такие ошибки ABI будут еще сложнее отслеживать, потому что ваше приложение будет выглядеть нормально и сбой при некоторых действительно во время выполнения встречаются странные обстоятельства).

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

Кроме того, прохождение структур является другой головной болью с точки зрения ABI, потому что существует несколько структурных ABI, иногда даже разных в «совместимых» компиляторах, таких как GCC/MinGW и MSVC. (См. Также параметр -m[no-]ms-bitfields в GCC, который заставляет GCC использовать MSVC ABI для структур.) Я также видел некоторые случаи, когда прохождение структур по указателю равно more reliable, чем передача структур по значению.

3

Макет данных (например, структуры и т. Д.) И протокол вызовов (как выполняются на уровне процессора) определены в документе (конкретном процессоре и операционной системе), который называется Application Binary Interface. Если оба компилятора следуют одному и тому же ABI (для одного и того же процессора и той же операционной системы), их сгенерированный код должен быть совместимым.

См., Например, wikipage для x86 calling conventions и спецификация x86-64 ABI.

Name mangling, особенно для C++, также может быть проблемой.

Читай также Levine's book on Linkers and Loaders

Смежные вопросы