2010-11-11 120 views
0

我得到了一个用gcc 3.44编译的工作程序,但是当我用4.44编译它时出现了错误。函数中的某些局部变量似乎被未知的修改过,因此for循环将不会终止,因为它的条件中的变量不断地变为0,即使它增加了。在循环中调用一个函数似乎没问题,因为它返回到了正确的地址。我试图跟踪循环受到影响的变量的值,我发现在if分支下调用打印函数后,该值被修改,删除或添加更多的打印呼叫可以解决它,但我认为它与无关打印函数并没有修改该变量的代码,除了循环中的增量外。我也试着在循环的开始和结束时跟踪esp,它是一样的。什么可能导致这个问题?堆栈问题

+3

看起来像堆栈损坏。滚入代码。 – sharptooth 2010-11-11 07:19:50

+1

我可以从这里完全阅读你的代码¬_¬,换句话说,你希望我们帮助你告诉你你的问题是什么或者只是一个通用的答案,换句话说,更多的信息代码 – thecoshman 2010-11-11 07:29:24

+0

代码很长。 ..它实际上是一个ATA驱动器检测器在PCI总线上为我的引导程序。我只是想知道为什么它在较老的GCC上工作。 – prinzrainer 2010-11-11 08:03:28

回答

0

如果这实际上是打印功能的问题,也许你正在用可变参数列表的某些参数破坏堆栈?也许你有关于标准数据类型或枚举常量之一的假设不再适用?这些是你自己的打印功能吗?然后尝试使用gcc的__attribute__扩展来进行编译时类型检查。

+0

我没有试过4.41 4.42但我有4.44 ... – prinzrainer 2010-11-15 06:45:23

1

您声明您将从GCC v3.44(代码工作的地方)到v4.44代码被破坏的地方。

确保程序的所有其他部分(所有源文件和库文件)也使用GCC v4.44编译。你正在调用一个打印函数,所以我猜你指的是glibc中的标准printf函数。所以请确保glibc也是在v4.44下编译的。