Ответ 1
ABI (Application Binary Interface) - это стандарт, который определяет сопоставление между низкоуровневыми концепциями на языках высокого уровня и возможностями конкретного машинного кода платформы аппаратного/ОС. Это включает в себя такие вещи, как:
- как типы данных C/С++/Fortran/... размещаются в памяти (размеры/выравнивание данных)
- как вложенные вызовы функций работают (где и как хранится информация о том, как вернуться к вызывающему функции, где в регистре CPU и/или аргументы функции памяти передаются)
- Как работает запуск/инициализация программы (какой формат данных имеет "исполняемый файл", как загружается код/данные, как работают библиотеки DLL...)
Ответы на них:
- зависит от языка (следовательно, у вас есть C ABI, С++ ABI, Fortran ABI, Pascal ABI... даже спецификация байт-кода Java, хотя таргетинг на "виртуальный" процессор вместо реального оборудования - это ABI)
- зависит от операционной системы (MS Windows и Linux на одном и том же оборудовании используют другой ABI),
- аппаратные/процессорные (ARI и x86 ABI разные).
- эволюция (длительное) время (существующие ABI часто обновлялись/обновлялись, чтобы можно было использовать новые возможности процессора, например, указать, как регистры SSE x86 будут использоваться приложениями, конечно же, возможно только после того, как у процессоров были эти регистры, поэтому существующие ABI необходимо было уточнить).
Без какой-либо этой стандартизации (машинный) код, созданный разными компиляторами, не мог использовать библиотеки того же типа (как вы узнаете, каким образом библиотечный код ожидает передачи аргументов функции или структуры данных?).
Каждая платформа (комбинация определенного оборудования, программного обеспечения операционной системы и кода, написанного на определенных языках программирования/скомпилированных с конкретными компиляторами) определяет целый набор ABI, чтобы сделать вещи взаимоисключаемыми. Терминология в этой области не ясна, иногда люди просто говорят об "ABI", иногда называли ее "дополнением к платформе" или упоминали язык программирования и говорили, например, "С++ ABI". Имейте в виду, что нет такой вещи.
Документы, на которые вы ссылались в своем вопросе, являются конкретными примерами этого (языковые/операционные системы/аппаратные ABI).
Даже на конкретной платформе нет необходимости иметь один и только один ABI (набор), потому что разные подобные соглашения могут иметь разные преимущества (и, следовательно, обеспечивают лучшую производительность/меньший код/лучшее использование памяти /... - в зависимости от программа) и системные дизайнеры обычно стараются быть гибкими/допустимыми.
Например, на 32-битной Microsoft Windows существует множество ABI (fastcall, stdcall, pascal,...) для функции, вызывающей соглашения.
Во всяком случае, общий поиск stackoverflow для "ABI" (включая ссылки под "Связанной" боковой панелью) дает так много результатов для исследования этого вопроса, что я закрываю свой ответ на этом этапе.