🧠 Что такое SysV ABI

SysV ABI (System V Application Binary Interface) — соглашение о вызовах, определяющее, как функции взаимодействуют друг с другом на уровне assembly и binary interface. Оно описывает, какие регистры используются для передачи аргументов, какие сохраняются, как выравнивается стек, как возвращаются значения, как передаётся struct и вызывается variadic function.

На платформе x86_64 SysV ABI — это стандарт де‑факто в Linux, FreeBSD, macOS и других UNIX‑подобных системах.

⚙️ Передача аргументов

Первые 6 аргументов передаются через регистры (в порядке):

  1. RDI
  2. RSI
  3. RDX
  4. RCX
  5. R8
  6. R9

Остальные аргументы передаются через стек (справа налево). Плавающие числа — через XMM0XMM7.

⚙️ Возврат значений

  • Целочисленные и указательные значения — через RAX
  • long double, структуры ≤ 16 байт — RAX:RDX
  • Более сложные структуры — через указатель, передаваемый в скрытом первом аргументе

⚙️ Сохраняемые и временные регистры

РегистрСтатусНазначение
RBP, RBX, R12R15сохраняются вызываемымнужно сохранять при использовании
RAX, RCX, RDX, RSI, RDI, R8R11временныеможно перезаписывать

Вызываемая функция обязана сохранять содержимое сохраняемых регистров, если она их использует.

⚙️ Стек и выравнивание

  • Выравнивание стека — 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 — это ключ к написанию совместимого, безопасного и контролируемого машинного кода.