Spec-Zone.ru › GCC 11

Далее: gcov—Программа тестирования покрытия, Предыдущее: Особенности GNU Objective-C, Вверх: Введение [Содержание][Индекс]

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++ основаны на написанном, независимом от поставщика 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—Программа тестирования покрытия, Предыдущее: Особенности GNU Objective-C, Вверх: Введение [Содержание][Индекс]

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

Spec-Zone.ru

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