2010-11-11 4 views
0

У меня есть рабочая программа, скомпилированная с gcc 3.44, но когда я скомпилировал ее снова, используя 4.44, что-то не так. Некоторые из локальных переменных в функции, по-видимому, изменяются неизвестными, так что цикл for не заканчивается, потому что переменная в ее состоянии постоянно изменяется на 0, даже если она увеличивается. Вызов функции в цикле, кажется, в порядке, потому что он вернул правильный адрес. Я попытался отслеживать значение переменной, в которой затронут цикл, я узнал, что значение изменяется после вызова функции печати в ветке if, удаление или добавление большего количества запросов на печать решает его, но я думаю, что это не имеет никакого отношения к функция печати и нет кода, который модифицирует эту переменную, кроме только инкремента в цикле. Я также попытался отслеживать esp в начале и в конце цикла, это то же самое. Что могло вызвать проблему?проблема стека

+3

Похоже на коррупцию в стеке. Переверните код. – sharptooth

+1

Я могу полностью прочитать ваш код здесь ¬_¬ Другими словами, вы хотите, чтобы мы помогли вам рассказать вам, что ваша проблема, или просто общий ответ, другими словами, дать больше информации, конкретно код – thecoshman

+0

код довольно длинный. .. на самом деле это детектор движения ATA на шине pci для моего загрузчика. Мне просто интересно, почему он работал на более старых gcc. – prinzrainer

ответ

0

Если это действительно проблема с вашими функциями печати, возможно, вы развращаете стек некоторыми параметрами вариационного списка? Возможно, предположение о том, что у вас есть один из стандартных типов данных или констант перечисления, больше не существует? Это ваши собственные функции печати? Затем попробуйте использовать расширение __attribute__ gcc для проверки типа времени компиляции.

+0

Я не пробовал 4.41 4.42, но у меня есть 4.44 ... – prinzrainer

1

Вы заявили, что собираетесь перейти от GCC v3.44 (где работает код) до версии 4.4, где код сломан.

Убедитесь, что все остальные части программы (все исходные файлы и файлы библиотек) также скомпилированы с помощью GCC v4.44. Вы вызываете функцию печати, поэтому я предполагаю, что вы ссылаетесь на стандартную функцию printf в glibc. Поэтому убедитесь, что glibc также скомпилирован под v4.44.

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