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