Таинственная проблема со стеком в GCC 4.6.2 - PullRequest
0 голосов
/ 26 февраля 2012

Я работаю над игрушечной операционной системой Pintos в университете, но есть странная ошибка при использовании GCC 4.6.2.Когда я отправляю свои аргументы системного вызова (всего 3 pushl-ов во встроенной сборке), в стеке также появляются некоторые загадочные данные, и аргументы находятся в неправильном порядке.Установка -fno-omit-frame-pointer избавляет от странных данных, но аргументы все еще находятся в неправильном порядке.GCC 4.5 работает нормально.Любая идея, какая конкретная опция может это исправить?

ПРИМЕЧАНИЕ: проблема по-прежнему возникает с -O0.

Ответы [ 3 ]

1 голос
/ 26 февраля 2012

Без примера кода и списка результатов ваших разных компиляций вам трудно помочь.Но вот три возможных причины ваших проблем:

  1. Убедитесь, что вы понимаете, как аргументы помещаются в стек.Аргументы выдвигаются со спины.Это позволяет printf(char *, ...) изучить первый элемент, чтобы узнать, сколько их еще.Если вы хотите вызвать функцию int foo(int a, int b, int c), вам нужно нажать c , затем b и, наконец, a .
  2. Couldстранные данные в стеке - адрес возврата или EFLAGS?Я не знаю Pintos и как выполняются системные вызовы, но убедитесь, что вы понимаете разницу между CALL / RET и INT / IRET.INT помещает флаги в стек.
  3. Если у вашей встроенной сборки есть побочные эффекты, вы можете написать volatile / __volatile__ перед ней.В противном случае GCC разрешается перемещать его при оптимизации.

Мне нужно увидеть ваш код, чтобы лучше понять, что происходит.

0 голосов
/ 13 мая 2012

Вы очищали параметры в стеке после системного вызова? gcc может не знать, что вы касаетесь стека, и генерация кода зависит от ожидаемого указателя стека. -fno-omit-frame-pointer заставляет gcc использовать e / rbp для доступа к данным о местонахождении, но это просто скрывает фактическую проблему.

0 голосов
/ 28 февраля 2012

Преступник был -fomit-frame-pointer, который был включен по умолчанию с 4.6.2. -fno-omit-frame-pointer исправил проблему.

...