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