LINUX.ORG.RU

История изменений

Исправление Moisha_Liberman, (текущая версия) :

… надо выставить CAP_SYS_RESOURCE capability. Тогда в принципе, возможно и без root. Но, если честно, то программы, имеющие возможность переопределять системные ресурсы лучше не бросать совсем уж «без присмотра».

В Windows можно, в заголовке исполняемого файла PE есть размер стека.

В Linux смысла нет особого размер стека в elf прописывать. Хотя, в принципе, линкер посредством ld-скриптов может сгенерировать весьма изысканные и причудливые elf файлы и системный загрузчик их загрузит в память и сегменты даже раскидает по местам, но в Linux для основного потока сохраняется ещё море всякой всячины – переменные окружения, аргументы командной строки (насколько я помню, хотя, и могу ошибаться), т.е. достаточно принять некое разумное общесистемное решение – типа 8К или 10К и дальше его использовать. Системный загрузчик тогда, при старте программы на исполнение, при размещении сегментов в памяти, на лету создаст для данного процесса сегмент стека так, как это принято в данной системе (где-то 8К, где-то 10К). Он же задаст адреса, откуда считать смещение, т.к. в системах без ASLR это делается одним образом, в системах с ASLR – другим, дальше просто пнёт проц на начало сегмента кода, да и всё.

А так-то, в принципе, если будет нужно для какой-то причудливой архитектуры, то вполне возможно и в elf файл прописать.

Вот что может быть в заголовке elf-файла, так это указание на то, является ли сегмент стека исполняемым. Это тоже определяется конкретной системой (версией Linux и её конфигурацией). Например, у меня в генточке везде, что на десктопе, что на ARM, что на серверах стек неисполняемый по-дефолту.

P.S. Если глянуть любой elf в x86_64 через readelf -a prog_name, то там будет сегмент GNU_STACK, но у него размер будет нулевой. Он будет изменён при старте приложения согласно того, как в ulimit указан размер стека.

Исправление Moisha_Liberman, :

… надо выставить CAP_SYS_RESOURCE capability. Тогда в принципе, возможно и без root. Но, если честно, то программы, имеющие возможность переопределять системные ресурсы лучше не бросать совсем уж «без присмотра».

В Windows можно, в заголовке исполняемого файла PE есть размер стека.

В Linux смысла нет особого размер стека в elf прописывать. Хотя, в принципе, линкер посредством ld-скриптов может сгенерировать весьма изысканные и причудливые elf файлы и системный загрузчик их загрузит в память и сегменты даже раскидает по местам, но в Linux для основного потока сохраняется ещё море всякой всячины – переменные окружения, аргументы командной строки (наскольGNU_STACKко я помню, хотя, и могу ошибаться), т.е. достаточно принять некое разумное общесистемное решение – типа 8К или 10К и дальше его использовать. Системный загрузчик тогда, при старте программы на исполнение, при размещении сегментов в памяти, на лету создаст для данного процесса сегмент стека так, как это принято в данной системе (где-то 8К, где-то 10К). Он же задаст адреса, откуда считать смещение, т.к. в системах без ASLR это делается одним образом, в системах с ASLR – другим, дальше просто пнёт проц на начало сегмента кода, да и всё.

А так-то, в принципе, если будет нужно для какой-то причудливой архитектуры, то вполне возможно и в elf файл прописать.

Вот что может быть в заголовке elf-файла, так это указание на то, является ли сегмент стека исполняемым. Это тоже определяется конкретной системой (версией Linux и её конфигурацией). Например, у меня в генточке везде, что на десктопе, что на ARM, что на серверах стек неисполняемый по-дефолту.

P.S. Если глянуть любой elf в x86_64 через readelf -a prog_name, то там будет сегмент GNU_STACK, но у него размер будет нулевой. Он будет изменён при старте приложения согласно того, как в ulimit указан размер стека.

Исходная версия Moisha_Liberman, :

Если без root, то...

… надо выставить CAP_SYS_RESOURCE capability. Тогда в принципе, возможно и без root. Но, если честно, то программы, имеющие возможность переопределять системные ресурсы лучше не бросать совсем уж «без присмотра».

В Windows можно, в заголовке исполняемого файла PE есть размер стека.

В Linux смысла нет особого размер стека в elf прописывать. Хотя, в принципе, линкер посредством ld-скриптов может сгенерировать весьма изысканные и причудливые elf файлы и системный загрузчик их загрузит в память и сегменты даже раскидает по местам, но в Linux для основного потока сохраняется ещё море всякой всячины – переменные окружения, аргументы командной строки (насколько я помню, хотя, и могу ошибаться), т.е. достаточно принять некое разумное общесистемное решение – типа 8К или 10К и дальше его использовать. Системный загрузчик тогда, при старте программы на исполнение, при размещении сегментов в памяти, на лету создаст для данного процесса сегмент стека так, как это принято в данной системе (где-то 8К, где-то 10К). Он же задаст адреса, откуда считать смещение, т.к. в системах без ASLR это делается одним образом, в системах с ASLR – другим, дальше просто пнёт проц на начало сегмента кода, да и всё.

А так-то, в принципе, если будет нужно для какой-то причудливой архитектуры, то вполне возможно и в elf файл прописать.

Вот что может быть в заголовке elf-файла, так это указание на то, является ли сегмент стека исполняемым. Это тоже определяется конкретной системой (версией Linux и её конфигурацией). Например, у меня в генточке везде, что на десктопе, что на ARM, что на серверах стек неисполняемый по-дефолту.