Spec-Zone.ru › GCC 9

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

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

интерфейс прикладного программирования (ABI)

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

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

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

конвенции вызова функций

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

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

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

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

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

определяемые реализацией функции

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

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

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

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

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

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

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

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

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

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

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

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

-Igcc_install_directory/include/c++/3.3

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

Самый простой способ связать программу с использованием конкретной библиотеки C++ — использовать драйвер C++, который по умолчанию указывает на эту библиотеку C++. g++ драйвер, например, сообщает линковщику, где найти библиотеку GCC C++ (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-9.5.0/gcc/Compatibility.html

Spec-Zone.ru

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