При отсутствии таких деталей, как целевая архитектура и версия компилятора, возможное объяснение таково:
В позиционно-зависимом коде оптимизация хвостовой рекурсии, по сути, заключается в повторном использовании текущего фрейма стека и замене рассматриваемого call
на jump
. Синтаксис может быть call function
заменен на jmp <small offset of function>
.
В позиционно-независимом коде вызов может быть записан call function@PLT
, если набор команд это позволяет (в данном примере это amd64). Его вполне можно заменить на jmp <small offset of function>@PLT
, но эти две настройки мешают работе, и, возможно, разработчики gcc не удосужились реализовать оптимизацию хвостового вызова в последнем режиме.