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 в разных компиляторах. Переключатель GCC -Wabi предупреждает, когда G++ генерирует код, который, вероятно, несовместим с ABI C++.
Библиотека C++, используемая с компилятором C++, включает стандартную библиотеку C++, с функциональностью, определённой в стандарте C++, плюс поддержку выполнения языка. Поддержка выполнения включена в ABI C++, но нет формального ABI для стандартной библиотеки C++. Две реализации этой библиотеки совместимы, если одна следует фактическому ABI другой, и если обе построены с помощью одного компилятора или компиляторов, которые соответствуют одному ABI для компилятора C++ и поддержки выполнения.
Когда G++ и другой компилятор C++ соответствуют одному ABI C++, но реализации стандартной библиотеки 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-12.2.0/gcc/Compatibility.html