опция 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 по крайней мере