3

这个问题一定适用于这么少的人……

我正忙着将我的 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

结束。

4

4 回答 4

3

我同意 gcc 和其他二进制文件 (ld) 应该相同或足够接近,以使您不会注意到差异。但是无论是你的还是他们的,启动代码和 C 库都会产生很大的不同。足以在尝试使用相同的源代码和链接器脚本时区分成功与失败。现在,如果这是 100% 你的代码,没有库或任何其他从 WinARM 或 Yagarto 使用的文件,那么这没有多大意义。3.xx 到 4.xx 是的,我不得不重新旋转我的链接器脚本,但是 4.1.x 到 4.3.x 我不记得那里有问题。

于 2009-05-28T06:06:55.683 回答
3

这也可能是编译器行为的细微差别:代码生成确实从 gcc 版本更改为 gcc 版本,并且如果您的代码包含其语义依赖于实现的片段,那么它很可能会以这种方式咬住您。例如,数据的内存布局可能会发生变化,并且意外依赖它的代码会中断。

看到这种情况发生了很多次。

在编译中尝试使用不同的优化选项,看看是否会有所不同。

于 2009-06-06T19:26:14.697 回答
2

如果我是你,我会检查编译/链接器标志 - 特别是默认值。不同的工具链具有不同的默认 ABI 或 FP 约定是很常见的。它甚至可能使用您的 CPU 不支持的指令集扩展进行编译。

于 2009-05-28T06:15:12.583 回答
2

WinARM 和 YAGARTO 都是基于 gcc 的,应该平等对待 ld 文件。两者都使用 gnu make 实用程序 - make 文件将以相同的方式处理。您可以在此处此处比较两个工具链。

如果您使用 OCD 运行项目,那么 OpenOCD 调试器的实现会有所不同。此外,发送到调试器以对其进行配置的命令也可能不同。

如果您正在生成一个 hex 文件,那么这可能会有所不同,因为两个工具链没有使用相同版本的 newlib 库。

为了安全起见,请确保在这两种情况下,正确的 binutils 都位于路径的首位。

于 2009-05-27T07:53:23.733 回答