четверг, марта 29, 2007

Что такое C++ ABI

ABI - это сокращение от Application Binary Interface. В C++ ABI описываются подробности на двоичном уровне, которые не специфицируются в Стандарте. Стандарт описывает общее поведение, но не говорит как оно должно быть реализовано. Например, в Стандарте говорится как должны себя вести виртуальные функции, но на реализации этого поведения через виртуальные таблицы никто не настаивает.
Как будут располагаться в памяти классы, как виртуальные таблицы, передача параметров, реализация RTTI и т.п. - все это описывается в ABI.
Если два компилятора на одной и тоже же платформе будут следовать разным ABI, то не будет совместимости на уровне двоичного кода, нельзя будет код от двух компиляторов слинковать, например.

Какого-то единого C++ ABI нет, хотя бы потому, что оно зависит от платформы. Есть попытки как-то все более-менее стандартизовать, например есть C++ ABI для Итаниумов и gcc его поддерживает с версии 3.2. Потом они реализацию этого ABI еще правили некоторое время. В итоге были проблемы с совместимостью скомпилированного кода, народ с gcc после смены ABI ругался на проблемы при линковке.

На Макинтошах есть свой C++ ABI, вот тут он лежит: Macintosh C/C++ ABI Overview
Updated 29.03.2007
Alexey Zakhlestin поправляет: То, что по ссылке, имеет отношение к классическим макинтошам, на которых код компилировался через MetroWerks. На дворе давно уже MacOS-X которая по умолчанию использует GCC (на настоящий момент gcc-4.0.1) со всеми вытекающими

В Windows стандартом ABI является Visual C++, но его ABI не опубликован и ему сложно следовать. Хотя по слухам народ его reverse engineer'ил и таки реализовывал. Я не знаю, стали ли Микрософтовцы в итоге придерживаться вышеупомянутого ABI для Итаниумов или нет.

Ссылки по теме:
comp.lang.c++.moderated C++ ABI
comp.lang.c++.moderated ABI?

11 коммент.:

Alexey Zakhlestin комментирует...

Про макинтош ты погорячилась… процитирует ведь кто-нибудь. То что по ссылке имеет отношение к классическим макинтошам на которых код компилировался через MetroWerks

На дворе давно уже MacOS-X которая по-умолчанию использует GCC (на настоящий момент gcc-4.0.1) со всеми вытекающими

стоит поправить текст…

Alena комментирует...

стоит поправить текст…

Поправила, спасибо большое!

CyberZX комментирует...

Мне иногда снится идеальный мир. В котором С++ ABI единый для всех компиляторов в рамках конкретных платформ. Эх... мечты, мечты... :)

Анонимный комментирует...

В Unix x64 тоже используется IA64 ABI. Да и в Win x64 тоже ABI очень схож с вышеупомянутым.

Alena комментирует...

В Unix x64 тоже используется IA64 ABI. Да и в Win x64 тоже ABI очень схож с вышеупомянутым.

Я когда читала про IA64 ABI у меня сложилось впечатление, что это такой душевный порыв, который в итоге закончился практически ничем.
Я пыталась найти какой-нибудь список компиляторов с указанием того какой компилятор какой ABI поддерживает, но ничего не нашла...

Анонимный комментирует...

C++ ABI используемый в ADS и RVDS для ARMов.

http://www.arm.com/products/DevTools/ABI.html

LB комментирует...

"The GNU C++ compiler uses an industry-standard C++ ABI starting with version 3. Details can be found in the ABI specification."
В частности, можно линковать библиотеки, собранные Интеловским компилятором и gcc.

Анонимный комментирует...

А вот такой вопросик есть... может правда не в тему...
писал я как то свой Memory Pool
(VS2005) и размещал в нем объекты B, C, D, наследующие от А.. так вот работало это дело корректно только так
A{}
B:virtual public {}
без virtual крэшалось...
(дело было в вычислении size_of(B) (C,D) насколько я понял)
не смог я найти по этому поводу хелпов...структура классов - точно как я написал - один уровень только

Alena комментирует...

Анонимный
А вот такой вопросик есть... может правда не в тему... писал я как то свой Memory Pool

Я не возьмусь отлаживать такие вещи по словесному описанию...

Unknown комментирует...

есть C++ ABI для Итаниумов и gcc его поддерживает с версии 3.2

Надо уточнить, что это не специальный ABI для конкретной архитектуры (Itanium), а обобщённый ABI, который можно использовать для разных архитектур. Просто изначально он разрабатывался для Itanium. Во многом он опирается на System V ABI для языка C, для которого, в свою очередь, есть множество архитектурно-специфичных дополнений.

Анонимный комментирует...

Надо уточнить, что это не специальный ABI для конкретной архитектуры (Itanium), а обобщённый ABI, который можно использовать для разных архитектур. Просто изначально он разрабатывался для Itanium. Во многом он опирается на System V ABI для языка C, для которого, в свою очередь, есть множество архитектурно-специфичных дополнений.

Классное замечание спустя 10 лет!