>Что собственно такое ABI? поясните пожалуйста популярным языком,
>чтобы было понятно.
Не знаю, насколько популярен мой язык, однако попробую.
ABI есть Application Binary Interface. В самом общем смысле
это протокол (способ, порядок, описание структур данных
и последовательности вызовов) взаимодействия структурных
элементов программы (обычно в рамках одного процесса).
Например, ABI языка C определяет порядок передачи параметров
и вызова субпрограмм, стандартные типы данных (включая их
машинное представление) и прочее.
Очевидно, что полное описание ABI является машинно-зависимым.
Вместе с тем, немалая его часть определяется, по сути,
потребностями языка программирования, и потому является
машинно- (и даже платформенно-) независимой. Так, соглашение
о том, что в начало имен функций C, помещаемых в библиотеку,
добавляется символ '_', действует в самых разнообразных
системах, включая OpenVMS, разновидности UNIX и Win32.
Наиболее "популярен" термин ABI в контексте языка C++.
Причина состоит в том, что долгое время производители
компиляторов не могли договориться об этом самом ABI,
что приводило к полной невозможности использовать
C++ библиотеки, собранные с использованием одного компилятора,
в программах, собираемых другим компилятором. В настоящий
момент ситуация постепенно улучшается, однако всё ещё далека
от идеала, так как, несмотря на появление стандарта,
существует мало компиляторов, ему следующих, и даже
между компиляторами, следующими (вроде бы) стандарту,
сохраняются проблемы с совместимостью. Основная сложность
связана с необходимостью единообразной упаковки (mangling)
типов функций и переменных в имена, используемые при
сравнении типов и разрешении ссылок на символы.
Отдельным геморроем является несовместимость реализаций
STL, используемых различными производителями компиляторов,
так что для создания библиотек, по-настоящему независимых от
компилятора, применяемого пользователем, по-прежнему
лучше использовать чистый C.