Как вызывать вложенные функции GCC без исполняемого стека
Indirect Calling of Nested Functions on GCC Without Executable Stack
В статье Мартина Уекера рассматривается проблема вызова вложенных функций GCC на старых версиях компилятора, когда использование trampoline (переходных областей на стеке) требует исполняемого стека. Автор предлагает обходной путь: извлекать адрес кода и статическую цепочку из trampoline и вызывать функцию напрямую с помощью встроенной функции `__builtin_call_with_static_chain`. Это позволяет очистить флаг исполняемого стека с помощью `patchelf --clear-execstack`, сохраняя функциональность. Также обсуждается идея использования trampoline как дескриптора функции с интерпретацией его кода в точке вызова.
Вместо вызова trampoline мы интерпретируем его код в точке вызова с помощью суперпростого интерпретатора, который может интерпретировать только эту конкретную последовательность команд и настолько прост, что может быть встроен.
- inigyou
Самомодифицирующийся код — это круто. Жаль, что пришлось отключить его ради безопасности.
- mananaysiempre
По теме: предыдущая статья из серии, https://news.ycombinator.com/item?id=49308685 (103 очка, 47 комментариев)
- gue5t
Сначала меня раздражало чтение синтаксиса AT&T. Потом я потерял ориентацию, осознав, что следующий фрагмент написан в синтаксисе AT&T без символа '%' для регистров. Но сама техника — классная.
- Dwedit
Зачем вам исполняемый стек? Вы вызываете через указатель на функцию, при использовании указателя на функцию не задействована исполняемая память для чтения/записи.