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++ указывает компоновщику, где найти библиотеку 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-7.5.0/gcc/Compatibility.html