Как вы сказали, MacOS X имеет выравнивание по 16 байт, что означает, что машина ожидает, что каждая переменная в стеке начнется с байта, который кратен 16 из текущего указателя стека.
Когда стопка смещена, это означает, что мы начинаем пытаться читать переменные из середины этого 16-байтового окна и обычно заканчиваем с ошибкой сегментации.
Прежде чем вы вызовите рутину в своем коде, вам нужно чтобы убедиться, что ваш стек правильно выровнен; в этом случае, что означает, что регистр базового указателя делится на 16.
subq $8, %rsp # stack is misaligned by 8 bytes
movq %rdi, 8(%rsp) #
movq obj_size(%rdi), %rax #
imul $8, %rax #
movq %rax, %rdi #
callq _malloc # stack is still misaligned when this is called
Чтобы исправить это, вы можете subq
%rsp
получить что-то вроде 16 вместо 8.
subq $16, %rsp # stack is still aligned
movq %rdi, 16(%rsp) #
... #
callq _malloc # stack is still aligned when this is called, good