Опция gcc -mpreferred-stack-boundary

Я хочу знать, что использовать параметр -mpreferred-stack-boundary во время компиляции в компиляторе GNU. Я проверил документацию, но объяснение потеряно. Не мог бы кто-нибудь объяснить это.

Ответ 1

Я хочу знать, что использовать параметр -mpreferred-stack-border во время компиляции в отладчике GNU.

Этот параметр не имеет абсолютно никакого отношения к отладчику.

Это влияет на сгенерированный код в вашем двоичном файле. По умолчанию GCC будет упорядочивать все так, чтобы каждая функция сразу же после входа указала свой стек на 16-байтовую границу (это может быть важно, если у вас есть локальные переменные и включить инструкции sse2).

Если вы измените значение по умолчанию, например, -mpreferred-stack-boundary=2, то GCC будет выровнять указатель стека с 4-байтной границей. Это уменьшит требования к стеку ваших подпрограмм, но приведет к сбою, если ваш код (или код, который вы вызываете) использует sse2, поэтому обычно небезопасен.

Ответ 2

Это связано с границами байтов, которые использует ваша программа, когда она выложена в памяти.

Что такое граница стека = 2, это гарантирует, что стек настроен на инкременты размера слова, это предотвратит оптимизацию вашего компьютера.

Если вы посмотрите:

`info gcc and search by entering "/mpreferred-stack-boundary"` it says:
>-mpreferred-stack-boundary=num
> 

Попытайтесь сохранить границу стека, выровненную на 2, поднятую до границы числа байтов. Если -mpreferred-stack-граница не указана, по умолчанию 4 (16 байт или 128 бит).

Граница стека по умолчанию для 4 одинакова для машин Intel 386 и AMD x86-64.

Когда я пытаюсь использовать параметр "m-preferred-stack-border = 2" на моей 64-битной машине Linux, компиляция завершается с ошибкой

"- mpreffered-stack-border = 2 не находится между 4 и 12".

Это связано с тем, что ширина поля адреса была увеличена с 4 до 8 байтов на 64-битных машинах. Поэтому он не может писать отдельные куски на границе стека = 2, потому что 2 ^ 2 = 4 байта. Однако интересно, что граница стека 3 по-прежнему возвращает ошибку как на 32, так и на 64-битных машинах, которая была бы 8-байтовой границей.

Я не могу включить ссылку, потому что у меня нет 10 репутации... но поиск довольно легко набирает информацию Насколько я могу сказать, это функция безопасности, потому что 8 байтов склонны к смещению стека... без сомнения, кто-то знает лучше или имеет более подробную информацию.

Как был смещен стек Говорит:

Чтобы обеспечить правильное выравнивание этих значений в стеке, граница стека должна быть такой же, как и для любого значения, хранящегося в стеке. Кроме того, каждая функция должна быть сгенерирована так, чтобы она поддерживала выравнивание стека. Таким образом, вызов функции, скомпилированной с более высокой предпочтительной границей стека из функции, скомпилированной с более низкой предпочтительной границей стека, скорее всего, приведет к смещению стека. Рекомендуется, чтобы библиотеки, использующие обратные вызовы, всегда использовали настройку по умолчанию.

Это дополнительное выравнивание потребляет дополнительное пространство стека и обычно увеличивает размер кода. Код, чувствительный к использованию пространства стека, такой как встроенные системы и ядра операционной системы, может захотеть уменьшить предпочтительное выравнивание до -mpreferred-stack-border = 2.