🧠 Что такое SysV ABI
SysV ABI (System V Application Binary Interface) — соглашение о вызовах, определяющее, как функции взаимодействуют друг с другом на уровне assembly и binary interface. Оно описывает, какие регистры используются для передачи аргументов, какие сохраняются, как выравнивается стек, как возвращаются значения, как передаётся struct и вызывается variadic function.
На платформе x86_64 SysV ABI — это стандарт де‑факто в Linux, FreeBSD, macOS и других UNIX‑подобных системах.
⚙️ Передача аргументов
Первые 6 аргументов передаются через регистры (в порядке):
RDI
RSI
RDX
RCX
R8
R9
Остальные аргументы передаются через стек (справа налево). Плавающие числа — через XMM0
–XMM7
.
⚙️ Возврат значений
- Целочисленные и указательные значения — через
RAX
long double
, структуры ≤ 16 байт —RAX:RDX
- Более сложные структуры — через указатель, передаваемый в скрытом первом аргументе
⚙️ Сохраняемые и временные регистры
Регистр | Статус | Назначение |
---|---|---|
RBP , RBX , R12 –R15 | сохраняются вызываемым | нужно сохранять при использовании |
RAX , RCX , RDX , RSI , RDI , R8 –R11 | временные | можно перезаписывать |
Вызываемая функция обязана сохранять содержимое сохраняемых регистров, если она их использует.
⚙️ Стек и выравнивание
- Выравнивание стека — 16 байт
- До вызова
call
стек должен быть выровнен - После вызова,
ret
возвращает управление, и вызывающая функция должна очистить стек (если использовалсяpush
)
✅ Преимущества
- Чёткая спецификация: легко писать freestanding, naked, asm‑функции
- Унификация: работает одинаково на всех POSIX‑платформах
- Совместимость: GCC, Clang, LLVM, libc, Zig, Rust — все используют SysV ABI
❌ Недостатки
- Отличается от Windows x64 ABI (другие регистры, соглашения)
- Трудно отлаживать ошибки при несоблюдении соглашения
- Требует ручного соблюдения при низкоуровневой разработке
⚙️ Где применяется
- ASMX, TinyCC, libc-free и ядро‑разработка
- JIT, VM, syscall wrapper’ы
- Интеграция C‑функций в Rust, Zig, Go
- Разработка минималистичных ELF‑бинарников и init‑утилит
🔗 Вывод
SysV ABI — основа взаимодействия между функциями и бинарями в Linux‑экосистеме. Для системного программиста знание ABI — это ключ к написанию совместимого, безопасного и контролируемого машинного кода.