Я хочу знать, что использовать параметр -mpreferred-stack-boundary
во время компиляции в компиляторе GNU. Я проверил документацию, но объяснение потеряно. Не мог бы кто-нибудь объяснить это.gcc -mpreferred-stack-boundary option
ответ
Я хочу знать, что использует параметр -mpreferred-stack-edge во время компиляции в отладчике GNU.
У опции есть абсолютно ничего, чтобы сделать с отладчиком.
Это влияет на сгенерированный код в двоичном формате. По умолчанию GCC организует все, чтобы каждая функция сразу после входа указала свой стек на 16-байтовую границу (это может быть важно, если у вас есть локальные переменные, и активируйте инструкции sse2
).
Если вы измените значение по умолчанию, например, -mpreferred-stack-boundary=2
, тогда GCC будет выровнять указатель стека на 4-байтной границе. Это уменьшит требования к стеку ваших подпрограмм, но приведет к сбою, если ваш код (или код, который вы вызываете) делает использовать sse2
, так как обычно это не безопасно.
Это связано с границами байтов, которые использует ваша программа, когда она выложена в памяти.
Что такое граница стека = 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.
- 1. -lpthread option of gcc
- 2. gcc std = gnu ++ 0x option
- 3. gcc -fno-stack-protector option
- 4. arm-none-eabi-gcc: -march option v/s -mcpu option
- 5. Более тонкое поведение gcc -Wshadow option
- 6. Узнайте, что делает данный gcc Option/Flag?
- 7. gcc debug symbols (-g flag) vs linking -rdynamic option
- 8. Ошибка поиска символа при использовании -Wl, - defsym GCC option
- 9. Datepicker on option option
- 10. Option буквальных против переменной Option
- 11. Кнопка Option Option Reset Macro
- 12. Все версии gcc поддерживают опцию gcc gfile?
- 13. unrecognized -a option `ck_size '
- 14. Различные семантики Option/Option в Java
- 15. AngularJS ng-options Ajax default option option
- 16. Scala Option ||
- 17. Как сменить python gcc на gcc 4.8?
- 18. segfault при попытке доступа к структуре; compile option - gcc -std = c99
- 19. Что делает опция «compiler option» -auxbase-strip?
- 20. GCC: маскировка между версиями GCC
- 21. Scala: Option [Seq [String]] vs Seq [Option [String]]?
- 22. set option "selected" attribute from dynamic created option
- 23. jquery on change возвращает <option></option>
- 24. Scala Option [Future [T]] to Future [Option [T]]
- 25. Выбор контента в <option></option> тегов
- 26. Future [Option [Future [Option [Boolean]] Упрощение фьючерсов и опций?
- 27. Future [Option [Future [Int]]] to Future [Option [Int]]
- 28. Что означает gcc -pthread?
- 29. Расширение <option>
- 30. jQuery draggable cancel option
+1 Следует отметить, что фактический размер границы составляет 2^PSB. Если вы установите этот параметр равным 2, вы получите размер границы 2^2 = 4. Если вы установите значение 4, вы получите размер границы 2^4 = 16. –