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