Как вызывать вложенные функции GCC без исполняемого стека

Indirect Calling of Nested Functions on GCC Without Executable Stack

В статье Мартина Уекера рассматривается проблема вызова вложенных функций GCC на старых версиях компилятора, когда использование trampoline (переходных областей на стеке) требует исполняемого стека. Автор предлагает обходной путь: извлекать адрес кода и статическую цепочку из trampoline и вызывать функцию напрямую с помощью встроенной функции `__builtin_call_with_static_chain`. Это позволяет очистить флаг исполняемого стека с помощью `patchelf --clear-execstack`, сохраняя функциональность. Также обсуждается идея использования trampoline как дескриптора функции с интерпретацией его кода в точке вызова.

Вместо вызова trampoline мы интерпретируем его код в точке вызова с помощью суперпростого интерпретатора, который может интерпретировать только эту конкретную последовательность команд и настолько прост, что может быть встроен.
  1. inigyou

    Самомодифицирующийся код — это круто. Жаль, что пришлось отключить его ради безопасности.

  2. mananaysiempre

    По теме: предыдущая статья из серии, https://news.ycombinator.com/item?id=49308685 (103 очка, 47 комментариев)

  3. gue5t

    Сначала меня раздражало чтение синтаксиса AT&T. Потом я потерял ориентацию, осознав, что следующий фрагмент написан в синтаксисе AT&T без символа '%' для регистров. Но сама техника — классная.

  4. Dwedit

    Зачем вам исполняемый стек? Вы вызываете через указатель на функцию, при использовании указателя на функцию не задействована исполняемая память для чтения/записи.

Ещё за этот день

2026-08-29