Насколько я понимаю, сегментированные стеки построены с поддержкой компилятора, поэтому всякий раз, когда функция, выполняющаяся в сегментированном стеке, вызывает другую функцию, сначала проверяет, достаточно ли в стеке места для фрейма стека для этой новой функции. И если это не так, то прикрепляется еще один сегментированный стек и ветвь кода для этой функции.
Но работает ли это, например, если у меня работает оптоволокно, и я вызываю другую функцию из другой разделяемой (или скомпилированной в не общий объектный файл) библиотеки, которая не была скомпилирована с -fsplit-stack
вариант? Как функции в этой библиотеке знают, что им придется проверить, достаточно ли сегментированного стека в сегментированном стеке для продолжения?
Спасибо только за реализацию clang и gcc (и, в частности, в контексте boost), спасибо!
Я собираюсь вернуться к части документации, которую, как я помню, видел в предыдущем вопросе на эту тему:
[…]Обратная совместимость
Мы хотим иметь возможность использовать программы с разделенным стеком в системах с предварительно собранными библиотеками, скомпилированными без разделенных стеков. Это означает, что нам нужно убедиться, что в стеке достаточно места перед вызовом любой такой функции.
Каждый объектный файл, скомпилированный в режиме разделенного стека, будет аннотирован, чтобы указать, что функции используют разделенные стеки. Это, вероятно, должно быть отмечено примечанием, но в GNU нет общей поддержки создания произвольных примечаний
as
, Следовательно, каждый объектный файл, скомпилированный в режиме разделения стека, будет иметь пустой раздел со специальным именем:.note.GNU-split-stack
, Если объектный файл, скомпилированный в режиме разделения стека, включает некоторые функции сno_split_stack
атрибут, то объектный файл также будет иметь.note.GNU-no-split-stack section
, Это сообщит компоновщику, что некоторые функции могут не иметь ожидаемого пролога стека разделения.
Для вызовов из кода с разделенным стеком в код без разделенного стека компоновщик изменит начальные инструкции в функции разделенного стека (вызывающего). Это означает, что компоновщик должен иметь специальные знания инструкций, которые выдает компилятор. Результатом изменений будет увеличение требуемого размера кадра на число, достаточно большое, чтобы разумно работать для стека без разделения. Это будет целевой номер; по умолчанию будет что-то вроде 64K. Обратите внимание, что этот большой стек будет освобожден, когда вернется функция split-stack. Обратите внимание, что я игнорирую случай кода с разделенным стеком в общей библиотеке, вызывающий код без разделенного стека в основном исполняемом файле; это кажется маловероятной проблемой.
Я специально помню список (выделенный курсивом) предостережение — я не помню, чтобы это был я, кто выделил это или кто-то еще. Ключевое слово в этом обсуждении было о «обратных вызовах».
Других решений пока нет …