2012-04-20 4 views
11

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

ответ

9

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

У опции есть абсолютно ничего, чтобы сделать с отладчиком.

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

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

+2

+1 Следует отметить, что фактический размер границы составляет 2^PSB. Если вы установите этот параметр равным 2, вы получите размер границы 2^2 = 4. Если вы установите значение 4, вы получите размер границы 2^4 = 16. –

0

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

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

Если вы заканчивали:

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

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

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

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

«-mpreffered-стек граничной = 2 является не от 4 до 12 ".

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

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

How the stack got misaligned Говорит:

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

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

Смежные вопросы