Spec-Zone.ru › GCC 6

9 Двоичная совместимость

Двоичная совместимость охватывает несколько взаимосвязанных понятий:

интерфейс двоичного приложения (ABI)

Набор соглашений выполнения, которые следуют все инструменты, работающие с двоичными представлениями программы, включая компиляторы, ассемблеры, компоновщики и поддержку языка выполнения. Некоторые ABI формализованы со спецификацией, возможно разработанной несколькими заинтересованными сторонами. Другие просто представляют собой способ выполнения конкретного набора инструментов.

соответствие ABI

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

конвенции вызова

Конвенции вызова — это подмножество ABI, которые определяют, как передаются аргументы и возвращаются результаты функций.

взаимодействие

Разные наборы инструментов взаимозаменяемы, если они генерируют файлы, которые могут быть использованы в одной программе. Набор инструментов включает компиляторы, ассемблеры, компоновщики, библиотеки, заголовочные файлы, файлы запуска и отладчики. Двоичные файлы, сгенерированные различными наборами инструментов, не взаимозаменяемы, если они не реализуют один и тот же ABI. Это относится как к разным версиям одних и тех же инструментов, так и к инструментам от разных поставщиков.

взаимовызываемость

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

определяемые реализацией особенности

Стандарты языка включают списки определяемых реализацией особенностей, поведение которых может различаться в различных реализациях. Некоторые из этих функций обычно покрываются ABI платформы, а другие — нет. Функции, которые не покрываются ABI, обычно влияют на поведение программы, но не на взаимовызываемость.

совместимость

Соответствие одному ABI и одинаковому поведению определяемых реализацией особенностей имеет значение для совместимости.

Реализованный C или C++ компилятором интерфейс двоичного приложения (ABI) влияет на генерацию кода и поддержку выполнения для:

  • размера и выравнивания типов данных
  • структуры сложных типов
  • конвенций вызова
  • конвенций использования регистров
  • интерфейсов для поддержки арифметики во время выполнения
  • форматов объектных файлов

Кроме того, интерфейс двоичного приложения (ABI), реализованный C++ компилятором, влияет на генерацию кода и поддержку выполнения для:

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

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

Большинство платформ имеют хорошо определенный ABI для C-кода, но ABI, охватывающие функциональность C++, пока не являются распространенными.

Начиная с GCC 3.2, двоичные соглашения GCC для C++ основаны на написанном, независимом от поставщика C++ ABI, который был разработан для 64-битного Itanium, но также включает общие спецификации, применимые к любой платформе. Этот C++ ABI также реализуется другими поставщиками компиляторов на некоторых платформах, в частности, системах GNU/Linux и BSD.

Мы постарались предоставить стабильный ABI, совместимый с будущими выпусками GCC, но есть вероятность столкнуться с проблемами, которые могут затруднить это. Такие проблемы могут включать различные интерпретации C++ ABI различными поставщиками, ошибки в самом ABI или ошибки в реализации ABI в различных компиляторах. Переключатель GCC -Wabi предупреждает, когда G++ генерирует код, который, вероятно, несовместим с C++ ABI.

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

Когда G++ и другой C++ компилятор соответствуют одному и тому же C++ ABI, но реализации Стандартной C++ библиотеки, которые они обычно используют, не следуют одному и тому же ABI для Стандартной C++ библиотеки, объектные файлы, созданные этими компиляторами, могут быть использованы в одной программе только в том случае, если они используют одну и ту же C++ библиотеку. Это требует указания местоположения заголовочных файлов C++ библиотеки при вызове компилятора, чья обычная библиотека не используется. Местоположение заголовочных файлов C++ GCC зависит от того, как был сконфигурирован сборщик GCC, но его можно увидеть, используя опцию G++ -v.

-Igcc_install_directory/include/c++/3.3

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

Самый простой способ связать программу для использования конкретной C++ библиотеки — использовать C++ драйвер, который по умолчанию указывает на эту C++ библиотеку. Например, драйвер g++ сообщает компоновщику, где найти C++ библиотеку GCC (libstdc++) плюс другие необходимые библиотеки и файлы запуска в правильном порядке.

Если программа должна использовать другую C++ библиотеку, и нет возможности выполнить окончательную компоновку с помощью C++ драйвера, использующего эту библиотеку по умолчанию, необходимо указать g++ расположение и имя этой библиотеки. Возможно, также потребуется указать различные файлы запуска и другие библиотеки поддержки выполнения, а также подавить использование библиотек поддержки GCC с помощью одного или нескольких параметров -nostdlib, -nostartfiles и -nodefaultlibs.

Далее: Gcov, Предыдущее: Objective-C, Вверх: Главная [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Compatibility.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API