ABI, даже для C, имеет части, которые не зависят от платформы, части, которые зависят от процессора (какие регистры должны быть сохранены, которые используются для передачи параметров, ...) и части, которые зависят от ОС (более или менее те же факторы, что и для процессора, так как некоторые варианты выбора не навязываются архитектурой, а являются результатом компромиссов, плюс некоторые ОС имеют независимое от языка понятие исключения, и поэтому компилятор для любого языка должен генерировать правильноечто бы справиться с этим, обработка потоков может также навязывать вещи в ABI - если регистр указывает на TLS, вы не можете использовать его для того, что хотите).
Теоретически, каждый компилятор может иметь свойсобственный ABI.Но обычно для пары процессор / ОС ABI устанавливается поставщиком ОС, который часто также предоставляет компилятор C и общие библиотеки, которые используют ABI и конкуренты, которые предпочитают быть совместимыми.(Я не удивлюсь, если есть исключения для некоторых ОС, для которых C не является основным языком программирования.)
Но поставщик ОС может переключить ABI по той или иной причине (новые версии процессоров).может иметь функции, которые вы хотите использовать в ABI для одного - например, некоторые просили 32-битный ABI для x86_64, позволяющий использовать все регистры).На этапе миграции, который может длиться очень долго, вам, возможно, придется работать с двумя ABI.