Spec-Zone.ru › GCC 8

9 Бинарная совместимость

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

интерфейс бинарного приложения (ABI)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Кроме того, интерфейс бинарного приложения, реализованный компилятором 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, но для Стандартной библиотеки C++ нет формального ABI. Две реализации этой библиотеки взаимодействуют, если одна следует фактическому ABI другой и если обе построены с одним и тем же компилятором или компиляторами, которые соответствуют одному и тому же ABI для компилятора C++ и поддержки во время выполнения.

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

-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-8.5.0/gcc/Compatibility.html

Spec-Zone.ru

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