1

我有一些代码是用 GCC 编译的。我注意到在编译调试版本时,系统工作得很好。但是当我编译发布版本时,系统没有启动。

在解决这个问题一段时间后,我将问题缩小到一个函数,如果我指定一个较小的优化级别(-O0 而不是 -Os),系统将在发布版本中正常启动。所以大概有一个 -Os 设置的标志导致该特定函数中的代码不起作用。

我计划通过获取 -Os 设置的所有标志并找到导致系统无法启动的标志来追踪潜在问题。

我试图做以下事情:

__attribute__ ((optimize("-fauto-inc-dec", "-fcompare-elim", "-fcprop-registers", "-fdce", "-fdefer-pop", "-fdelayed-branch", "-fdse", "-fguess-branch-probability", "-fif-conversion2", "-fif-conversion", "-fipa-pure-const", "-fipa-profile", "-fipa-reference", "-fmerge-constants", "-fsplit-wide-types", "-ftree-bit-ccp", "-ftree-builtin-call-dce", "-ftree-ccp", "-ftree-ch", "-ftree-copyrename", "-ftree-dce", "-ftree-dominator-opts", "-ftree-dse", "-ftree-forwprop", "-ftree-fre", "-ftree-phiprop", "-ftree-sra", "-ftree-pta", "-ftree-ter", "-funit-at-a-time")))

然后消除标志,直到系统启动。问题是,我一直在缩小范围并缩小范围,直到我发现我什至无法设置一个标志并让系统启动。

所以现在我在想我设置优化的方式有问题。如果我在这些标志中间的某个地方放置了一个多余的不存在的标志,例如 -fiam-fake-flag,编译器会检测到它并吐出一个错误(这起初让我觉得我正确设置了这些标志) .

我不想使用编译指示,因为:

" 在此之后定义的每个函数都好像为该函数指定了属性((optimize("STRING")))。"

我只想要对这一功能进行优化,这样我就可以缩小问题的范围。

那么,我是否错误地设置了这些标志?有没有更好的方法来为一个特定的函数指定一大堆编译器标志?

如果它不在微型计算机上,我可以在 Makefile 中指定我想要的所有标志并将其应用于所有函数,但是这样做会使程序太大而无法放入微型计算机。

4

1 回答 1

1

您的标志是否声明为volatile?尝试发布有问题的功能。– 埃古尔

就是这样。谢谢你,埃格尔。——迈克·吉布森

于 2016-09-05T08:40:26.590 回答