опция GCC-mpreferred-stack-граница

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

3 ответов


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

опцион абсолютно ничего для работы с отладчиком.

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

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


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

что делает граница стека=2, это гарантирует, что стек настроен на приращения размера dword, это мешает вашей машине оптимизировать стек.

Если вы:

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

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

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

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

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

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

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

как стек получил смещение Говорит:

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

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


правильно, полезно использовать-mpreferred-stack-boundary с 2, чтобы легко разобрать, что происходит, иначе он будет оптимизирован и трудно отслеживать, что происходит в стеке. для 64 бит справа вам нужно 4 по крайней мере