А при чём тут транслятор, если в ELF-файле нет информации по которой можно посчитать размер стека?
Извините, линковщик. Хотя, сейчас я точно не помню, но есть директива ассемблера, в которой задаётся размер стека. Я не знаком с ELF - файлами, и с Linux тоже не знаком. Все написанные мной программы были под MS-DOS или Windows.
А при чём юзерспейс и маппинг? Речь шла, как я понял, об этапе сборки самой программы, а не о её выполнения. О механизмах лимитирования памяти системой речи не шло. Это мы думаем, что под программу и её компоненты система выделит заявленный объём памяти, а на самом деле это не всегда так. Ещё это зависит от выбранной модели памяти. Короче, в таком случае нужно уточнять конкретно о чём идёт речь! И, размер стека - это забота самого программиста, а не системы или транслятора, или того же линкера.
Так, а теперь ещё раз извиняюсь за то, что ввёл всех в некоторое заблуждение, и себя в том числе. Как там "C" или Unix решают этот вопрос мне пофиг(вероятно подсчётом команд push/pop и call/ret). Я увидел, что речь шла об исполнимом, ассемблерном коде и решил поделиться своим опытом. Всё.
-- Вт фев 28, 2017 17:51:31 --Для Windows.
При старте программы размер стека описан в заголовке exe файла, а туда помещается именно линкером при компиляции. При старте же дополнительного потока размер стека можно указывать явно - в Win32API есть CreateThread с параметром начального размера стека.
Да! Вот здравый ответ, а то у меня что-то мозг начал дымиться. В модели памяти Windows(flat model), все сегментные регистры настраиваются на один сегмент, за исключением некоторых. Подсчитать размер стека до байта невозможно, если это не какая-нибудь
виртуализация стека. Минимальным размером стека будет наверно параграф.