Spec-Zone.ru › GCC 5

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, но нет формального ABI для стандартной библиотеки C++. Две реализации этой библиотеки совместимы, если одна следует фактическому 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-5.5.0/gcc/Compatibility.html

Spec-Zone.ru

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