这个问题必须适用于这么少的人......
我正在忙着将我的ARM C项目从Winarm GCC 4.1.2移植到Yagarto GCC 4.3.3。
我没想到会有任何差异,并且使用相同的makefile和.ld文件快乐地编译我的项目。
然而,虽然Winarm版本运行Yagarto版本没有。处理器是Atmel AT91SAM7S。
任何关于在哪里寻找的想法都会受到欢迎。我认为我假设makefile是一个makefile是不正确的,或者Winarm的.ld文件不适用于Yagarto。
由于它们都是GCC工具链,并且可能使用相同的链接器,因此它们必定是兼容的。
TIA
完。
答案 0 :(得分:3)
我同意gcc和其他二进制文件(ld)应该相同或足够接近,以免你注意到差异。但启动代码是你的还是他们的,而C库可以产生很大的不同。在尝试使用相同的源代码和链接器脚本时,足以在成功与失败之间做出区分。现在,如果这是100%的代码,没有库或任何其他文件从WinARM或Yagarto使用,那么这没有多大意义。 3.x.x到4.x.x是的我不得不重新旋转我的链接器脚本,但4.1.x到4.3.x我不记得那里有问题。
答案 1 :(得分:3)
它也可能是编译器行为的一个细微差别:代码生成确实从gcc版本更改为gcc版本,如果您的代码包含与其语义相关的依赖于实现的部分,那么它可能会以这种方式咬你。例如,数据的内存布局可能会发生变化,并且意外依赖它的代码会中断。
看到这种情况发生了很多次。
在编译中尝试使用不同的优化选项,看看是否有所作为。
答案 2 :(得分:2)
WinARM和YAGARTO都基于gcc,应该平等对待ld文件。两者都使用gnu make实用程序 - make文件将以相同的方式处理。您可以比较两个工具链here和here。
如果您使用OCD运行项目,则OpenOCD调试器的实现之间存在差异。发送给调试器以配置它的命令也可能不同。
如果要生成hex文件,那么这可能会有所不同,因为这两个工具链没有使用相同版本的newlib库。
为了安全起见,请确保在两种情况下都是正确的binutils在路径中。
答案 3 :(得分:2)
如果我是你,我会检查编译/链接器标志 - 特别是默认值。不同的工具链通常具有不同的默认ABI或FP约定。它甚至可能使用CPU不支持的指令集扩展进行编译。